Problema Scarabeo C

di il
14 risposte

Problema Scarabeo C

Buona sera, premettendo che ho iniziato da poco a studiare il C e che il programma che sto realizzando deve contenere solo i comandi che sto studiando, vorrei realizzare un programma che calcoli automaticamente il punteggio delle parole in Scarabeo. Non mi sembrava affatto difficile ma nonostante ai miei occhi il programma risulti logico e completo non riesco in alcun modo ad evitare che i cicli si ripetano più di una volta, sia usando for che while, e pertanto al posto di un risultato me ne trovo uno più grande. Ho provato anche ad usare due variabili diverse per ogni ciclo per tenere il conto del punteggio per poi sommarle ed ho provato anche ad utilizzare altre variabili al posto di "i" per ogni ciclo ma non risolvo nulla. La stringa è lunga al massimo 27 caratteri perché la parola più lunga del vocabolario italiano ha 26 lettere (precipitevolissimevolmente) e ovviamente le lettere e i punteggi sono solo esempi. Questo è il codice; potreste darmi una mano?
#include <stdio.h>
int main()
{
    int x=0,i=0;
    char parola[27];

    printf("inserisci la parola\n");
    scanf("%s",&parola);
    for (i=0;parola[i]!='\0';i++){
        if (parola[i]=='a'||'b'){
            x++;
        }
    }
    for (i=0;parola[i]!='\0';i++){
        if (parola[i]=='s'||'t'){
            x+=2;
        }
    }

printf("%d\n\n",x);

return 0;
}

14 Risposte

  • Re: Problema Scarabeo C

    Guarda che in C linee di questo tipo

    if (parola=='a'||'b'){

    si scrivono così

    if (parola=='a' || parola=='b'){

    altrimenti fai tutt'altro
  • Re: Problema Scarabeo C

    Secondo me diventa tutto chiaro se immagini di avere delle parentesi aggiuntive che "esplicitano" il senso, tipo...
    if( (parola[i]) == ('a'||'b') ) {
        /* fai questo e quello */
    }
    Nel secondo caso diventerebbe...
    if( (parola[i]=='a') || (parola[i]=='b') ) {
        /* fai questo e quello */
    }
    La prima formulazione verifica se 'a' è vero o 'b' è vero (cioè, in pratica, se 'a' è diverso da zero o 'b' è diverso da zero).
    Siccome, secondo ASCII, 'a' è una costante che equivale numericamente a 97 e 'b' è una costante che equivale numericamente a 98 e tenendo presente che in C dire "falso" è un po' come dire "zero", la condizione 'a'||'b' è sempre vera.
    Se provi a fare una verifica, ti accorgi che una condizione vera viene automaticamente "tradotta" nel valore numerico 1. Ne deriva che if(parola=='a'||'b') è vero solo se parola è 1.

    Dal momento che, secondo ASCII, nessuna lettera dell'alfabeto equivale a 1 e che nel tuo programma parti dal presupposto che l'array parola contenga solo lettere dell'alfabeto, if(parola=='a'||'b') è sempre falso.

    La seconda formulazione agisce in modo del tutto diverso, verificando direttamente se nell'elemento i dell'array si trova 'a' o 'b', il che nel caso del tuo programma chiaramente può accadere o non accadere, dando come esito vero o falso a seconda delle situazioni.

    Tutto questo è implicito nella risposta di Oregon.

    Spero di averti aiutato, così come altri hanno aiutato me in passato. Se sapevi già queste cose, meglio ancora.
  • Re: Problema Scarabeo C

    AldoBaldo ha scritto:


    Tutto questo è implicito nella risposta di Oregon.
    No AldoBaldo ... non è proprio così. La prima parte

    if( (parola) == ('a'||'b') ) {

    è equivalente a

    if( (parola) == 'a') || ('b') ) {

    e dato che il termine 'b' è sempre vero, la prima parte è inutile e l'espressione è sempre vera.

    E' cosa diversa da quella che hai raccontato tu e che potrebbe confondere chi inizia ad usare il linguaggio...
  • Re: Problema Scarabeo C

    @oregon: attenzione che AldoBaldo non ha detto che le due versioni sono uguali, stava solo suggerendo all'OP di inserire delle parentesi per capire meglio. L'effetto, purtroppo, scusa AldoBaldo (ti leggo sempre con piacere), è di aver forse portato maggiore confusione all'OP ... magari ci dica lui cos'ha capito
  • Re: Problema Scarabeo C

    Mi dispiace @candaluar ma forse non hai compreso neanche tu ...

    AldoBaldo ha scritto
    Dal momento che, secondo ASCII, nessuna lettera dell'alfabeto equivale a 1 e che nel tuo programma parti dal presupposto che l'array parola contenga solo lettere dell'alfabeto, if(parola=='a'||'b') è sempre falso.


    ma non è affatto vero perché if(parola=='a'||'b') è SEMPRE VERO.

    Il problema è che AldoBaldo, nell'inserire le parentesi nel caso posto dall'OP, non ha rispettato le corrette precedenze.

    Non so se mi sono spiegato.
  • Re: Problema Scarabeo C

    Vero! L'operatore == ha la precedenza sull'operatore || (ho appena controllato). Riconsiderando la precedenza degli operatori avrei dovuto scrivere una cosa di quest'altro genere...

    ===========================

    Secondo me diventa tutto chiaro se immagini di avere delle parentesi aggiuntive che "esplicitano" il senso, tipo...
    if( (parola[i]=='a') || ('b') ) {
        /* fai questo e quello */
    }
    Nel secondo caso diventerebbe...
    if( (parola[i]=='a') || (parola[i]=='b') ) {
        /* fai questo e quello */
    }
    La prima formulazione verifica se 'a' è effettivamente uguale a parola, quindi verifica se 'b' è vero (cioè, in pratica, se 'b' è diverso da zero).

    Siccome, secondo ASCII, 'b' è una costante che equivale numericamente a 98 e tenendo presente che in C dire "falso" è un po' come dire "zero", la condizione if('b') è sempre vera.

    Dunque 'a' potrebbe essere o non essere uguale a parola, ma dal momento che 'b' è sempre vero anche if(parola=='a'||'b') è sempre vero (con || basta che anche una sola delle condizioni considerate sia vera).

    La seconda formulazione agisce in modo del tutto diverso, verificando direttamente se nell'elemento i dell'array si trova 'a' o 'b', il che chiaramente può accadere nel caso del tuo programma.

    Tutto questo è implicito nella risposta di Oregon. Spero di averti aiutato, così come altri hanno aiutato me in passato. Se sapevi già queste cose, meglio ancora.

    ============================

    Se ho sbagliato di nuovo è meglio che chiuda la giornata bevendomi un doppio litro di birra e andando subito a letto.
  • Re: Problema Scarabeo C

    AldoBaldo ha scritto:


    Vero! L'operatore == ha la precedenza sull'operatore ||
    Ok Aldo, ora ci siamo ... l'informazione data all'OP è corretta.
    (ho appena controllato).
    Senza polemica ... se queste cose non si sanno con certezza, devono essere controllate "prima" di rispondere a chi già ha le idee confuse ... Concordi?
  • Re: Problema Scarabeo C

    E chi ti dice che io non fossi certo di quel che ho scritto? Ero in errore, ma ero certo. Certissimo.
    Ora ne so una in più, a riprova del fatto che per imparare è meglio parlare che tacere. Stai sicuro che non rifarò lo stesso errore (altri sì! ), proprio per via di questa conversazione.
  • Re: Problema Scarabeo C

    AldoBaldo ha scritto:


    E chi ti dice che io non fossi certo di quel che ho scritto? Ero in errore, ma ero certo. Certissimo.
    Beh, scusa, ma questo è anche peggio ... (specialmente se scrivi ... "Tutto questo è implicito nella risposta di Oregon." ... )
  • Re: Problema Scarabeo C

    L'ho scritto perché ne ero certo! Ora sono certo del contrario. Direi "bene", no? Non avessi scritto nulla avrei continuato ad essere certo di una cosa sbagliata, magari finendo per usarla in qualche contesto nel quale avrei fatto danno.
  • Re: Problema Scarabeo C

    Grazie a tutti dei chiarimenti, sono stati utili; sono andato avanti col codice: ho aggiunto il valore di tutte le lettere e dei bonus in base a quanto sia lunga la parola (per 6 lettere +10, per 7 +30, per 8 +50) e ho aggiunto che se la parola è "scarabeo" o "scarabei" sono 100 punti bonus in totale. Prima di chiudere la discussione vorrei chiedervi suggerimenti per esplicare all' inizio con printf i punteggi assegnati alle lettere e i vari bonus: a quanto pare se aggiungo pure questi ultimi diventa troppo lungo il testo e non mi fa inserire altri caratteri in printf, potrei usare una tabella? come si fa? Oltre a questo per completare il codice mi manca solo l'inserimento della possibilità di raddoppiare o triplicare il punteggio di tutta la parola o di una o più lettere
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int x=0,i=0;
        char parola[27];
    
        printf("1 punto per A  C  E  I  O  R  S  T\n2 punti per L  M  N\n3 punti per P\n4 punti per B  D  F  G  U  V\n8 punti per H  Z\n10 punti per Q\n\n\ninserisci la parola\n");
        scanf("%s",&parola);
        for (i=0;parola[i]!='\0';i++){
            if (parola[i]=='a'||parola[i]=='c'||parola[i]=='e'||parola[i]=='i'||parola[i]=='o'||parola[i]=='r'||parola[i]=='s'||parola[i]=='t'){
                x++;
            }
            if (parola[i]=='l'||parola[i]=='m'||parola[i]=='n'){
                x+=2;
            }
            if (parola[i]=='p'){
                x+=3;
            }
            if (parola[i]=='b'||parola[i]=='d'||parola[i]=='f'||parola[i]=='g'||parola[i]=='u'||parola[i]=='v'){
                x+=4;
            }
            if(parola[i]=='h'||parola[i]=='z'){
                x+=8;
            }
            if (parola[i]=='q'){
                x+=10;
            }
        }
        if (parola[6]=='\0'){
            x+=10;
        }
        if (parola[7]=='\0'){
            x+=30;
        }
        if (parola[8]=='\0'){
            x+=50;
        }
        if((parola[0]=='s')&&(parola[1]=='c')&&(parola[2]=='a')&&(parola[3]=='r')&&(parola[4]=='a')&&(parola[5]=='b')&&(parola[6]=='e')&&(parola[7]=='o'||parola[7]=='i')){
                x+=50;
        }
    
    printf("%d\n\n",x);
    
    system ("PAUSE");
    return 0;
    }
  • Re: Problema Scarabeo C

    Non ho capito il nuovo problema
  • Re: Problema Scarabeo C

    Ho creato un printf { printf("1 punto per A C E I O R S T\n2 punti per L M N\n3 punti per P\n4 punti per B D F G U V\n8 punti per H Z\n10 punti per Q\n\n\ninserisci la parola\n"); } per enunciare tutti i punteggi; dovrei aggiungere anche gli altri bonus ma sarebbe troppo lungo per un solo printf. Come posso ovviare senza fare un altro printf? Potrei fare una tabella? come si fa?
  • Re: Problema Scarabeo C

    Perché non scrivi tante printf ? Non capisco
Devi accedere o registrarti per scrivere nel forum
14 risposte