Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1

    [C]Problema nella funzione

    Ciao,
    devo fare un programma che inseriti una frase e una parola svolga a seconda della scelta dell'utente una delle seguenti opzioni:
    1) Comunicare da quanti caratteri è composta la frase;
    2) Comunicare da quante parole è composta la frase;
    3) Comunicare il numero di volte in cui nella frase compare una parola scelta dall'utente.

    Solo che per svolgere questo programma ho usato la 3 funzioni, che però mi danno degli errori, qualcuno potrebbe gentilmente spiegarmi dove e che cosa ho sbagliato (in quanto e da sole 2 settimane che le sto usando e ho ancora delle grandi lacune a riguardo)
    codice:
    int ncar (char);   //Funzione che comunica da quante parole è composta la frase
    int npar (char);  //Funzione che conta il numero di volte che compare una parola in una frase
    int nugua (char, char); //Funzione che conta il numero di volte che compare una parola in una frase
    Vi posto anche il codice completo così da poter vedere come avevo pensato di svolgere tutto il programma
    codice:
    //Fare un programma che:
    // 1) Comunicare da quanti caratteri è composta la frase;
    // 2) Comunicare da quante parole è composta la frase;
    // 3) Comunicare il numero di volte in cui nella frase compare una parola scelta dall'utente.
    #include<stdio.h>
    #include <string.h> 
    #include <ctype.h>
    int ncar (char); //Funzione che comunica da quante parole è composta la frase
    int npar (char); //Funzione che conta il numero di volte che compare una parola in una frase
    int nugua (char, char);//Funzione che conta il numero di volte che compare una parola in una frase
    int main()
    {
        char parola [25];
        char frase [500];
        int op=0, cnt=0; //'cnt' serve da contatore, 'op' serve come opzione dell'utente
        printf("Scrivi una parola: \n");
        fgets(parola, 25, stdin);
        for(cnt=0; cnt < strlen(parola); cnt++)
        {
          parola[cnt]=toupper(parola[cnt]);
        }           
        printf("Scrivi una frase: \n");
        fgets(frase, 500, stdin); //La funzione fgets() legge una linea dallo stream immagazzinandola nel buffer puntato da s
        for (cnt = 0; cnt < strlen(frase); cnt++) //strlen() - calcola la lunghezza di una stringa 
        {
          frase[cnt]=toupper(frase[cnt]);
        }
        do
        {
        printf("Che cosa vuoi vedere?\n");
        printf(" 1) Da quanti caratteri e\' composta la frase\n");
        printf(" 2) Da quante parole e\' composta la frase\n");
        printf(" 3) Il numero di volte in cui nella frase compare una parola scelta dall'utente\n");
        scanf("%d", &op);
        }
        while(op!=1 && op!=2 && op!=3);
        switch (op)
        {
               case 1:
               printf("Il numero totale di caratteri da cui e\' composta la frase e\': %d", ncar(frase));
               break;
               case 2:
               printf("Il numero di parole da cui e\' composta la frase e\': %d", npar(frase));
               break;
               default:
               printf("Il numero di parole uguali nella frase e\': %d", nugua(parola, frase));
        } 
        system("pause");
        return 0;
    }
    //Implementazione della funzione che conta i caratteri
    int ncar ( char frase1)
    {
        int cnt1=0, tot1=0;
        for (cnt1 = 0; cnt1 < strlen(frase1); cnt1++) //strlen() - calcola la lunghezza di una stringa 
        {
            if(frase1[cnt]!=' ')
            tot1++;
        }
        return tot1;
    }
    //Implementazione della funzione che comunica da quante parole è composta la frase
    int npar (char frase2)
    {
        int cnt2, tot2=0;
        for (cnt2 = 1; cnt2 < strlen(frase2); cnt2++) //strlen() - calcola la lunghezza di una stringa 
        {
         frase2[cnt2]=toupper(frase2[cnt2]);
         if ((frase2[cnt2]>='A')&&(frase2[cnt2]<='Z')&&(!((frase2[cnt2-1]>='A')&&(frase2[cnt2-1]<='Z')))
         tot2++;
        }
        if(frase2[0]==((frase2[cnt2]>='A')&&(frase2[cnt2]<='Z')))
          tot2++;
        return tot2;
    }
    //Implementazione della funzione che conta il numero di volte che compare una parola in una frase
    int nugua (char pcer, char frase3)
    {
         int i=0, cnt3, tot3=0, tot4=0; //i serve da contatore, tot3 seve per contare i caratteri uguai, e tot4  serve per contare il numero di parole uguali
         for(cnt3=0; cnt3 < strlen(pcer); cnt3++)
         {
          parola[cnt3]=toupper(pcer[cnt3]);
         }  
         for (cnt3 = 1; cnt3 < strlen(frase3); cnt3++) //strlen() - calcola la lunghezza di una stringa 
         {
             frase3[cnt3]=toupper(frase3[cnt3]);
             if (strcmp(pcer[tot3],frase3[cnt3])==0) 
             {
              tot3++;
                 if(tot3==strlen(pcer))
                 tot4++;
             }
             else
             tot3=0;
         }
         return tot4;
    }
    Ciao e grazie mille in anticipo
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Tanto per cominciare le funzioni accettano dei semplici char e non dei puntatori a char ... quindi non capisco come possano esaminare le frasi ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Comunemente è buona regola specificare l'errore riportato, ed eventualmente mostrare la riga di codice in cui si genera l'errore.
    Nel frattempo, ti mostro alcuni aspetti da migliorare:

    1. l'uso di scanf è ormai deprecato per vari motivi così come mostrato in molti post

    2. è sempre bene fare un controllo sull'input, per verificare l'esattezza del tipo di dati inserito

    3. il codice è ridondante (nel senso italiano e non informatico del termine), come ad esempio qui per quanto riguarda la variabile cnt1 :

    codice:
    int cnt1=0, tot1=0;     
    for (cnt1 = 0; cnt1 < strlen(frase1); cnt1++)

  4. #4
    Ok,
    quindi come e cosa dovrei cambiare nel codice per renderlo giusto ?
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da 21Edoardo96
    Ok,
    quindi come e cosa dovrei cambiare nel codice per renderlo giusto ?
    Scusa ma, secondo me, non funziona così ... in questo modo tu presenti codice del tutto sbagliato e vuoi come risposta il codice completamente corretto.

    Ti ho detto che le funzioni non possono accettare dei semplici char ma devono trattare "puntatori a char" proprio perché trattano stringhe.

    Parti da questo suggerimento per provare a risolvere da solo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Ciao,
    volevo chiedervi 2 cose:
    1) Dove dovrei eseguire il controllo delll'input dato che l'ho già fatto sulla scelta dell'utente;
    2) Come potrei rendere meno 'ridondante' il codice?

    P.S. Io uso la scanf giacchè è l'unico modo che conosco per l'input

    Ciao e grazie
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

  7. #7
    in questo modo tu presenti codice del tutto sbagliato e vuoi come risposta il codice completamente corretto
    Ciao,
    Io non voglio assolutamente avere tutto il codice pronto perchè questo sarebbe improduttivo per me e solo una perdita di tempo per vo, io vi volevo solo chiedere se mi potevate far vedere come correggere solo un pezzo dicodice così da potermi permettere l'esecuzione di quest'ultimo poiché, così facendo, questo mi permetterebbe di vedere se ci sono degli errori logici.

    Ciao e grazie mille
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da 21Edoardo96
    Ciao,
    Io non voglio assolutamente avere tutto il codice pronto perchè questo sarebbe improduttivo per me e solo una perdita di tempo per vo, io vi volevo solo chiedere se mi potevate far vedere come correggere solo un pezzo dicodice così da potermi permettere l'esecuzione di quest'ultimo poiché, così facendo, questo mi permetterebbe di vedere se ci sono degli errori logici.

    Ciao e grazie mille
    Ma ti ho già detto due volte di correggere i parametri char in puntatori a char e non hai commentato mai questo suggerimento ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Ciao,
    ho sistemato i parametri char in puntatori a char.

    Volevo solo sapere come mai mi dice che vi è un errore sintattico prima del tot2 (quello che nel codice ho colorato di rosso).
    codice:
    //Fare un programma che:
    // 1) Comunicare da quanti caratteri è composta la frase;
    // 2) Comunicare da quante parole è composta la frase;
    // 3) Comunicare il numero di volte in cui nella frase compare una parola scelta dall'utente.
    #include <stdio.h>
    #include <string.h> 
    #include <ctype.h>
    int ncar (char[]); //Funzione che comunica da quante parole è composta la frase
    int npar (char[]); //Funzione che conta il numero di volte che compare una parola in una frase
    int nugua (char[], char[]);//Funzione che conta il numero di volte che compare una parola in una frase
    int main()
    {
        char parola [25];
        char frase [500];
        int op=0, cnt=0; //'cnt' serve da contatore, 'op' serve come opzione dell'utente
                 
        printf("Scrivi una frase: \n");
        fgets(frase, 500, stdin); //La funzione fgets() legge una linea dallo stream immagazzinandola nel buffer puntato da s
        for (cnt = 0; cnt < strlen(frase); cnt++) //strlen() - calcola la lunghezza di una stringa 
        {
          frase[cnt]=toupper(frase[cnt]);
        }
        do
        {
        printf("Che cosa vuoi vedere?\n");
        printf(" 1) Da quanti caratteri e\' composta la frase\n");
        printf(" 2) Da quante parole e\' composta la frase\n");
        printf(" 3) Il numero di volte in cui nella frase compare una parola scelta dall'utente\n");
        scanf("%d", &op);
        }
        while(op!=1 && op!=2 && op!=3);
        switch (op)
        {
               case 1:
               printf("Il numero totale di caratteri da cui e\' composta la frase e\': %d", ncar(frase));
               break;
               case 2:
               printf("Il numero di parole da cui e\' composta la frase e\': %d", npar(frase));
               break;
               default:
               printf("Scrivi una parola: \n");
               fgets(parola, 25, stdin);
               for(cnt=0; cnt < strlen(parola); cnt++)
               {
                  parola[cnt]=toupper(parola[cnt]);
               }       
               printf("Il numero di parole uguali nella frase e\': %d", nugua(parola, frase));
        } 
        system("pause");
        return 0;
    }
    //Implementazione della funzione che conta i caratteri
    int ncar ( char frase1[])
    {
        int cnt1=0, tot1=0;
        for (cnt1 = 0; cnt1 < strlen(frase1); cnt1++) //strlen() - calcola la lunghezza di una stringa 
        {
            if(frase1[cnt1]!=' ')
            tot1++;
        }
        return tot1;
    }
    //Implementazione della funzione che comunica da quante parole è composta la frase
    int npar (char frase2[])
    {
        int cnt2, tot2=0;
        for (cnt2 = 1; cnt2 < strlen(frase2); cnt2++) //strlen() - calcola la lunghezza di una stringa 
        {
         frase2[cnt2]=toupper(frase2[cnt2]);
         if ((frase2[cnt2]>='A')&&(frase2[cnt2]<='Z')&&(!((frase2[cnt2-1]>='A')&&(frase2[cnt2-1]<='Z')))
         tot2++;  
        }
        if(frase2[0]==((frase2[cnt2]>='A')&&(frase2[cnt2]<='Z')))
          tot2++;
        return tot2;
    }
    //Implementazione della funzione che conta il numero di volte che compare una parola in una frase
    int nugua (char pcer[], char frase3[])
    {
         int i=0, cnt3, tot3=0, tot4=0; //i serve da contatore, tot3 seve per contare i caratteri uguai, e tot4  serve per contare il numero di parole uguali
         for(cnt3=0; cnt3 < strlen(pcer); cnt3++)
         {
          pcer[cnt3]=toupper(pcer[cnt3]);
         }  
         for (cnt3 = 1; cnt3 < strlen(frase3); cnt3++) //strlen() - calcola la lunghezza di una stringa 
         {
             frase3[cnt3]=toupper(frase3[cnt3]);
             if (pcer[tot3]==frase3[cnt3]) 
             {
              tot3++;
                 if(tot3==strlen(pcer))
                 tot4++;
             }
             else
             tot3=0;
         }
         return tot4;
    }
    Ciaoe grazie mille
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Hai letto con attenzione il messaggio d'errore ?

    Cosa dice esattamente ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.