Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110

    Array pianificazione appuntamenti

    Ciao, avrei da svolgere questo esercizio:

    Scrivere un programma che permetta agli studenti di pianificare appuntamenti per le ore 13,14,15,16,17 o 18. Si utilizzi un array di sei stringhe per memorizzare le descrizioni degli appuntamenti associati ai sei orari. Scrivere un ciclo che si ripete finché l'array ha ancora spazio libero. In un blocco try, chiedere all'utente di inserire un'ora e una descrizione. Se l'ora specificata è libera, inserire la descrizione nell'array. In caso contrario, lanciare un'eccezione OraOccupataException. Se, invece, l'ora specificata non è nell'intervallo 13-18, lanciare un'eccezione OraNonContemplataException.
    Usare un blocco catch per ogni tipo di eccezione.
    Allora, prima di passare a settare il codice con le eccezioni, sto creando quello base ipotizzando nessun errore.
    In primis volevo sapere se la logica che ho adottato è giusta o se ci sarebbe qualche algoritmo più performante per indicizzare l'array, per il check "disponibilità ora" e al posto dello switch. Non so poi come settare il ciclo facendomi restituire una condizione d'uscita valida. Scrivere nel System.out.println("Digitare 0 per le ore 13, 1 per le ore 14, etc etc" per poter così lavorare con i giusti indici è da evitare?

    Altra cosa, non so come mai ma nello switch se metto "descrizione.next()" mi legge la parola che digito mentre se metto "descrizione.nextLine()" il programma si chiude senza darmi possibilità di inserire input.
    Grazie

    codice:
    package eccezioni;
    
    
    import java.util.Scanner;
    
    
    public class PianificareAppuntamenti {
    
    
    	
    	
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    
    
    		String[] fasciaoraria = new String[6];
    		String descrizione="";
    		Scanner tastiera = new Scanner(System.in);
    		
    		//inizializzo l'array
    		for(int i=0;i<fasciaoraria.length;i++){
    			fasciaoraria[i]="vuota";
    		}
    		
    		
    		while(true){
    			System.out.println("A che ora vorresti fissare l'appuntamento? Ore 13, 14, 15, 16, 17 o 18?");
    			int orario = tastiera.nextInt();
    					
    			switch(orario){
    			case 13:
    				if(fasciaoraria[0].equals("vuota")){
    					System.out.println("Orario disponibile! Aggiungere descrizione: ");
    					descrizione = tastiera.nextLine();
    					fasciaoraria[0]=descrizione;
    					break;
    					
    				}
    				else{
    					System.out.println("Ora occupata! Sceglierne un'altra");
    					}
    			}
    		}		
    	}
    
    
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Allora, prima di passare a settare il codice con le eccezioni, sto creando quello base ipotizzando nessun errore.
    In primis volevo sapere se la logica che ho adottato è giusta o se ci sarebbe qualche algoritmo più performante per indicizzare l'array, per il check "disponibilità ora" e al posto dello switch. Non so poi come settare il ciclo facendomi restituire una condizione d'uscita valida. Scrivere nel System.out.println("Digitare 0 per le ore 13, 1 per le ore 14, etc etc" per poter così lavorare con i giusti indici è da evitare?
    Innanzitutto potresti sfruttare il null (che è pure il valore di default degli elementi nell'array String[]) per indicare che è "vuoto".

    Sulle eccezioni, a dire il vero, dovresti considerarle fin da subito. Per evitare di scrivere codice lungo e contorto, dovresti separare le cose in più metodi. Visto che di Scanner agganciato a System.in ne devi avere solo UNO, dovresti tenerlo da qualche parte in modo che sia riutilizzabile. NON pensare ad un campo "static". Sarebbe meglio sfruttare una istanza di PianificareAppuntamenti, mantenendo Scanner, l'array ed eventualmente altro come "stato" dell'oggetto.
    Quindi dovresti cambiare radicalmente approccio e per ottime ragioni.

    Riguardo il come associare le ore agli indici, ci sono varie soluzioni, anche più "object oriented" di quello che hai fatto finora. Come ad esempio definire una classe Appuntamento che modella solo l'appuntamento (niente input qui dentro!) con l'ora e la descrizione. L'ora chiaramente sarebbe già presente fin dall'inizio negli oggetti. E poi chiaramente avere un array Appuntamento[] .

    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Altra cosa, non so come mai ma nello switch se metto "descrizione.next()" mi legge la parola che digito mentre se metto "descrizione.nextLine()" il programma si chiude senza darmi possibilità di inserire input.
    Questo per via del solito "annoso" mix di nextLine con gli altri nextXXX (es. nextInt). Se ad un nextInt l'utente digita 123<invio>, il nextInt restituisce 123 ma il newline resta ancora in Scanner e sarà usato come delimitatore per la prossima lettura. NON viene buttato via subito.
    Ma se appena dopo fai un nextLine(), esso "vede" una riga vuota e questo è il motivo di quel comportamento. Che NON è un "baco" di Scanner, funziona così e basta.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Innanzitutto potresti sfruttare il null (che è pure il valore di default degli elementi nell'array String[]) per indicare che è "vuoto".

    Sulle eccezioni, a dire il vero, dovresti considerarle fin da subito. Per evitare di scrivere codice lungo e contorto, dovresti separare le cose in più metodi. Visto che di Scanner agganciato a System.in ne devi avere solo UNO, dovresti tenerlo da qualche parte in modo che sia riutilizzabile. NON pensare ad un campo "static". Sarebbe meglio sfruttare una istanza di PianificareAppuntamenti, mantenendo Scanner, l'array ed eventualmente altro come "stato" dell'oggetto.
    Quindi dovresti cambiare radicalmente approccio e per ottime ragioni.
    ok, ci provo...

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Riguardo il come associare le ore agli indici, ci sono varie soluzioni, anche più "object oriented" di quello che hai fatto finora. Come ad esempio definire una classe Appuntamento che modella solo l'appuntamento (niente input qui dentro!) con l'ora e la descrizione. L'ora chiaramente sarebbe già presente fin dall'inizio negli oggetti. E poi chiaramente avere un array Appuntamento[] .
    Ok, sto creando la classe Appuntamento in questo modo:

    codice:
    package eccezioni;
    
    
    public class Appuntamento {
    	private int ora;
    	private String descrizione;
    	private String agendaoraria[] = new String[6];
    	
    	public Appuntamento(){
    	ora=0;
    	descrizione=null;
    	}
    	
    	public void resetAgenda(){
    		for(int i=0;i<agendaoraria.length;i++){
    			agendaoraria[i]=null;
    		}
    	}
    	
    	public int setAppuntamento(int orario, String commento){
    
    
    		
    	}
    }
    ma come associo l'int orario che ricevo in setAppuntamento e l'indice dell'array per controllare che lo slot sia pieno o meno?

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Questo per via del solito "annoso" mix di nextLine con gli altri nextXXX (es. nextInt). Se ad un nextInt l'utente digita 123<invio>, il nextInt restituisce 123 ma il newline resta ancora in Scanner e sarà usato come delimitatore per la prossima lettura. NON viene buttato via subito.
    Ma se appena dopo fai un nextLine(), esso "vede" una riga vuota e questo è il motivo di quel comportamento. Che NON è un "baco" di Scanner, funziona così e basta.
    Capito, ma come posso ovviare al problema?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Ok, sto creando la classe Appuntamento in questo modo:
    No, io dicevo: classe Appuntamento con solo una ora e una descrizione, solo 2 campi.

    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Capito, ma come posso ovviare al problema?
    O eviti il mix (fai sempre nextLine e converti ciò che serve non String) oppure presti attenzione e butti via una riga dopo un nextInt (bruttino).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    110
    Classe Appuntamento con solo ora e descrizione
    Classe PianificareAppuntamenti con metodi get & set
    Classe AppuntamentiDemo con main

    Così va bene?
    Resta il problema dell'associare l'orario con l'indice dell'array... lo switch può andare? Non ho idea altrimenti...
    E poi che condizione metto per ricreare un ciclo qualora l'array è pieno e parte l'eccezione?
    Ultima modifica di Sevenis; 04-01-2017 a 17:34

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Classe Appuntamento con solo ora e descrizione
    Ok

    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Classe PianificareAppuntamenti con metodi get & set
    Alt, se intendi una classe che HA l'array Appuntamento[] di 6 elementi e offre i metodi per operare su di esso, es. ricerca di un appuntamento, ecc... allora sì.
    Se no, chiarisci perché altrimenti può non avere senso e/o utilità.

    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Classe AppuntamentiDemo con main
    Ok

    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    Resta il problema dell'associare l'orario con l'indice dell'array... lo switch può andare? Non ho idea altrimenti...
    Basta creare l'array Appuntamento[] di 6 elementi e poi creare espressamente 6 oggetti Appuntamento (che assegnerai agli elementi dell'array, ovviamente), ciascuno con la sua ora ma inizialmente senza descrizione.
    A quel punto diventa banale: a) verificare se un orario richiesto dall'utente "esiste" tra questi appuntamenti e b) verificare se ha descrizione o no (null).
    Nessun (maxi) switch, nessuna logica strana ... al massimo una banale ricerca lineare con un for (in PianificareAppuntamenti se la fai come ho detto prima).

    Quote Originariamente inviata da Sevenis Visualizza il messaggio
    E poi che condizione metto per ricreare un ciclo qualora l'array è pieno e parte l'eccezione?
    Questo è da vedere, nel senso che dipende da come strutturi la logica di input in AppuntamentiDemo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.