PROBLEMA Programma in C "Indovina il numero"

markice92

Nuovo Utente
45
0
Sto facendo un piccolo programmino in C, in pratica devi indovinare il numero che genera casualmente il computer.
Se scrivi un numero più basso la shell dice "Too low. Try again" in caso contrario "Too high. Try again" e fino a qui funziona bene. Il mio problema sta che quando indovino il numero il programma non dice niente e termina in automatico invece di stampare "Excellent! You guessed the number! Would you like to play again (y or n)?" come programmato da me. Dove sbaglio? Vi allego il file con il codice. Grazie.
 

Allegati

  • indovinello.txt
    1.2 KB · Visualizzazioni: 263

gugulp

Nuovo Utente
18
0
CPU
Intel core i7 2600k Cooled by Noctua NH-D14
Scheda Madre
Asus Maximus V Formula
HDD
2xRaid0 OCZ Vertex 2 60gb + WD Caviar Green 1Tb
RAM
2x4Gb G-skill ripjaws 2100 mhz
GPU
Sapphire HD7970 Vapor-x
Monitor
ASUS VG278he
PSU
Enermax Platimax 750W
Case
CMStorm Enforcer
OS
WIN7 64 bit, ma sogno un Linux adatto alle mie esigenze xD
Ciao,
Premetto che sono anni che non sviluppo in C, ma penso che il problema tuo è che non "cicli" per il caso in cui il risultato è giusto, ma solamente i casi errati. In questo modo se il primo numero è minore, ma il secondo è uguale, il sw esce dal primo ciclo while (riga 80) perché risp == num, non entri nel secondo ciclo per lo stesso motivo, ed il programma termina;
in realtà il tuo programma funzionerebbe solo in caso indovini il numero la prima volta, e se rigiocassi non avresti la possibilità di indovinare il numero.
Dovresti creare un unico ciclo in cui controlli la variabile, e stampa il risultato a seconda dei casi.
 

stayhungry

Utente Attivo
449
42
Ciao,
Premetto che sono anni che non sviluppo in C, ma penso che il problema tuo è che non "cicli" per il caso in cui il risultato è giusto, ma solamente i casi errati. In questo modo se il primo numero è minore, ma il secondo è uguale, il sw esce dal primo ciclo while (riga 80) perché risp == num, non entri nel secondo ciclo per lo stesso motivo, ed il programma termina;
in realtà il tuo programma funzionerebbe solo in caso indovini il numero la prima volta, e se rigiocassi non avresti la possibilità di indovinare il numero.
Dovresti creare un unico ciclo in cui controlli la variabile, e stampa il risultato a seconda dei casi.
quoto, e poi per come hai scritto gli ultimi due cicli potrebbero essere rimpiazzabili da due comandi di selezione if invece che di iterazione while.

comunque domani scrivo il source per bene e lo posto , poi ti spiego cosa ho fatto, sto studiando anche io il c!
 

markice92

Nuovo Utente
45
0
quoto, e poi per come hai scritto gli ultimi due cicli potrebbero essere rimpiazzabili da due comandi di selezione if invece che di iterazione while.

comunque domani scrivo il source per bene e lo posto , poi ti spiego cosa ho fatto, sto studiando anche io il c!

Se sostituisci i while con gli if non ti crea il ciclo e alla prima risposta sbagliata esce. Ho provato a mettere tutto in un ciclo unico come mi consigliava @gugulp, funziona ma quando indovino il numero e mi chiede se voglio continuare a giocare esce in automatico senza che mi faccia rispondere. Vi posto lo screen perchè non so come si inseriscono i file nelle risposte rapide.
ind.PNG
 

stayhungry

Utente Attivo
449
42
oggi ho lavorato sul tuo problema e c'ho smanettato un po, questo é il codice piú prossimo al tuo

Codice:
 #include <stdio.h>
#include <stdlib.h>


int main ()    {
    
    int num;
    int num_2;
    char cont;
    
    num = 1 + (rand() % 3) ;
    
    
            printf    ("I have a number between 1 and 1000\n");
            printf    ("Can you guess my number ?\n");
            
            printf    ("Type your  guess (-1 to end) : ");
            scanf    ("%d", &num_2);
            
    
        while (num_2 != -1) {
                
                if (num_2 == num ) {
            printf    ("Good");
            
            printf    ("\nTry again (y/n) ? ");
            scanf    ("%c", &cont);
            
                switch (cont) {
            
            case 'y':
            case 'Y':
            printf    ("Type your first guess (-1 to end) : ");
            scanf    ("%d", &num_2);
            break ;
            
            case 'n':
            case 'N':
            break;
            
        }
    }
        
                if (num_2 < num) {
            printf    ("too low\n");
                
            printf    ("\nTry again (-1 to quit) : ");
            scanf    ("%d", &num_2);
            
        }
            
    
        
            
                if (num_2 > num) {
            printf    ("too hight\n");
            
            printf    ("\nTry again (-1 to quit) : ");
            scanf    ("%d", &num_2);
        }
    }
        return 0 ;
        
    }

Anche io ho problemi nel caso in cui riesci a indovinare il numero: -1 se dico di non voler provare piú una volta aver indovinato (digitare quindi o n o N ) il risultato é questo : Screenshot - 14092015 - 16:24:48.png

2-se dico di voler giocare ma poi digito -1 per uscire, -1 viene preso come un normale valore e non viene considerato come valore sentinella Screenshot - 14092015 - 16:24:08.png

3- ogni volta che indovino mi stampa try again ? 2 volte, la prima con scritto anche good accanto

ps: non preoccuparti se ho scritto num = 1 + (rand() % 3) ;
invece di num = 1 + (rand() % 1000) , il risultato é il medesimo, mi serviva solo er testare i problemi piú facilmente


pps: ho modificato un po le cose che devono essere stampate da printf, ma questo é ininfluente

ppps: nel programma finale, quando tutto é collaudato e funzionante, usa anche la funzione srand(), poiché rand() genera sempre lo stesso numero


ormai voglio capire anchio cosa sbaglio! @markice92
 

Dario Salvati

Utente Attivo
1,401
247
CPU
Intel Core i5-3470
Scheda Madre
ASUS P8Z77-V LX
HDD
Western Digital Green 1TB 7200rmp + Crucial M550 128Gb
RAM
Corsair 8Gb(2x4GB) 1600Mhz
GPU
Msi GeForce 770 2Gb
Audio
Integrata mainbord
Monitor
Asus VE247H / 23.6"
PSU
XFX 550W Core Edition
Case
Fractal Design R4
OS
Arch Linux + Gnome
Premetto che l'ho scritto una ***** e non è assolutamente ottimizzato, ma funziona.

Probabilmente ho sbagliato qualche pezzo di sintassi, perché alla richiesta di continuare (almeno sotto Windows) il programma termina freeza.

Codice:
#include <stdio.h>
#include <stdlib.h>


int main()
{
    int numero, tent;
    char risp = 'y';
    while(risp == 'y')
    {
    int num = 1 + (rand() % 3);


    printf("Ho scelto un numero fra 1 e 1000, puoi indovinarlo?\n");
    while(tent != numero)
    {
        printf("Inserisci il numero: ");
        scanf("%d", &tent);
        if(tent > numero)
            printf("Troppo alto, riprova\n");
        if(tent < numero)
            printf("Troppo basso, riprova\n");
        if(tent == numero)
            printf("Ottimo, hai indovinato!");
    }
    printf("Vuoi continuare?(y/n): ");
    scanf(" %c", &risp);
    }
    return 0;
}

Prova.

EDIT: avevo saltato la & :cav:

EDIT2: per qualche motivo salta lo scanf finale, cerco una soluzione.

EDIT3: per fortuna esiste stackoverflow :asd:
 
Ultima modifica:

markice92

Nuovo Utente
45
0
Premetto che l'ho scritto una ***** e non è assolutamente ottimizzato, ma funziona.

Probabilmente ho sbagliato qualche pezzo di sintassi, perché alla richiesta di continuare (almeno sotto Windows) il programma termina freeza.

Codice:
#include <stdio.h>
#include <stdlib.h>


int main()
{
    int numero, tent;
    char risp = 'y';
    while(risp == 'y')
    {
    int num = 1 + (rand() % 3);


    printf("Ho scelto un numero fra 1 e 1000, puoi indovinarlo?\n");
    while(tent != numero)
    {
        printf("Inserisci il numero: ");
        scanf("%d", &tent);
        if(tent > numero)
            printf("Troppo alto, riprova\n");
        if(tent < numero)
            printf("Troppo basso, riprova\n");
        if(tent == numero)
            printf("Ottimo, hai indovinato!");
    }
    printf("Vuoi continuare?(y/n): ");
    scanf(" %c", &risp);
    }
    return 0;
}

Prova.

EDIT: avevo saltato la & :cav:

EDIT2: per qualche motivo salta lo scanf finale, cerco una soluzione.

EDIT3: per fortuna esiste stackoverflow :asd:

Grazie! Soprattutto per la dritta sullo specificatore di conversione %c, infatti non riuscivo a capire come mai non aspettava l'input dell'utente. Ho trovato anche un'altra soluzione. Praticamente nello switch che ho utilizzato, nel caso 'y' come istruzione bisogna dargli return main() e cancellare quello che ho scritto naturalmente, in modo tale che ritorna all'inizio del codice e ripete il gioco. Vi riposto lo screen tutto corretto in modo da chiarire ogni dubbio. 1.PNG 2.PNG
 
Ultima modifica:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!