n° 186
Luglio/Agosto 2013
Giugno 18, 2013, 09:17:44 am *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  

* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: problemino da principiante  (Letto 693 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
giovdigua
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 4


Mostra profilo E-mail
« inserita:: Luglio 09, 2012, 08:10:08 pm »

Buona sera a tutti e scusate la mia poca.
Sto cominciando da poco a studiare il C e già con le prime elementari righe  di codice trovo alcune difficoltà a me incomprensibili.Sto seguendo il manuale Guidi/Bellini e mi sono bloccato in questo esercizio di cui vi riporto il codice:

Codice:
/*Domande variee*/
#include<stdio.h>

char x;
int i = 0, punt;

main()
{
      printf("\tRispondi s o n alle domande per si o no:\n");
     
      printf("1)Napoleone è morto il 5 maggio 1821?\n");
      scanf("%c",&x);
   if(x == 's' || x == 'n')
    {
      switch(x) {
      case 's':
      {
         printf("Giusto!\n");
         i = 1;
         punt = punt +i;
         break;
      }
      case 'n':
      printf("Errato\n");
      break;
      }
    }
    else
      printf("Immissione non valida\n");
     
     
     
      printf("2)la seconda guerra mondiale è finita nel 1946?\n");
        scanf("%c",&x);
  if(x == 's' || x == 'n')
    {
      switch(x) {
      case 'n':
      {
         printf("Giusto!\n");
         i = 1;
         punt = punt +i;
         break;
      }
      case 's':
      printf("Errato\n");
      break;
      }
    }
    else
      printf("Immissione non valida\n");
     
     
      printf("3)Il muro di Berlino è caduto nel 1989\n");
       scanf("%c",&x);
  if(x == 's' || x == 'n')
    {
      switch(x) {
      case 's':
      {
         printf("Giusto!\n");
         i = 1;
         punt = punt +i;
         break;
      }
      case 'n':
      printf("Errato\n");
      break;
      }
    }
    else
      printf("Immissione non valida\n");
     
     
      printf("hai ottenuto %d di punteggio\n",punt);
     
      system("pause");
}
     
     



il problema è che la compilazione va bene ma l'esecuzione manda la seconda domanda comunque in esecuzione senza l'input dove sbaglio??
Grazie e scusate.
Registrato
fermat85
Full Member
***

Karma: +4/-2
Scollegato Scollegato

Messaggi: 507


Mostra profilo WWW
« Risposta #1 inserita:: Luglio 09, 2012, 09:17:20 pm »

bhe perchè hai messo uno switch dentro all'if?
in quel modo nn ha molto senso.
Registrato

celeborn85
Global Moderator
Hero Member
*****

Karma: +57/-13
Collegato Collegato

Messaggi: 2127


Mostra profilo
« Risposta #2 inserita:: Luglio 09, 2012, 10:33:26 pm »

Più che non avere senso è eccessivamente complicato. Sarebbe infatti meglio scrivere qualcosa come:
Codice:
if (x == 's') {
    /* ... caso risposta positiva .. */
} else (x == 'n') {
    /* ... caso risposta negativa .. */
} else {
    /* ... valore invalido ... */
}

Ma l'errore è probabilmente un altro. La seguente riga legge qualsiasi carattere da standard input, sia esso una lettera, un numero, uno spazio o il carattere di a capo o...
Codice:
scanf("%c",&x);
Se quindi inserisci 's' e poi vai a capo, nella successiva lettura della risposta otterrai un carattere di a capo che è certamente diverso da 's' o 'n'.
Una soluzione pessima, ma che richiede pochissime modifiche nel tuo codice, è quella di scrivere
Codice:
scanf(" %c", &x);
Inserendo uno spazio nella stringa di formato di scanf e famiglia si dice alla funzione di ignorare ogni spazio, tabulazione o a capo e iniziare a leggere il primo carattere diverso da questi. La soluzione in assoluto migliore sarebbe di dimenticarsi dell'esistenza di scanf e usare getchar.
Registrato

I moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.
giovdigua
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 4


Mostra profilo E-mail
« Risposta #3 inserita:: Luglio 10, 2012, 09:28:13 pm »

Grazie mille che fa fare l'ignoranza!V ringrazio anche per avermi dato dei consigli sullo stile vado subito a sostituire con getchar
Registrato
giovdigua
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 4


Mostra profilo E-mail
« Risposta #4 inserita:: Luglio 10, 2012, 09:35:16 pm »

Scusate ancora so di essere proprio noioso ma ho provato a cambiare con getchar ma nulla stesso problema posso chiedervi ancora aiuto???
Grazie mille
posto il nuovo codice
Codice:
/*Domande variee*/
#include<stdio.h>

char x;
int i = 0,punt;

main()
{
      printf("\tRispondi s o n alle domande per si o no:\n");
     
      printf("1)Napoleone è morto il 5 maggio 1821?\n");
      x = getchar();
   if(x == 's' || x == 'n')
    {
      switch(x) {
      case 's':
      {
         printf("Giusto!\n");
         i = 1;
         punt = punt +i;
         break;
      }
      case 'n':
      printf("Errato\n");
      break;
      }
    }
    else
      printf("Immissione non valida\n");
      printf("\n");
     
     
     
      printf("2)la seconda guerra mondiale è finita nel 1946?\n");
         x = getchar();
  if(x == 's' || x == 'n')
    {
      switch(x) {
      case 'n':
      {
         printf("Giusto!\n");
         i = 1;
         punt = punt +i;
         break;
      }
      case 's':
      printf("Errato\n");
      break;
      }
    }
    else
      printf("Immissione non valida\n");
     
     
      printf("3)Il muro di Berlino è caduto nel 1989\n");
        x = getchar();
  if(x == 's' || x == 'n')
    {
      switch(x) {
      case 's':
      {
         printf("Giusto!\n");
         i = 1;
         punt = punt +i;
         break;
      }
      case 'n':
      printf("Errato\n");
      break;
      }
    }
    else
      printf("Immissione non valida\n");
     
     
      printf("hai ottenuto %d di punteggio\n",punt);
     
      system("pause");
}
non ho ancora corretto lo stile ma lo faro'.
Registrato
celeborn85
Global Moderator
Hero Member
*****

Karma: +57/-13
Collegato Collegato

Messaggi: 2127


Mostra profilo
« Risposta #5 inserita:: Luglio 10, 2012, 10:06:42 pm »

getchar ha lo stesso comportamento dello scanf nel tuo primo post. La soluzione basata su getchar era molto più complicata di quella basata sullo scanf. Devi infatti scrivere anche il codice per ignorare gli spazi.
Registrato

I moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.
giovdigua
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 4


Mostra profilo E-mail
« Risposta #6 inserita:: Luglio 10, 2012, 11:06:14 pm »

ahh bene!!!non ho ancora studiato bene la funzione getchar quindi meglio arrivarci per gradi.
Ti ringrazio comunque per il tuo aiuto so di essere ancora alle prime armi ed bene fare le cose con calma .Ho già capito che la strada per arrivare a imparare qualcosa è dura ma penso che possa dare delle grandi soddisfazioni
Grazie  a presto
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2011 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page