Errore istruzione continue

di il
10 risposte

Errore istruzione continue

Salve a tutti , ho creato una funzione che mi permette di fare dei check sui giorni , mesi e anni che l'utente inserisce.

Ho fatto i vari casi :
1) se l'anno è bisestile o meno
2)Se il mese selezionato dall'utente ha 30 ,31 ,29 o 28 giorni ecc.


L'unica cosa che vorrei è utilizzare la funzione continue , cosi che ogni volta che l'utente digita un numero e gli esce l'errore " hai inserito un giorno sbagliato" gli fa inserire nuovamente il giorno. Se provo a scrivere continue; mi esce l'errore continue statement not within a loop
continue;

Dove va utilizzata? per esempio questo è una parte di codice


if ((mese==4 || mese==6 || mese ==9 || mese==11) && (giorno>=1 && giorno<=30))
								lista->book.date.day=giorno;
							
							else if ((mese==1 || mese==3 || mese==5 || mese==7 || mese==8 || mese == 10 || mese==12) && (giorno>=1) && (giorno<=31))
								lista->book.date.day=giorno;					

							else if ((mese==2) && (anno%4==0) && (giorno>=1 && giorno<=29))
								lista->book.date.day=giorno;
							
							else if ((mese==2) && (giorno >=1 && giorno<=28))
								lista->book.date.day=giorno;
						
							else 
								printf("Hai inserito un giorno non corretto");

10 Risposte

  • Re: Errore istruzione continue

    Continue non è una funzione

    Come per la break, l'istruzione continue va all'interno di un ciclo.

    La break termina il ciclo, la continue riparte dall'inizio.
  • Re: Errore istruzione continue

    Salve.
    Continue va utilizzata solo dentro un ciclo iterativo. Comunque ti consiglio di utilizzare un ciclo do-while dove come condizione metti la verifica della validità della data.
  • Re: Errore istruzione continue

    oregon ha scritto:


    continue non è una funzione

    Come per la break, l'istruzione continue va all'interno di un ciclo.

    La break termina il ciclo, la continue riparte dall'inizio.

    Ok erroneamente l'ho chiamata funzione , in realtà volevo dire istruzione.


    L'istruzione continue , per far ripetere l'inserimento del giorno del mese o dell'anno qualora lo digitasse errato , dove la devo mettere?
  • Re: Errore istruzione continue

    paloppa ha scritto:


    oregon ha scritto:


    continue non è una funzione

    Come per la break, l'istruzione continue va all'interno di un ciclo.

    La break termina il ciclo, la continue riparte dall'inizio.

    Ok erroneamente l'ho chiamata funzione , in realtà volevo dire istruzione.


    L'istruzione continue , per far ripetere l'inserimento del giorno del mese o dell'anno qualora lo digitasse errato , dove la devo mettere?
    l'istruzione continue (così come la break) andrebbe evitata come la peste.
    per far inserire all'utente un input che sia considerato valido dal programma (ad esempio, deve inserire un numero da 1 a 10) si fa un do-while che ripete il ciclo finché il numero non è accettabile, ovvero:
    do
    {
        scanf("%d", &num);
    } while (num < 1 || num > 10);
    e se devi inserire un messaggio d'errore in caso di input errato, ti basta fare un if all'interno del do-while, con la stessa condizione, in questo caso:
    do
    {
        scanf("%d", &num);
        if (num < 1 || num > 10)
            printf("Inserisci un numero da 1 a 10.");
    } while (num < 1 || num > 10);
    come puoi vedere, l'istruzione continue è inutile in questo caso, la vedrei meglio in un ciclo for, dove quando i è ad un determinato valore non bisogna fare l'istruzione del for, per esempio:
    for (int i = 0; i < 10; i++)
    {
        if (i == 5)
            continue;
    
        tot += i;
    }
    ma è un'istruzione pericolosa che si evita semplicemente con
    for (int i = 0; i < 10; i++)
    {
        if (i != 5)
            tot += i;
    }   
  • Re: Errore istruzione continue

  • Re: Errore istruzione continue

    Le date sono la cosa che si odia di più, le puoi gestire o come 3 interi separati (giorno, mese e anno) oppure come un'unica stringa che dividi poi tu nelle corrispondenti giorno-mese-anno.
    personalmente, a livello di user-friendly in c/c++ trovo più "bella" la seconda scelta, ma dato che hai molti controlli da fare, se non ne sei capace utilizza i 3 interi separati che sono gestibili senza fatica.

    se decidi quindi di fare i 3 interi, metti 3 do-while per il mese, il giorno e l'anno.
    se decidi di usare la stringa, metti un singolo do-while che però anziché avere una condizione "semplice" ha una funzione (chiamiamola checkDate) che restituisce un bool.
    se secondo checkDate la data è corretta (non ha inserito 31/02 oppure 31/10 o 29/02/1900) allora la data è accettata, altrimenti ripete l'inserimento.
    dipende sempre da come interpreti il programma: per te 31/10 può essere 1/12 e di conseguenza non consideri errata la data, oppure puoi totalmente evitare il controllo sui bisestili...
    se vuoi un consiglio, dato che ho avuto personalmente a che fare con il controllo delle date, se questo NON è l'obiettivo del tuo programma, fai questo controllo DOPO che hai finito tutto il resto. questo controllo è solo una "finezza" che però ti porta via tanto tempo...
  • Re: Errore istruzione continue

    le date sono la cosa che si odia di più, le puoi gestire o come 3 interi separati (giorno, mese e anno) oppure come un'unica stringa che dividi poi tu nelle corrispondenti giorno-mese-anno.
    personalmente, a livello di user-friendly in c/c++ trovo più "bella" la seconda scelta, ma dato che hai molti controlli da fare, se non ne sei capace utilizza i 3 interi separati che sono gestibili senza fatica.
    Un metodo più furbo di gestire giorno/mese/anno è di combinare i 3 valori in un singolo intero in questo modo
    val = (anno*10000) + (mese *100) + giorno;
    Buon lavoro
  • Re: Errore istruzione continue

    candaluar ha scritto:


    le date sono la cosa che si odia di più, le puoi gestire o come 3 interi separati (giorno, mese e anno) oppure come un'unica stringa che dividi poi tu nelle corrispondenti giorno-mese-anno.
    personalmente, a livello di user-friendly in c/c++ trovo più "bella" la seconda scelta, ma dato che hai molti controlli da fare, se non ne sei capace utilizza i 3 interi separati che sono gestibili senza fatica.
    Un metodo più furbo di gestire giorno/mese/anno è di combinare i 3 valori in un singolo intero in questo modo
    val = (anno*10000) + (mese *100) + giorno;
    Buon lavoro
    è un metodo furbo, ma dipende dall'utilizzo.
    è un po' come memorizzare un'orario tramite il solo valore in secondi: risparmi sì memoria, ma ogni volta che ti servono ora/minuti/secondi devi andare a riconvertirti il valore.
    o sprechi memoria o sprechi tempo insomma...
    se invece si tratta solo del confronto di due date (ma date intere, non solo fra mesi o anni come in questo caso) potrebbe essere molto efficace.
  • Re: Errore istruzione continue

    La conversione è altrettanto semplice:
    anno = val / 10000;
    mese = (val / 100) % 100;
    giorno = val % 100;
  • Re: Errore istruzione continue

    candaluar ha scritto:


    La conversione è altrettanto semplice:
    anno = val / 10000;
    mese = (val / 100) % 100;
    giorno = val % 100;
    non intendevo dire che la riconversione fosse complicata, ma che la riconversione, per quanto semplice sia, porta comunque un costo computazionale maggiore rispetto al semplice prelevare dalla memoria un valore che già hai (in caso di data salvata in 3 variabili distinte).
Devi accedere o registrarti per scrivere nel forum
10 risposte