Consigli per rifinire queste due classi ...

di il
6 risposte

Consigli per rifinire queste due classi ...

Salve , ho completato degli esercizi per un corso Java che sto seguendo , siamo appena al secondo giorno , e ci avevano assegnato una serie di esercizi , 13 per la precisione ... Vorrei sapere se esiste un modo per abbellire il tutto o magari ridefinirlo per renderlo meno anonimo .... il codice è questo :

Test
public class Test {
	
	
	public static void main(String[] args) {
		
		Esercizi es = new Esercizi();
		es.eseguiEsercizi();
		
	}

}
Esercitazione
import java.util.Scanner;
import java.util.Arrays;

public class Esercizi {
	
	private Scanner input = new Scanner(System.in);
	
	private String[] opzioni = new String[] {
			
			"\nScegli l'esercizio da svolgere\n",
			"1) pariDispari",
			"2) maggioreMinore",
			"3) contaVerticale",
			"4) contaOrizzontale",
			"5) semaforo",
			"6) totalizzatore",
			"7) stampaVettore",
			"8) nominativi",
			"9) ordinamento",
			"10) cercaNelVettore",
			"11) stampaTabellina",
			"12) meteo",
			"13) Esci dal programma\n",
			"Digitare un numero e premere Invio: "
			
	};
	
	public void eseguiEsercizi() {
		
		int scelta;
		char repeatFlag = 'n';
		
		do {
			
			stampaMenu();
			scelta = leggiIntero();
			
			do {
				switch(scelta) {
				
				case 1:
					pariDispari();
				break;
				
				case 2:
					minoreMaggiore();
				break;

				case 3:
					contaVerticale();
				break;
				
				case 4:
					contaOrizzontale();
				break;
				
				case 5:
					semaforo();
				break;
				
				case 6:
					totalizzatore();
				break;
				
				case 7:
					stampaVettore();
				break;

				case 8:
					nominativi();
				break;
				
				case 9:
					ordinamento();
				break;
				
				case 10:
					cercaNelVettore();
				break;
				
				case 11:
					stampaTabellina();
				break;
				
				case 12:
					meteo();
				break;
				
				case 13:
					input.close();
					System.out.println("\n\nProgramma terminato.");
					break;
					
				default:
					System.out.println("\nScelta non valida.");
				}
			
				if (scelta > 0 && scelta < 13) {
					do {
						System.out.print("\n\nRipetere l'esercizio? (S/N): ");
						repeatFlag = input.nextLine().charAt(0);
					}while( repeatFlag != 's' && repeatFlag != 'S' && repeatFlag != 'n' && repeatFlag != 'N');
				}
			}while(repeatFlag != 'n' && repeatFlag != 'N');
			
		} while(scelta != 13);
		
	}
	
	private void stampaMenu() {
		
		int i;
		
		for (i=0; i<opzioni.length-1; i++) {
			System.out.println(opzioni[i]);
		}
		System.out.print(opzioni[i]);
	}
	
	private int leggiIntero() {
		
		int valore = 0;
		boolean flag;
		
		do {
			flag = false;
			try {
				valore = Integer.parseInt(input.nextLine());
			}
			catch(NumberFormatException n){
				System.err.print("\nNon hai inserito un numero. Riprova: ");
				flag = true;
			}
		}while(flag);
		
		return valore;
	} 
	
	private String leggiStringa() {
		
		String stringa = null;

		try {
			stringa = input.nextLine();
		}
		catch(IllegalStateException i){
			System.err.println("\nImpossibile leggere da input: lo scanner non è stato aperto o è stato chiuso anzitempo.");
		}
		
		return stringa;
	} 
	
	private void pariDispari() {
		
		int n;
		char continueFlag; 
		
		do {
			System.out.println("\n\nVerifica se il valore inserito è pari o dispari.");
			System.out.print("Inserisci un numero e premi Invio: ");
			n = leggiIntero();
			
			if ((n&1) == 0) {
				System.out.println("\nIl numero è pari.");
			}
			else {
				System.out.println("\nIl numero è dispari.");
			}
			
			do {
				System.out.print("Continuare? (S/N): ");
				continueFlag = input.nextLine().charAt(0);
			}while( continueFlag != 's' && continueFlag != 'S' && continueFlag != 'n' && continueFlag != 'N');
			
		}while (continueFlag != 'n' && continueFlag != 'N');
		
	}
	
	private void minoreMaggiore() {
		
		int a,b;
		char continueFlag; 
		
		do {
			System.out.println("\n\nVerifica se due valori inseriti sono uguali, altrimenti verifica qual è il maggiore.");
			System.out.print("Inserisci il primo numero e premi Invio: ");
			a = leggiIntero();
			System.out.print("Inserisci il secondo numero e premi Invio: ");
			b = leggiIntero();
			
			if (a>b) {
				System.out.println("\nIl numero maggiore è: " + a);
			}
			else if (a<b) {
				System.out.println("\nIl numero maggiore è: " + b);
			}
			else {
				System.out.println("\nI due numeri sono uguali.");
			}
			
			do {
				System.out.print("Continuare? (S/N): ");
				continueFlag = input.nextLine().charAt(0);
			}while( continueFlag != 's' && continueFlag != 'S' && continueFlag != 'n' && continueFlag != 'N');
			
		}while (continueFlag != 'n' && continueFlag != 'N');
	}
	
	private void contaVerticale() {
		
		int i,v;
		
		System.out.println("\n\nConta fino ad un certo valore e visualizza i numeri in verticale.");
		System.out.print("Inserisci fino a quale numero contare e premi Invio: ");
		v = leggiIntero();
		
		System.out.print("\n");
		for (i=0; i<v+1; i++) {
			System.out.println(i);
		}
		
	}
	
	private void contaOrizzontale() {
		
		int i,v;
		
		System.out.println("\n\nConta fino ad un certo valore e visualizza i numeri in un elenco orizzontale.");
		System.out.print("Inserisci fino a quale numero contare e premi Invio: ");
		v = leggiIntero();
		
		System.out.print("\n");
		for (i=0; i<v; i++) {
			System.out.print(i + ", ");
		}
		System.out.print(i + ".");
		
	}
	
	private void semaforo() {
		
		String colore, messaggio;
		
		System.out.println("\n\nIndica un colore e ricevi un avviso associato.");
		System.out.print("Digita il nome di un colore (rosso, verde o arancione) e premi Invio: ");
		
		colore = leggiStringa().toLowerCase();
		
		System.out.print("\n");
		switch(colore){
			
			case "rosso":
				messaggio = "ALT";
			break;
			
			case "verde":
				messaggio = "VAI";
			break;
			
			case "arancione":
				messaggio = "ATTENZIONE";
			break;
			
			default:
				messaggio = "NON SEI AL SEMAFORO";
		}
		
		System.out.println(messaggio);
		
		
	}
	
	private void totalizzatore() {
		
		char continueFlag; 
		int x=0, n=0;
		
		do {
			System.out.println("\n\nAggiunge numeri finché l'utente vuole e visualizza somma totale e media.");
			System.out.print("Digita un numero e premi Invio: ");
			x += leggiIntero();
			n++;
			
			do {
				System.out.print("Continuare? (S/N): ");
				continueFlag = input.nextLine().charAt(0);
			}while( continueFlag != 's' && continueFlag != 'S' && continueFlag != 'n' && continueFlag != 'N');
			
		}while (continueFlag != 'n' && continueFlag != 'N');
		
		System.out.print("\n\nSomma = " + x + " ; Media = " + (double)x/n);
		
	}
	
	private void stampaVettore() {
		
		char continueFlag;
		int i;
		int[] vett = new int[10];
		
		System.out.println("\n\nCrea un vettore di 10 interi e lo visualizza.\n");
		
		for (i=0; i<vett.length; i++) {
			System.out.print("\nInserisci un valore all'indice " + i + " del vettore: ");
			vett[i] = leggiIntero();
		}
		
		do {
			System.out.print("\nVisualizzare per (r)iga o per (c)olonna? (R/C): ");
			continueFlag = input.nextLine().charAt(0);
		}while( continueFlag != 'r' && continueFlag != 'R' && continueFlag != 'c' && continueFlag != 'C');
		
		if (continueFlag == 'c' || continueFlag == 'C') {
			for (i=0; i<vett.length; i++) {
				System.out.println(vett[i]);
			}
		}
		else {
			for (i=0; i<vett.length-1; i++) {
				System.out.print(vett[i] + ", ");
			}
			System.out.print(vett[i] + ".");
		}
		
	}
	
	private void nominativi() {
		
		int i;
		String[] nomi = new String[10];
		
		System.out.println("\n\nCrea un elenco di 10 nominativi.\n");
		
		for (i=0; i<nomi.length; i++) {
			System.out.print("\nInserisci un nome all'indice " + i + " dell'elenco: ");
			nomi[i] = leggiStringa();
		}
		
		System.out.println("\n\nElenco nominativi:\n\n");
		
		for (i=0; i<nomi.length; i++) {
			System.out.println(i + ") " + nomi[i]);
		}
		
	}
	
	private void ordinamento() {
		
		int i;
		String[] nomi = new String[10];
		
		System.out.println("\n\nCrea un elenco in ordine lessicografico di 10 nominativi.\n");
		
		for (i=0; i<nomi.length; i++) {
			System.out.print("\nInserisci un nome all'indice " + i + " dell'elenco: ");
			nomi[i] = leggiStringa();
		}
		
		System.out.println("\n\nElenco nominativi ordinato:\n\n");
		Arrays.sort(nomi);
		for (i=0; i<nomi.length; i++) {
			System.out.println(i + ") " + nomi[i]);
		}
		
	}
	
	private void cercaNelVettore() {
		
		boolean found=false;
		int i;
		String[] nomi = new String[10];
		String target;
		
		System.out.println("\n\nCrea un elenco di 10 nominativi.\n");
		
		for (i=0; i<nomi.length; i++) {
			System.out.print("\nInserisci un nome all'indice " + i + " dell'elenco: ");
			nomi[i] = leggiStringa();
		}
		
		System.out.print("\n\nDigita un nominativo da cercare: ");
		target = leggiStringa();
		
		i=0;
		while (i < nomi.length && !found) {
			
			if (nomi[i].equals(target)) {
				found = true;
				System.out.println("\n\nTrovato " + target + " all'indice " + i + " dell'elenco.");
			}
			else {
				i++;
				if (i==nomi.length)
					System.out.println("\n\nNominativo non trovato.");
			}
		}
		
	}
	
	private void stampaTabellina() {
		
		int i,j;
		
		System.out.println("\n\nStampa di una tavola pitagorica.\n");
		
		for (j=0; j<11; j++) {
			
			for(i=0; i<11; i++) {
				System.out.print(i*j + " ");
			}
			System.out.print("\n");
		}
		
	}
	
	private void meteo() {
		
		int i,j;
		double[][] meteoTab = new double[7][4];
		String[] days = new String[]{"Lunedì","Martedì","Mercoledì","Giovedì","Venerdì", "Sabato", "Domenica"};
		String[] intervals = new String[]{"00:00-06:00","06:00-12:00","12:00-18:00","18:00-24:00"};
		
		System.out.println("Crea una matrice con le temperature di tutti i giorni della settimana, rilevate ogni 6 ore.");
		System.out.print("\n");
		
		for (j=0; j<7; j++) {
			for (i=0; i<4; i++){
				meteoTab [j][i] = (Math.random()*100)%40;
			}
		}
		
		for (j=0; j<7; j++) {
			System.out.print(days[j] + ": ");
			for (i=0; i<4; i++){
				System.out.print( "(" + intervals[i] + ") " + String.format("%.1f", meteoTab[j][i]) + " °C  ");
			}
			System.out.print("\n");
		}
		
	}
	
} 
Ovviamente ci sono i rispettivi package che non ho copiato ... sono alle prime con Java avendo fatto principalmente , sempre , C++ .... Ad Ingegneria Informatica si fa poco di coding e quindi sto cercando di imparare il più possibile dal corso e da una guida cartacea di De Sio Cesari .... a quanto ho capito Java 'obbliga' a programmare ad oggetti , mentre C++ ti permette di scegliere anche un approccio funzionale

6 Risposte

  • Re: Consigli per rifinire queste due classi ...

    Il modo per abbellire potrebbe essere l'uso della grafica, quindi creare un frame con i vari controlli che ti possono essere utili, combo, textfield, pulsanti ecc... ma per un esercizio del genere non credo valga la pena.
  • Re: Consigli per rifinire queste due classi ...

    patel ha scritto:


    Il modo per abbellire potrebbe essere l'uso della grafica, quindi creare un frame con i vari controlli che ti possono essere utili, combo, textfield, pulsanti ecc... ma per un esercizio del genere non credo valga la pena.
    il dubbio era proprio quello ... se valesse la pena Grazie per la risposta comunque Se posso , vorrei chiedere una buona guida per approfondire anche a casa ciò che stiamo facendo al corso . Purtroppo il docente è un pò confusionario e le cose le fa troppo spedite anche se è un corso che parte , o dovrebbe , quasi da 0 ( per fortuna ho delle basi di C++ ma altri partono proprio da zero assoluto e non stanno capendo niente ) . per dire : oggi abbiamo dovuto implementare una classe DAO senza sapere cosa sia ( so che sono i Data Access Object) ma non come si fanno anche perchè , da quanto ho capito , bisognerebbe collegarlo a un database. Con quella di De Sio non mi trovo proprio benissimo , anche perchè è quella che presi all'epoca di Java 8 e alcune cose sono diventate obsolete . Grazie
  • Re: Consigli per rifinire queste due classi ...

    Io ho trovato molto completo "Java 9 - Guida allo sviluppo in ambienti Windows, macOS e GNU/Linux" di Pellegrino Principe. Non per novizi, molto esaustivo e con tutti gli esempi che funzionano (il che non e' sempre cosi' per altri testi).
  • Re: Consigli per rifinire queste due classi ...

    Ma per abbellire lo stile di scritture o se esiste un modo migliore di scrivere?

    Se sei all'inizio va bene così, se no potresti usare un command pattern, in questa maniera sai che se dovrai aggiungere un nuovo esercizio non dovrai riscrivere la funzione di switch e altre cose, ma basta integrare una classe command relativa al comando da eseguire.

    In progetti complessi è indispensabile, sopratutto per il riuso del codice.
    Anche il fatto che hai scritto tutte le funzioni nella stessa classe... non è sbagliato, ma siccome è programmazione ad oggetti ed ogni funzione esegue qualcosa di diverso, perchè non suddividerle il classi differenti? Tanti oggetti quante operazioni da eseguire, poi in base alla scelta esegui una delle classi definendo l'oggetto.
  • Re: Consigli per rifinire queste due classi ...

    MarkRider ha scritto:


    Ma per abbellire lo stile di scritture o se esiste un modo migliore di scrivere?

    Se sei all'inizio va bene così, se no potresti usare un command pattern, in questa maniera sai che se dovrai aggiungere un nuovo esercizio non dovrai riscrivere la funzione di switch e altre cose, ma basta integrare una classe command relativa al comando da eseguire.

    In progetti complessi è indispensabile, sopratutto per il riuso del codice.
    Anche il fatto che hai scritto tutte le funzioni nella stessa classe... non è sbagliato, ma siccome è programmazione ad oggetti ed ogni funzione esegue qualcosa di diverso, perchè non suddividerle il classi differenti? Tanti oggetti quante operazioni da eseguire, poi in base alla scelta esegui una delle classi definendo l'oggetto.
    grazie si poi alla fine le ho suddivise , un pò come facevo in C++ ( header, file di implementazione e main per dire ) . Mi devo solo abituare alla sintassi XD
  • Re: Consigli per rifinire queste due classi ...

    morellik ha scritto:


    Io ho trovato molto completo "Java 9 - Guida allo sviluppo in ambienti Windows, macOS e GNU/Linux" di Pellegrino Principe. Non per novizi, molto esaustivo e con tutti gli esempi che funzionano (il che non e' sempre cosi' per altri testi).
    Per ora sto leggendo quella di HTML ... come detto sono all'inizio di un corso che durerà un mese , e un libro già avanzato sarebbe inutile XD Grazie del consiglio comunque
Devi accedere o registrarti per scrivere nel forum
6 risposte