Problema di input programmino in c

di il
14 risposte

Problema di input programmino in c

Sera a tutti. Sono un pò di giorni che sto studiando per conto mio una guida, a mio parere molto valida, sulla programmazione in c. Sono appena riuscito a compilare un programmino (un timer), che stampa a video un conteggio a ritroso con delay di 1 secondo partendo da un valore inserito da tastiera. Ora, il problema è che quando vado a inserire il valore da tastiera e clicco su invio, non succede nulla, torna a capo, mentre per far partire il timer devo riscrivere il valore e ricliccare nuovamente su invio. Come mai non mi acquisisce il valore al primo colpo? Tra l'altro non è la prima volta che succede, mi è successo un'altra volta con un programmino che faceva una domanda e bisognava rispondere, e come adesso non mi prendeva la risposta al primo colpo. Sapete darmi una spiegazione?
Intanto ecco il codice:
#include <stdio.h> 

// prototipo della funzione
void pausa();

int main()
{

 printf("######EASY TIMER v1.0###### \n");
 printf("######### \n");
 printf("DIGITA I SECONDI PER IL TIMER \n");
   
   int sec;
   int i;
      scanf("%d \n", &sec);
         for(i=0; i< (i+sec); i++) 
         {
            printf("mancano %d secondi \n", sec);
            --sec;
            pausa();
         }

return 0;
}

// Funzione che utilizzo per staccare di 1 secondo ciascuna stampa a video
void pausa()
{
 int b;
   for(b=0; b<3072000; b++) 
     printf("");
}

ps: scusate se non è indentato alla perfezione, ma sono ancora un novellino hehe

14 Risposte

  • Re: Problema di input programmino in c

    Ti rispondo citando un post di Max:

    https://www.iprogrammatori.it/forum-programmazione/cplusplus/ragazzi-gentilmente-una-mano-t10186.html#p8466945

    Leggi la parte dove dice:
    Questo può essere fatto in "ANSI C" anteponendo uno spazio davanti al segno di percentuale della scanf
    Prova a fare lo stesso con il tuo scanf.
  • Re: Problema di input programmino in c

    skynet ha scritto:


    Ti rispondo citando un post di Max:

    https://www.iprogrammatori.it/forum-programmazione/cplusplus/ragazzi-gentilmente-una-mano-t10186.html#p8466945

    Leggi la parte dove dice:
    Questo può essere fatto in "ANSI C" anteponendo uno spazio davanti al segno di percentuale della scanf
    Prova a fare lo stesso con il tuo scanf.
    Grazie mille della risposta, comunque ho risolto eliminando l'escape \n nello scanf, una banalità
    Ora, dopo qualche modifica e aggiunta, il programma si presenta così:
    #include <stdio.h> 
    #include <windows.h>
    #include <stdlib.h>
    
    int main()
    {
    
     printf("######EASY TIMER v1.0###### \n");
     printf("######### \n");
     start:
     printf("DIGITA I SECONDI PER IL TIMER E PREMI INVIO \n");
       
       int sec;
       int i;
          scanf("%d", &sec);
             for(i=0; i< (i+sec); i++) 
             {
                printf("mancano %d secondi \n", sec);
                --sec;
                Sleep(1000);
             }
        Sleep(500);
        printf("VUOI CONTINUARE? (si/no) \n");
      
      char scelta[2];
      scanf("%s", scelta);
      if (scelta[0] == 's' && scelta[1] == 'i')
           {
               system("cls"); 
               goto start;   
           }   
           else if (scelta[0] = 'n' && scelta[1] == 'o')
            {
             printf("GRAZIE PER AVER SCELTO EASY TIMER! \n");
             Sleep(2000);
            }
               
    return 0;
    }
    Ho eliminato la funzione pause, che era un accrocchio utilizzato perchè non riuscivo ad utilizzare la funzione Sleep (che in windows sta nell'header windows.h e non unistd.h). Inoltre ho aggiunnto alla fine la possibilità di riprovare il timer o uscire. E qui c'è un altro semi-accrocchio: per la selezione "si o no" ho utilizzato un array di caratteri. Quando però vado nell'if a definire la condizione, non riesco a comparare l'intero array con la stringa "si" o "no", devo comparare ogni singola posizione dell'array con la rispettiva lettera usando un AND. Sapresti dirmi se c'è un modo di comparare l'intero array, o se non è effettivamente possibile in C?
  • Re: Problema di input programmino in c

    Ciao, prova con la funzione strcmp

    ESEMPIO:
    /* Se scelta è uguale a si */
    if(strcmp(scelta, "si") == 0) {
    ......
    .......
    }

    NOTA: Per usare strcmp devi fare l'include di string.h (#include <string.h>)
  • Re: Problema di input programmino in c

    scendoallaprossima ha scritto:


    Ciao, prova con la funzione strcmp

    ESEMPIO:
    /* Se scelta è uguale a si */
    if(strcmp(scelta, "si") == 0) {
    ......
    .......
    }

    NOTA: Per usare strcmp devi fare l'include di string.h (#include <string.h>)
    ho provato ma non funziona, forse non è implementato in C ma solo in C++.
  • Re: Problema di input programmino in c

    
    char scelta[2];
    scanf("%s", scelta);
    
    Questo non è valido. non stai lasciando spazio per il terminatore di stringa '\0'. Metti la dimensione dell'array almeno 3.

    Inoltre rivedi il tuo algoritmo in modo che non ci sia quel brutto goto. 99.9% dei casi tutto si risolve con un loop. il goto è da considerarsi il male.
  • Re: Problema di input programmino in c

    skynet ha scritto:


    
    char scelta[2];
    scanf("%s", scelta);
    
    Questo non è valido. non stai lasciando spazio per il terminatore di stringa '\0'. Metti la dimensione dell'array almeno 3.

    Inoltre rivedi il tuo algoritmo in modo che non ci sia quel brutto goto. 99.9% dei casi tutto si risolve con un loop. il goto è da considerarsi il male.
    Ma il fatto di dare 3 elementi all'array è per utilizzare strcmp? Perchè se va bene anche il confronto che ho utilizzato io, a me funziona alla perfezione. Comunque, lo so lo so, il goto è il male e anche la guida che sto seguendo lo esclude proprio dalla trattazione, perchè predilige i loop. Il problema è che, come già detto, sono abbastanza inesperto ancora, e non sapevo come uscirne senza goto. Proverò a rivedere un pò il tutto. Tu cosa mi consiglieresti? Giusto come spunto.
  • Re: Problema di input programmino in c

    Per esempio:
    
    int uscita = 0;
    do
    {
    printf("DIGITA I SECONDI PER IL TIMER E PREMI INVIO \n");
       
       int sec;
       int i;
          scanf("%d", &sec);
             for(i=0; i< (i+sec); i++)
             {
                printf("mancano %d secondi \n", sec);
                --sec;
                Sleep(1000);
             }
        Sleep(500);
        printf("VUOI CONTINUARE? (si/no) \n");
     
      char scelta[2];
      scanf("%s", scelta);
      
      if (scelta[0] == 's' && scelta[1] == 'i')
         uscita = 1;
    }while(uscita == 0);
    
  • Re: Problema di input programmino in c

    skynet ha scritto:


    per esempio:
    
    int uscita = 0;
    do
    {
    printf("DIGITA I SECONDI PER IL TIMER E PREMI INVIO \n");
       
       int sec;
       int i;
          scanf("%d", &sec);
             for(i=0; i< (i+sec); i++)
             {
                printf("mancano %d secondi \n", sec);
                --sec;
                Sleep(1000);
             }
        Sleep(500);
        printf("VUOI CONTINUARE? (si/no) \n");
     
      char scelta[2];
      scanf("%s", scelta);
      
      if (scelta[0] == 's' && scelta[1] == 'i')
         uscita = 1;
    }while(uscita == 0);
    
    Grazie mille! Si vede che non sono ancora abituato a fare algoritmi
    Comunque l'istruzione dell'if se scelgo si non dovrebbe essere uscita == 1 senno esco, invece voglio continuare.

    Adesso ecco come si presenta il codice, ho aggiunto il suono (doveroso per un timer) e qualche animazione iniziale:
    #include <stdio.h> 
    #include <windows.h>
    #include <stdlib.h>
    
    int main()
    {
    // Inizio titolo
        Sleep(100);
     printf("#");
        Sleep(100);
     printf("#");
        Sleep(100);
     printf("#");
        Sleep(100);
     printf("#");
        Sleep(100);
     printf("#");
        Sleep(100);
     printf("#");
        Sleep(100);
     printf(" ");
        Sleep(100);
     printf("E");
        Sleep(100);
     printf("A");
        Sleep(100);
     printf("S");
        Sleep(100);
     printf("Y");
        Sleep(100);
     printf(" ");
        Sleep(100);
     printf("T");
        Sleep(100);
     printf("I");
        Sleep(100);
     printf("M");
        Sleep(100);
     printf("E");
        Sleep(100);
     printf("R");
        Sleep(100);
     printf(" ");
        Sleep(100);
     printf("v");
        Sleep(100);
     printf("1");
        Sleep(100);
     printf(".");
        Sleep(100);
     printf("0");
        Sleep(100);
     printf(" ");
        Sleep(100);
     printf("#");
        Sleep(100);
     printf("#");
        Sleep(100);
     printf("#");
        Sleep(100);
     printf("#");
        Sleep(100);
     printf("#");
        Sleep(100);
     printf("#");
     // Fine titolo
     
     system("cls");
     
     int uscita;
     do {
     printf("###### EASY TIMER v1.0 ###### \n"); 
     printf("DIGITA I SECONDI PER IL TIMER E PREMI INVIO \n");
       
       int sec;
       int i;
          scanf("%d", &sec);
             for(i=0; i< (i+sec); i++) 
             {
                printf("mancano %d secondi \n", sec);
                --sec;
                printf("\a");
                Sleep(1000);
             }
             Beep(2000, 2000);
        Sleep(500);
        printf("VUOI CONTINUARE? (si/no) \n");
      
      char scelta[2];
      scanf("%s", scelta);
      if (scelta[0] == 's' && scelta[1] == 'i')
           {
               system("cls"); 
               uscita = 0;
           }   
           else if (scelta[0] == 'n' && scelta[1] == 'o')
            {
             printf("GRAZIE PER AVER SCELTO EASY TIMER! \n");
             Sleep(2000);
             uscita = 1;
            }
        } while(uscita == 0);
        
    return 0;
    }
    Avevo perso anche una buona mezz'ora a fare un titolo 3d in stile ascii, ma non mi è servito a niente, perchè avevo utilizzato il backslash ("\") e il compilatore mi vedeva caratteri come \_ oppure \/ come sequenze di escape sconosciute
  • Re: Problema di input programmino in c

    Vabbè cambia le lettere dentro l'if, metti 'n' e 'o' invece che 's' e 'i'. Non ho visto cosa chiedeva il printf.
  • Re: Problema di input programmino in c

    skynet ha scritto:


    vabbè cambia le lettere dentro l'if, metti 'n' e 'o' invece che 's' e 'i'. Non ho visto cosa chiedeva il printf.
    si, se vedi nel messaggio prima, l'ho modificato. L'int uscita l'ho solo dichiarato, per poi inizializzarlo direttamente nell'if Così ho ancora le 2 scelte.
  • Re: Problema di input programmino in c

    INIZIALIZZA SEMPRE LE VARIABILI. Mai dare niente per scontato. Se l'utente è utonto e non scrive ne si e ne no cosa controlla il while? un uscita senza un valore ovvero con un valore random definito dalla posizione in memoria della variabile. Metti uscita = 0 così sei a posto che non esce se uno scrive cavolate.
  • Re: Problema di input programmino in c

    skynet ha scritto:


    INIZIALIZZA SEMPRE LE VARIABILI. Mai dare niente per scontato. Se l'utente è utonto e non scrive ne si e ne no cosa controlla il while? un uscita senza un valore ovvero con un valore random definito dalla posizione in memoria della variabile. Metti uscita = 0 così sei a posto che non esce se uno scrive cavolate.
    ma posso inizializzare ad esempio int uscita = 0 e poi nell'if riscrivere di nuovo uscita = 0?
  • Re: Problema di input programmino in c

    Ogni volta che vuoi. Che c'è un limite? Non mi pare. Stai tranquillo che si usa così.
  • Re: Problema di input programmino in c

    skynet ha scritto:


    Ogni volta che vuoi. Che c'è un limite? Non mi pare. Stai tranquillo che si usa così.
    Bhè, proprio perchè non lo so lo chiedo xD
    Mentre per il problema del titolo in stile ascii cosa mi consigli?
Devi accedere o registrarti per scrivere nel forum
14 risposte