Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C++] generatore di numeri primi gemelli cugini e sexy

    Salve a tutti.
    ieri la prof ha assegnato di compliare un programma che generi numeri primi gemelli finchè l'utente vuole. io ho deciso di farne una piccola variante, permettendo di generare numeri primi gemelli, cugini o sexy a scelta. dopo averlo compilato e testato ho notato che il ciclo while non funziona... potreste dare uno sguardo al codice e dirmi dov'è l'errore?
    grazie in anticipo

    Codice PHP:
    #include <iostream>
    using namespace std;
    int main()

        
    int a,risp;
        
    char risp2,quit;
        
        
    cout<<"inserisci un numero intero positivo ";
        
    cin>>a;
        if(
    a<0)
        
    cout<<"il numero inserito non e' un intero positivo";
        
        
    cout<<"digita 1, 2 o 3 se vuoi visualizzare rispettivamente i primi gemelli, cugini o sexy di "<<a;
        
    cin>>risp;
        
        if((
    risp=!1)&&(risp=!2)&&(risp=!3))
        
    cout<<"hai scelto un'opzione non valida";
        
        if(
    risp==1)
        do {
            
    a=a+2;
            
    cout<<a;
            
    cout<<"vuoi continuare? 0 per terminare, 1 per continuare";
            
    cin>>risp2;
            } while(
    risp2==0);
        
        if(
    risp==2)
        do {
            
    a=a+4;
            
    cout<<a;
            
    cout<<"vuoi continuare? 0 per terminare, 1 per continuare";
            
    cin>>risp2;
            } while(
    risp2==0);
            
        if(
    risp==3)
        do {
            
    a=a+6;
            
    cout<<a;
            
    cout<<"vuoi continuare? 0 per terminare, 1 per continuare";
            
    cin>>risp2;
            } while(
    risp2==0);
            
        
    cout<<"premere un tasto per terminare";
        
    cin>>quit;
        return 
    0;


  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Quale ciclo? Cosa succede?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Hai sbagliato a scrivere l'operatore "diverso da": si scrive != non =!

    Scrivendo così:

    codice:
    if((risp=!1)&&(risp=!2)&&(risp=!3))
    qualsiasi sia l'opzione scelta in pratica nel corpo dell'if tu fai un assegnamento a risp di "NOT 1" o "NOT 2" o "NOT 3", che in tutti i casi è 0. Quindi nel momento in cui vai a testare i valori di risp negli if successivi, non ti verrà mai eseguito alcun ciclo while perché risp vale 0, né 1 né 2 né 3.

    Apporta innanzitutto questa correzione.
    every day above ground is a good one

  4. #4
    Originariamente inviato da YuYevon
    qualsiasi sia l'opzione scelta in pratica nel corpo dell'if tu fai un assegnamento a risp di "NOT 1" o "NOT 2" o "NOT 3", che in tutti i casi è 0. Quindi nel momento in cui vai a testare i valori di risp negli if successivi, non ti verrà mai eseguito alcun ciclo while perché risp vale 0, né 1 né 2 né 3.

    Apporta innanzitutto questa correzione.
    ho effettuato la correzione del diverso, e va bene, ma come da te previsto non esegue alcun ciclo. inoltre, sarà per la mia ignoranza, ma di quello che hai detto non ci ho capito molto... ci sono due variabili di risposta (risp e risp2) la prima serve a generare primi gemelli, cugini o sexy, la seconda dovrebbe indicare quando uscire dal ciclo... cosa c'è che non va?

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da marjuano
    ho effettuato la correzione del diverso, e va bene, ma come da te previsto non esegue alcun ciclo.
    No, a dire il vero io avevo previsto che non venisse eseguito alcun ciclo proprio a causa di quell'errore, ma una volta corretto il programma dovrebbe funzionare correttamente (dove con "correttamente" intendo eseguire le istruzioni che ci sono, a prescindere dal fatto che l'output sia o non sia quello che ti aspetti).

    Originariamente inviato da marjuano
    inoltre, sarà per la mia ignoranza, ma di quello che hai detto non ci ho capito molto...
    sicuramente la mia spiegazione non è stata molto chiara (anzi a rileggere non è nemmeno proprio esatta) ma in ogni caso il problema è comunque evidente quindi ti consiglio di rivederti gli aspetti del linguaggio C relativi ai costrutti di controllo, operatori logici, relazionali ecc... in ogni caso, cerco di spiegarmi meglio:

    una volta compilato e lanciato il programma, il tuo calcolatore si ritrova con un bel codice binario da eseguire istruzione per istruzione, e così lui inizia dalla prima fino a che non arriva a questa:

    codice:
    if((risp=!1)&&(risp=!2)&&(risp=!3))
    al che fa quanto segue (tralasciando le operazioni elementari a livello macchina): alla variabile "risp" assegna il valore "!1", cioè il negato di 1; il negato di 1 (così come di qualsiasi altro valore diverso da 0) è 0, quindi a risp viene assegnato 0. A questo punto, il risultato di quella istruzione viene testato come condizione e, essendo 0 il suo valore, il calcolatore non passa nemmeno a testare le altre perché essendo 0 la prima se ne frega di quale sia il valore delle altre visto che sono legate logicamente in AND e non esegue il corpo dell'if. Tuttavia, pur non eseguendo il corpo dell'if, ora la tua variabile risp si trova con valore 0, qualunque fosse il valore che tu inizialmente avevi immesso da tastiera. E' ovvio quindi che nessuna delle condizioni degli if successivi, e cioè

    codice:
     if(risp==1)
     ...    
     if(risp==2)
     ...   
     if(risp==3)
    risulterà vera, appunto perché essendo risp 0 questa non vale né 1, né 2 né 3. Quello che volevi scrivere tu è questo:

    codice:
    if ( risp != 1 && risp != 2 && risp != 3 )
    Ora, a quanto hai detto, hai apportato questa correzione ma dici che ancora non va bene. A questo punto posta il codice corretto e dici perché non va.

    Tieni presente che ci sono comunque alcune cose poco logiche: ad esempio con l'if di cui sopra tu controlli che il valore di risp sia uno tra 1, 2 e 3. Ma se non è così? In pratica non fai altro che stampare un messaggio di errore ma poi il programma continua...
    every day above ground is a good one

  6. #6
    no, il programma non continua. in pratica il programma chiede all'utente di inserire 1, 2 o 3 se vuole visualizzare una delle 3 ripologie di numeri primi. L'if pluri-citato controlla che la risposta (risp) sia 1, 2 o 3. Nel caso negativo il programma non va avanti. nel caso positivo invece ci sono gli altri 3 if, ognuno dei quali con un ciclo al loro interno. per risp=1 si aziona il ciclo dei numeri primi gemelli, per risp=2 quello dei cugini e per risp=3 quelli sexy... quindi non credo che il problema stia in quello che hai detto!

    ecco il codice con la correzione di prima

    Codice PHP:
    #include <iostream>
    using namespace std;
    int main()

        
    int a,risp;
        
    char risp2,quit;
        
        
    cout<<"inserisci un numero intero positivo: ";
        
    cin>>a;
        if(
    a<0)
        
    cout<<"il numero inserito non e' un intero positivo";
        
        
    cout<<"digita 1, 2 o 3 se vuoi visualizzare rispettivamente i primi gemelli, cugini o sexy di "<<a<<": ";
        
    cin>>risp;
        
        if((
    risp!=1)&&(risp!=2)&&(risp!=3))
        
    cout<<"hai scelto un'opzione non valida"<<endl;
        
        if(
    risp==1)
        do {
            
    a=a+2;
            
    cout<<a<<endl;
            
    cout<<"vuoi continuare? 0 per terminare, 1 per continuare: ";
            
    cin>>risp2;
            } while(
    risp2==0);
        
        if(
    risp==2)
        do {
            
    a=a+4;
            
    cout<<a<<endl;
            
    cout<<"vuoi continuare? 0 per terminare, 1 per continuare: ";
            
    cin>>risp2;
            } while(
    risp2==0);
            
        if(
    risp==3)
        do {
            
    a=a+6;
            
    cout<<a<<endl;
            
    cout<<"vuoi continuare? 0 per terminare, 1 per continuare: ";
            
    cin>>risp2;
            } while(
    risp2==0);
            
        
    cout<<"premere un tasto per terminare";
        
    cin>>quit;
        return 
    0;


  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da marjuano
    no, il programma non continua. in pratica il programma chiede all'utente di inserire 1, 2 o 3 se vuole visualizzare una delle 3 ripologie di numeri primi. L'if pluri-citato controlla che la risposta (risp) sia 1, 2 o 3. Nel caso negativo il programma non va avanti.
    "non va avanti" significa che non entra nei cicli, non che le condizioni successive non vengano testate. L'ideale sarebbe bloccare proprio l'esecuzione del programma in quel punto, ma comunque vabbè sono scelte tue.

    nel caso positivo invece ci sono gli altri 3 if, ognuno dei quali con un ciclo al loro interno. per risp=1 si aziona il ciclo dei numeri primi gemelli, per risp=2 quello dei cugini e per risp=3 quelli sexy... quindi non credo che il problema stia in quello che hai detto!
    veramente io non avevo detto nulla, ti avevo detto di correggere quell'if (e vedo che lo hai fatto) e poi basta, ti avevo infatti invitato a postare di nuovo il codice per vedere cos'è che ancora non va

    ecco il codice con la correzione di prima
    ...
    provo a interpretare qual è il problema visto che non lo hai scritto per esplicito: ti chiedi forse come mai, una volta entrato in un ciclo, se premi 1 quello termina anziché continuare? Se il dubbio è questo, la risposta sta nel fatto che il predicato di uscita di tutti quei cicli while non è corretto, per due motivi. Tu infatti scrivi:

    while(risp2==0);

    ma questo significa che il while deve continuare fintanto che risp2 è 0, ma tu in realtà vuoi continuarlo quando risp2 vale 1, non 0!

    Inoltre, fai attenzione: risp2 è dichiarato di tipo char, non int; questo significa che quando leggi da tastiera il valore ad esso associato, questo sarà interpretato come carattere e non come numero, quindi la condizione del while (in definitiva) dovrebbe essere

    while ( risp2 == '1' );

    (nota gli apici singoli che indicano che 1 è un carattere e non una costante numerica...)
    every day above ground is a good one

  8. #8
    grazie mille, ora va perfettamente!

    ciao ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.