En aquest tema, aprendrem a desenvolupar una aplicació de consola en Java. Les aplicacions de consola són programes que s'executen en una interfície de línia de comandes (CLI) i interactuen amb l'usuari a través de text. Aquest tipus d'aplicacions són ideals per a tasques automatitzades, scripts i eines de desenvolupament.
Objectius del Tema
- Comprendre els conceptes bàsics d'una aplicació de consola.
- Aprendre a llegir i escriure dades a la consola.
- Desenvolupar una aplicació de consola completa amb funcionalitats bàsiques.
Conceptes Bàsics
- Entrada i Sortida de la Consola
Per interactuar amb l'usuari a través de la consola, utilitzarem les classes Scanner per a la lectura d'entrada i System.out per a la sortida.
Lectura d'Entrada
import java.util.Scanner;
public class EntradaConsola {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Introdueix el teu nom: ");
String nom = scanner.nextLine();
System.out.println("Hola, " + nom + "!");
}
}Explicació:
Scanner scanner = new Scanner(System.in);: Crea un objecteScannerper llegir l'entrada de la consola.scanner.nextLine();: Llegeix una línia de text de la consola.System.out.println("Hola, " + nom + "!");: Mostra un missatge a la consola.
Sortida de Dades
public class SortidaConsola {
public static void main(String[] args) {
System.out.println("Aquest és un missatge de sortida.");
}
}Explicació:
System.out.println("Aquest és un missatge de sortida.");: Mostra un missatge a la consola.
Desenvolupament d'una Aplicació de Consola Completa
- Definició del Problema
Desenvoluparem una aplicació de consola que gestioni una llista de tasques. L'usuari podrà afegir, eliminar i veure les tasques.
- Estructura del Programa
El programa tindrà les següents funcionalitats:
- Mostrar el menú principal.
- Afegir una tasca.
- Eliminar una tasca.
- Veure totes les tasques.
- Sortir del programa.
- Implementació
Classe Principal
import java.util.ArrayList;
import java.util.Scanner;
public class GestorTasques {
private static ArrayList<String> tasques = new ArrayList<>();
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
boolean sortir = false;
while (!sortir) {
mostrarMenu();
int opcio = scanner.nextInt();
scanner.nextLine(); // Consumir la nova línia
switch (opcio) {
case 1:
afegirTasca();
break;
case 2:
eliminarTasca();
break;
case 3:
veureTasques();
break;
case 4:
sortir = true;
break;
default:
System.out.println("Opció no vàlida. Si us plau, tria una altra opció.");
}
}
}
private static void mostrarMenu() {
System.out.println("\nGestor de Tasques");
System.out.println("1. Afegir Tasca");
System.out.println("2. Eliminar Tasca");
System.out.println("3. Veure Tasques");
System.out.println("4. Sortir");
System.out.print("Tria una opció: ");
}
private static void afegirTasca() {
System.out.print("Introdueix la tasca: ");
String tasca = scanner.nextLine();
tasques.add(tasca);
System.out.println("Tasca afegida.");
}
private static void eliminarTasca() {
System.out.print("Introdueix el número de la tasca a eliminar: ");
int index = scanner.nextInt();
scanner.nextLine(); // Consumir la nova línia
if (index >= 0 && index < tasques.size()) {
tasques.remove(index);
System.out.println("Tasca eliminada.");
} else {
System.out.println("Número de tasca no vàlid.");
}
}
private static void veureTasques() {
System.out.println("\nLlista de Tasques:");
for (int i = 0; i < tasques.size(); i++) {
System.out.println(i + ". " + tasques.get(i));
}
}
}Explicació:
ArrayList<String> tasques: Emmagatzema la llista de tasques.Scanner scanner: Llegeix l'entrada de l'usuari.mostrarMenu(): Mostra el menú principal.afegirTasca(): Afegeix una nova tasca a la llista.eliminarTasca(): Elimina una tasca de la llista.veureTasques(): Mostra totes les tasques.
Exercicis Pràctics
Exercici 1: Afegir Validació
Modifica el programa per validar que l'usuari introdueixi un número vàlid quan elimina una tasca.
Exercici 2: Afegir Funcionalitat de Modificació
Afegeix una nova opció al menú per permetre a l'usuari modificar una tasca existent.
Exercici 3: Guardar i Carregar Tasques
Modifica el programa per guardar les tasques en un fitxer i carregar-les quan el programa s'inicia.
Solucions
Solució a l'Exercici 1
private static void eliminarTasca() {
System.out.print("Introdueix el número de la tasca a eliminar: ");
int index = scanner.nextInt();
scanner.nextLine(); // Consumir la nova línia
if (index >= 0 && index < tasques.size()) {
tasques.remove(index);
System.out.println("Tasca eliminada.");
} else {
System.out.println("Número de tasca no vàlid.");
}
}Solució a l'Exercici 2
private static void modificarTasca() {
System.out.print("Introdueix el número de la tasca a modificar: ");
int index = scanner.nextInt();
scanner.nextLine(); // Consumir la nova línia
if (index >= 0 && index < tasques.size()) {
System.out.print("Introdueix la nova tasca: ");
String novaTasca = scanner.nextLine();
tasques.set(index, novaTasca);
System.out.println("Tasca modificada.");
} else {
System.out.println("Número de tasca no vàlid.");
}
}Afegeix aquesta opció al menú:
Solució a l'Exercici 3
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
public class GestorTasques {
private static ArrayList<String> tasques = new ArrayList<>();
private static Scanner scanner = new Scanner(System.in);
private static final String FITXER_TASQUES = "tasques.txt";
public static void main(String[] args) {
carregarTasques();
boolean sortir = false;
while (!sortir) {
mostrarMenu();
int opcio = scanner.nextInt();
scanner.nextLine(); // Consumir la nova línia
switch (opcio) {
case 1:
afegirTasca();
break;
case 2:
eliminarTasca();
break;
case 3:
veureTasques();
break;
case 4:
sortir = true;
guardarTasques();
break;
default:
System.out.println("Opció no vàlida. Si us plau, tria una altra opció.");
}
}
}
private static void mostrarMenu() {
System.out.println("\nGestor de Tasques");
System.out.println("1. Afegir Tasca");
System.out.println("2. Eliminar Tasca");
System.out.println("3. Veure Tasques");
System.out.println("4. Sortir");
System.out.print("Tria una opció: ");
}
private static void afegirTasca() {
System.out.print("Introdueix la tasca: ");
String tasca = scanner.nextLine();
tasques.add(tasca);
System.out.println("Tasca afegida.");
}
private static void eliminarTasca() {
System.out.print("Introdueix el número de la tasca a eliminar: ");
int index = scanner.nextInt();
scanner.nextLine(); // Consumir la nova línia
if (index >= 0 && index < tasques.size()) {
tasques.remove(index);
System.out.println("Tasca eliminada.");
} else {
System.out.println("Número de tasca no vàlid.");
}
}
private static void veureTasques() {
System.out.println("\nLlista de Tasques:");
for (int i = 0; i < tasques.size(); i++) {
System.out.println(i + ". " + tasques.get(i));
}
}
private static void guardarTasques() {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(FITXER_TASQUES))) {
for (String tasca : tasques) {
writer.write(tasca);
writer.newLine();
}
} catch (IOException e) {
System.out.println("Error en guardar les tasques: " + e.getMessage());
}
}
private static void carregarTasques() {
try (BufferedReader reader = new BufferedReader(new FileReader(FITXER_TASQUES))) {
String tasca;
while ((tasca = reader.readLine()) != null) {
tasques.add(tasca);
}
} catch (IOException e) {
System.out.println("Error en carregar les tasques: " + e.getMessage());
}
}
}Conclusió
En aquest tema, hem après a desenvolupar una aplicació de consola en Java. Hem cobert els conceptes bàsics d'entrada i sortida de la consola, i hem implementat una aplicació completa per gestionar una llista de tasques. A més, hem proporcionat exercicis pràctics per reforçar els conceptes apresos i hem ofert solucions detallades per a cada exercici. Amb aquests coneixements, estàs preparat per crear les teves pròpies aplicacions de consola en Java.
Curs de Programació en Java
Mòdul 1: Introducció a Java
- Introducció a Java
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
- Operadors
Mòdul 2: Flux de Control
Mòdul 3: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Mètodes
- Constructors
- Herència
- Polimorfisme
- Encapsulació
- Abstracció
Mòdul 4: Programació Orientada a Objectes Avançada
Mòdul 5: Estructures de Dades i Col·leccions
Mòdul 6: Gestió d'Excepcions
Mòdul 7: Entrada/Sortida de Fitxers
- Lectura de Fitxers
- Escriptura de Fitxers
- Fluxos de Fitxers
- BufferedReader i BufferedWriter
- Serialització
Mòdul 8: Multithreading i Concurrència
- Introducció al Multithreading
- Creació de Fils
- Cicle de Vida dels Fils
- Sincronització
- Utilitats de Concurrència
Mòdul 9: Xarxes
- Introducció a les Xarxes
- Sockets
- ServerSocket
- DatagramSocket i DatagramPacket
- URL i HttpURLConnection
