[Risolto]È possibile inserire un metodo in uno switch?

di il
26 risposte

[Risolto]È possibile inserire un metodo in uno switch?

Salve gente, sto cercando di inserire un metodo dentro a uno switch. Eclipse mi dice che non si può fare e non capisco perché.
In poche parole voglio che il programma non permetta di stampare male una data tipo 38/01/2017

public class Mesi {
	private int giorno;
	private int mese;
	private int anno;

	public void restituisciData(int giorno, int mese, int anno){
		this.setGiorno(giorno);
		this.setMese(mese);
		this.setAnno(anno);
	}

		
	public int getGiorno() {
		return giorno;
	}
	
	public int getMese() {
		return mese;
	}

	public int getAnno() {
		return anno;
	}

	
	public void setMese(int mese) {
		if (mese < 13){											
		this.mese = mese;
		}//fine if
		else{
			System.out.println("Insert a valid number");		
			}//fine else
		
		switch(mese){
		case 1:
			public void setGiorno(int giorno) {
				if (giorno < 32){
				this.giorno = giorno;
				}//fine if
				else{
					System.out.println("Insert a valid number");
					}//fine else
			}				

		
	}//fine set mese

	
	public void setAnno(int anno) {
		this.anno = anno;
	}
Come faccio a controllare che non venga inserita una data errata?

26 Risposte

  • Re: [Risolto]È possibile inserire un metodo in uno switch?

    Sbaglio o stai dichiarando il metodo setGiorno all'interni delmetodo setMese?
  • Re: [Risolto]È possibile inserire un metodo in uno switch?

    Uops! È vero!

    Quindi dovrei fare cosi:
    public void setMese(int mese) {
    		if (mese < 13){											
    		this.mese = mese;
    		}										//fine if
    		else{
    			System.out.println("Insert a valid number");		
    			}									//fine else
    		
    			}									//fine setMese
    	
    		
    		switch(this.mese){
    		case 1:
    			public void setGiorno(int giorno) {
    				if (giorno < 32) {
    				this.giorno = giorno;
    				}														//fine if
    				else{
    					System.out.println("Insert a valid number");
    					}													//fine else
    								
    		break;
    		case 2:
    		public void setGiorno(int giorno) {
    				if (giorno < 29){
    				this.giorno = giorno;
    				}														//fine if
    				else{
    					System.out.println("Insert a valid number");
    					}													//fine else
    			break;
    			}
    			
  • Re: [Risolto]È possibile inserire un metodo in uno switch?

    Ma no. Il metodo setGiorno lo devi dichiarare nella classe, e lo switch non può stare lì, nel mezzo della classe. Hai le idee un po' confuse su come funzionano i metodi e le classi, e su cosa puoi metterci dentro. Io ti consiglio di creare i metodi setter distintamente, e poi unirli attraverso variabili di classe o altri metodi per farli lavorare insieme e darti una data valida alla fine. Inoltre non capisco perché la classe l'hai chiamata Mesi, poi ci sono vari errori perché se inserisco un mese minore di 13 va automaticamente a settarlo come giusto, ma anche -3 è minore di 13, eppure non è giusto. Inoltre ci sono da tenere conto gli anni bisestili e alcuni anni "falsi bisestili", io ho scritto una classe Data per un programma del calendario perpetuo, che controlla se una data è valida e poi calcola il giorno della settimana, ma ho usato metodi, funzioni e variabili distinti che "collaborano", però è in C++.
    I metodi che scrivi devi dichiararli una volta sola e devono funzionare grazie alle variabili in input e i membri della classe, non puoi dichiarare due metodi uguali ma diversi all'interno, in base al mese. Al massimo dichiari setGiorno e all'interno ci metti lo switch del mese
  • Re: [Risolto]È possibile inserire un metodo in uno switch?

    Si, sono consapevole del fatto di non avere alcune idee chiare. Considera che non ho mai programmato in vita mia e da un annetto ho deciso di voler imparare a programmare.

    Hai ragione dovrei mettere un if(mese >0 && mese < 13) per non incappare in errori.


    Saresti così gentile da scrivermi l'esempio di gennaio?
  • Re: [Risolto]È possibile inserire un metodo in uno switch?

    Beh purtroppo Non in java. Conosco solo C++, e visto che sono simili riesco a comprendere una parte anche di java. Semplicemente definisci il metodo setGiorno(int giorno) e all'interno ci metti uno switch che prende la variabile di classe privata mese e poi dichiari un int max all'interno del metodo setGiorno, e nello switch ci scrivi che nel caso in cui mese è 1, allora max=31, se mese 2, qui metti un altro switch o un if che controlla se l'anno è bisestile, e in base a questo mette max=28 o 29, e alla fine del primo switch, cioè dopo essere arrivato a case 12, fai un ciclo che prende in input un numero e finché questo è minore di 1 o maggiore di max lo richiedi. In questo modo hai il giorno giusto. Questo intendevo con "usare variabili e metodi che collaborino", usa la variabile mese all'interno di setGiorno per definire un'altra variabile max che ti serve nel ciclo in cui prendi un numero in input. Do per scontato che tu sappia come trivare gli anni Bisestili o i falsi bisestili...altrimenti non esitare a chiedere.
    Giusto per curiosità, a cosa ti serve la classe Mesi?
  • Re: [Risolto]È possibile inserire un metodo in uno switch?

    federico992 ha scritto:


    Hai ragione dovrei mettere un if(mese >0 && mese < 13) per non incappare in errori.
    Innanzitutto un metodo "setter" non dovrebbe stampare qualcosa per dire che un valore non va. Se un parametro non è valido, sarebbe più sensato lanciare fuori una eccezione, tipo IllegalArgumentException.

    Poi comunque setMese non è difficile: il mese deve essere compreso tra 1 e 12, basta un semplice if.
    Il setGiorno invece è più complicato, se si considera (come è giusto che sia) anche la questione degli anni bisestili. Oltre al fatto che il massimo giorno del mese, dipende anche dal mese.
  • Re: [Risolto]È possibile inserire un metodo in uno switch?

    Dopo provo a fare come hai detto.

    Prima volevo fare una classe per ogni variabile: giorno, mese, anno.
    Poi ho capito che era una perdita di tempo anche per un banale esercizio.
    Alla fine ne ho tenuta solo una di quelle e ne ho creato una Main per richiamare i metodi.

    per andbin:
    Non conoscevo quel sistema, per me era "d'obbligo" specificarlo manualmente che non era stato inserito un parametro valido.
  • Re: [Risolto]È possibile inserire un metodo in uno switch?

    federico992 ha scritto:


    Prima volevo fare una classe per ogni variabile: giorno, mese, anno.
    Poi ho capito che era una perdita di tempo anche per un banale esercizio.
    No, non ha senso. Non per la "perdita di tempo" in sé ma perché NON sono dati completamente indipendenti tra di loro!!
  • Re: [Risolto]È possibile inserire un metodo in uno switch?

    andbin ha scritto:


    federico992 ha scritto:


    Prima volevo fare una classe per ogni variabile: giorno, mese, anno.
    Poi ho capito che era una perdita di tempo anche per un banale esercizio.
    No, non ha senso. Non per la "perdita di tempo" in sé ma perché NON sono dati completamente indipendenti tra di loro!!
    Si infatti ho abbandonato subito l'idea.
  • Re: [Risolto]È possibile inserire un metodo in uno switch?

    Ho risolto

    Ora devo solo controllare gli anni bisestili. Però ho capito l'errore, grazie ragazzi!!

    Ho dovuto modificare anche l'ordine di assegnazione nel costruttore, altrimenti mi restituiva sempre 0
    public class Data {
    	private int giorno;
    	private int mese;
    	private int anno;
    
    	public void restituisciData(int giorno, int mese, int anno){
    		this.setAnno(anno);
    		this.setMese(mese);
    		this.setGiorno(giorno);
    	}
    
    		
    	public int getGiorno() {
    		return giorno;
    	}
    	
    	public int getMese() {
    		return mese;
    	}
    
    	public int getAnno() {
    		return anno;
    	}
    
    	
    	
    	public void setGiorno(int giorno) {
    	switch (this.mese){
    	case 1:
    		if (giorno<32 && giorno>0){
    			this.giorno=giorno;
    			}
    		break;
    	case 2:
    		if (giorno<29 && giorno>0){
    			this.giorno = giorno;
    		}
    		break;
    	case 3:
    	if (giorno<32 && giorno>0){
    		this.giorno=giorno;
    	}
    	break;
    	case 4:
    		if (giorno<31 && giorno>0){
    			this.giorno=giorno;
    		}
    		break;
    	case 5:
    		if (giorno<32 && giorno>0){
    			this.giorno=giorno;
    		}
    	break;
    	case 6:
    		if (giorno<31 && giorno>0){
    			this.giorno=giorno;
    		}
    	break;
    	case 7:
    		if (giorno<32 && giorno>0){
    			this.giorno=giorno;
    		}
    	break;
    	case 8:
    		if (giorno<32 && giorno>0){
    			this.giorno=giorno;
    		}
    	break;
    	case 9:
    		if (giorno<31 && giorno>0){
    			this.giorno=giorno;
    		}
    	break;
    	case 10:
    		if (giorno<32 && giorno>0){
    			this.giorno=giorno;
    		}
    	break;
    	case 11:
    		if (giorno<31 && giorno>0){
    			this.giorno=giorno;
    		}
    	break;
    	case 12:
    		if (giorno<32 && giorno>0){
    			this.giorno=giorno;
    		}
    	break;
    	
    	}
    	}
    	
    	public void setMese(int mese) {
    		if (mese < 13 && mese >0){											
    		this.mese = mese;
    		}														//fine if
    		else{
    			System.out.println("Insert a valid number");		//fine else
    			}
    		
    			}	//fine set mese
    		
    
    
    	
    	public void setAnno(int anno) {
    		this.anno = anno;
    	}
    
    
    
    }//fine classe
    
  • Re: [Risolto]È possibile inserire un metodo in uno switch?

    federico992 ha scritto:


    Ora devo solo controllare gli anni bisestili. Però ho capito l'errore, grazie ragazzi!!
    Non per sminuire o "offendere" la tua soluzione ma .... un maxi switch del genere e con una evidente replicazione del codice non va affatto bene.
    In questi casi come per il numero dei giorni nei mesi, si usa tipicamente un array interno alla classe:
    public class Data {
        private static final int[] giorniMesi = { 31, 28, 31,  ....ecc....., 30, 31 };
    
        .......
    E poi si sfrutta mese-1 per indirizzare in questo array. Il fatto del bisestile è solo un caso particolare in più per Febbraio.

    federico992 ha scritto:


    Ho dovuto modificare anche l'ordine di assegnazione nel costruttore, altrimenti mi restituiva sempre 0
    Scusa ... di quale costruttore parli? La tua classe NON ha un costruttore esplicito.
  • Re: [Risolto]È possibile inserire un metodo in uno switch?

    Scusa ... di quale costruttore parli? La tua classe NON ha un costruttore esplicito.
    Non so manco io perché ho scritto costruttore, intendevo il metodo restituisciData.


    Si ho pensato agli Array, ma ancora non sono cosi pratico. Ora mi metto a farlo usando gli Array.

    Prima devo capire meglio come si usano nel codice!
  • Re: [Risolto]È possibile inserire un metodo in uno switch?

    Max=array[mese-1]
  • Re: [Risolto]È possibile inserire un metodo in uno switch?

    ANDPRI ha scritto:


    Max=array[mese-1]
    Non li so manco istanziare ancora
Devi accedere o registrarti per scrivere nel forum
26 risposte