Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Esercizi C?
Forum - C/C++ - Esercizi C?

Avatar
Kvashir (Normal User)
Newbie


Messaggi: 1
Iscritto: 20/02/2012

Segnala al moderatore
Postato alle 17:26
Lunedì, 20/02/2012
Ciao ragazzi, ho programmato in PHP per tanti anni e ora causa università sto studiando il c.

Non me la cavo male, considerando la sintassi simile... però, volevo da voi un opinione su quello che dovrebbe essere l'iter da seguire per imparare bene la programmazione in codesto linguaggio :)

Vi allego l'ultimo programmino che ho creato, sicuramente molto basilare, per rendervi l'idea del mio status:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. /*
  6.     Nome:       Impiccatelo 1.0
  7.     Autore:     Antonio xxxxx
  8.     Data:       12/02/2012
  9. */
  10.  
  11. void playGame()
  12. {
  13.  
  14.     /*
  15.         | Definizione variabili:
  16.         |
  17.         |   - letter:       char, lettera digitata dal giocatore.
  18.         |   - word:         array, parola da indovinare, impostata su "parola".
  19.         |   - wordCache:    array, parola cifrata.
  20.         |   - lCache:       array, lista le lettere già digitate.
  21.         |   - i:            int, contatore.
  22.         |   - tries:        int, il numero di tentativi rimanenti.
  23.         |   - errors:       int, il numero di errori commessi.
  24.         !   - cacheTries:   int, contatore.
  25.         |   - wordlenght:   int, ritorna la lunghezza della parola tramite la funzione strlen();
  26.         |   - flag:         int, contatore necessario per uscire dal ciclo.
  27.         |   - lCacheLenght: int, ritorna il numero di lettere contenute nella cache.
  28.         |
  29.  
  30.     */
  31.  
  32.     char letter;
  33.     char lCache[25];
  34.     char word[25]="parola";
  35.     char wordCache[25]="\0";
  36.  
  37.     int i;
  38.     int tries=5;
  39.     int errors=0;
  40.     int cacheTries=0;
  41.     int wordlenght=strlen(word);
  42.  
  43.     // Imposto il massimo di errori a 5 ed eseguo un ciclo while fino al raggiungimento della soglia. (Praticamente corrisponde al numero dei tentativi).
  44.     while(errors!=5)
  45.     {
  46.         // Recupero la lunghezza della parola da indovinare necessaria per contare gli errori e quella della cache contenente le lettere provate.
  47.         int flag=strlen(word), lCacheLenght=strlen(lCache);
  48.  
  49.         // Pulisco la schermata DOS.
  50.         system("cls");
  51.  
  52.         // Stampo il numero dei tentativi rimanenti.
  53.         printf("# hai a disposizione %i tentativi per indovinare la parola seguente:\n\n", tries);
  54.  
  55.         // Stampo la parola criptata, Esempio: PAROLA = ______
  56.         // Ad ogni iterazione gli spazi verranno sostituiti in caso di lettera corrispondente.
  57.         for(i=0; i<wordlenght; i++)
  58.         {
  59.             if(wordCache[i]=='\0')
  60.             {
  61.                 printf("_");
  62.             }
  63.             else
  64.             {
  65.                 printf("%c", wordCache[i]);
  66.             }
  67.         }
  68.  
  69.         printf("\n\n");
  70.  
  71.         // Stampo le lettere già provate tramite un ciclo for sull'array lCache solo nel caso in cui non sia il primo tentativo.
  72.         if(cacheTries!=0)
  73.         {
  74.             printf("# Hai gia' provato le seguenti lettere: ");
  75.  
  76.             for(i=0; i<lCacheLenght; i++)
  77.             {
  78.                 printf("%c", lCache[i]);
  79.             }
  80.  
  81.             printf("\n\n");
  82.         }
  83.  
  84.         // Recupero la lettera "tentativo" tramite scanf();
  85.         printf("# Inserisci una lettera: ");
  86.  
  87.         scanf("%c", &letter);
  88.  
  89.         // Pulisco il buffer onde evitare problemi
  90.         getchar();
  91.  
  92.         // Aggiungo all'array lCache, nella posizione data dalla variabile cacheTries. Incrementata ad ogni iterazione.
  93.         lCache[cacheTries]=letter;
  94.  
  95.         // Tramite ciclo for eseguo la copia della lettera indovinata nella stessa posizione dell'array wordCache, inizialmente vuoto.
  96.         for(i=0; i<wordlenght; i++)
  97.         {
  98.             // Se la lettera è presente eseguo la copia.
  99.             if(word[i]==letter)
  100.             {
  101.                 wordCache[i]=word[i];
  102.             }
  103.             // Altrimenti, decremento la variabile flag.
  104.             else
  105.             {
  106.                 flag--;
  107.             }
  108.         }
  109.  
  110.         // Se la lunghezza della variabile flag è zero, ovvero la lettera provata non fa parte della parola misteriosa, aggiungo un errore e decremento i tentativi.
  111.         if(flag==0)
  112.         {
  113.             errors++;
  114.             tries--;
  115.         }
  116.  
  117.         // Aumento in contatore necessario all'array lCache.
  118.         cacheTries++;
  119.     }
  120.  
  121.     // Se gli errori arrivano il giocatore perde e viene riportato alla funzione main.
  122.     if(errors==5)
  123.     {
  124.         system("cls");
  125.         printf("# Hai esaurito le tue possibilita', hai perso!\n\n");
  126.         system("pause");
  127.         system("cls");
  128.         main();
  129.     }
  130.  
  131. }
  132.  
  133. int main()
  134. {
  135.  
  136.     int sceltaMenu;
  137.     char cache[25];
  138.     char l;
  139.  
  140.     printf("######################################\n");
  141.     printf("#                                    #\n");
  142.     printf("# 1: Inizia il gioco                 #\n");
  143.     printf("#                                    #\n");
  144.     printf("# 2: ##############                  #\n");
  145.     printf("#                                    #\n");
  146.     printf("# 3: ##############                  #\n");
  147.     printf("#                                    #\n");
  148.     printf("######################################\n");
  149.  
  150.     printf("\n\nInserisci una scelta: ");
  151.  
  152.     scanf("%i", &sceltaMenu);
  153.  
  154.     getchar();
  155.  
  156.     switch(sceltaMenu)
  157.     {
  158.         case 1: system("cls"); playGame(); break;
  159.         default: playGame(); break;
  160.     }
  161.  
  162.     return;
  163.  
  164. }


PM
Avatar
dmr (Normal User)
Pro


Messaggi: 141
Iscritto: 04/01/2012

Up
1
Down
V
Segnala al moderatore
Postato alle 18:22
Lunedì, 20/02/2012
Ciao, ho letto il codice velocemente , pero' mi sono accorto che quando dichiari lCache non gli metti poi il terminatore di stringa e quindi  strlen potrebbe ritornare un valore sbagliato a lCacheLenght. Alla linea 128 chiami il main che non si potrebbe fare, sarebbe meglio sostituirla con return che fa uscire dalla funzione.

Ultima modifica effettuata da dmr il 21/02/2012 alle 9:48


Principali interessi: Compilatori e generatori di parser.
PM