Esercizio sulle stringhe in C

di il
6 risposte

Esercizio sulle stringhe in C

Salve a tutti, sto impazzendo da qualche ora sul seguente programma da svolgere
Devo realizzare che acquisisca utilizzando la funzione gets una stringa composta da un massimo di 5 parole separati da spazi, per un totale di massimo 60 caratteri. Il programma dovrebbe:

a) Stabilire quante sono effettivamente le parole contenute nella stringa
b) Calcolare la media delle lunghezze delle parole
c) produrre una statistica sulla lunghezza delle parole

Nel punto c) con statistica si intende, visualizzare a video ad esempio:

3 parole di 4 caratteri
1 parola da 6 caratteri
1 parola da 5 caratteri

Io per ora ho risolto i primi due punti, col seguente codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LUNG_STRING 61
#define N 5

int main()
{
int i,d,r;
char stringa[LUNG_STRING];
int quante_parole=0;
int n_blank=0;
float media_parole;

printf("Inserisci una stringa di caratteri separati da spazi\n\n");
gets(stringa);
i=1;
while(stringa[i]!='\0')
    {
    if ((stringa[i]==' ')&&(stringa[i-1]!=' '))
    quante_parole++;
    i++;
    }

if (stringa[i-1]!=' ')
quante_parole++;

if((quante_parole>N))
    printf("\nSono state inserite troppe parole\n");
else
printf("Le parole presenti nella fase sono %d\n",quante_parole);

d=1;
while(stringa[d]!='\0')
    {
    if(stringa[d]==' ')
        n_blank++;
    d++;
    }

r = strlen(stringa);

if(quante_parole<=N)
    {
    media_parole = ((float)r - (float)n_blank)/(float)quante_parole;
    printf("La lunghezza media delle parole e': %.2f\n",media_parole);
    }

return EXIT_SUCCESS;
}
Per il punto c) avevo pensato a spezzare la stringa con strtok e calcolarmi la lunghezza delle sottostringhe ma non saprei come fare, comunque ecco come ho spezzato la stringa:

char *p;
p = strtok(stringa, " ");
 while (p != NULL)
 {
   printf("%s\n", p);
   p = strtok(NULL, " ");
 }
Il problema è che mi sembra una via complessa, quindi vorrei chiedere una mano a voi per risolvere quest'ultimo punto

6 Risposte

  • Re: Esercizio sulle stringhe in C

    Che ne dici di usare delle funzioni? io avrei iniziato da subito con strok visto che il punto a te le chiede. Di conseguenza puoi tenere un array di strutture del tipo: lunghezza->occorrenza.
    Così alla fine sapreai rispondere alla domanda C leggendo le occorrenze delle lunghezza dall'array.
  • Re: Esercizio sulle stringhe in C

    Uhm non ho ben capito il suggerimento...
  • Re: Esercizio sulle stringhe in C

    Ho fatto un pseudocodice alla veloce. ma dovrebbe chiarirti le idee.
    
    struct statistica
    {
       int lunghezza;
       int occorrenza;
    }
    
    ..............
    
    struct statistica statistiche[100]; //per semplicità ho messo 100 lunghezze diverse
    int indiceInStatistiche = 0;
    
    ................
    char *p;
    p = strtok(stringa, " ");
    while (p != NULL)
    {
       printf("%s\n", p);
       int len = strlen(p);
       PiazzaLunghezzaInStatistiche(len);
       p = strtok(NULL, " ");
    }
    ................
    void PiazzaLunghezzaInStatistiche(int len)
    {
           for(int i = 0; i < indiceInStatistiche ; i++)
           {
              if(statistiche[i].lunghezza == len)
                  {
                    statistiche[i].occorrenza++;
                    break;
                 }
           }
           if(i == indiceInStatistiche) // lunghezza non trovata
            {
                statistiche[i].lunghezza = len;
                statistiche.occorrenza = 1;
                indiceInStatistiche++;
            }
    }
    
  • Re: Esercizio sulle stringhe in C

    Ah, ancora a lezione non ci hanno spiegato il tipo struct... Io come risoluzione intuitiva avevo pensato di scorrere la stringa, un po come quando ho misurato quante parole ci sono, solo che stavolta è più complesso perché non so come salvare quanti caratteri ho letto e passare alla parola successiva..
  • Re: Esercizio sulle stringhe in C

    P - stringa ti da quanti caratteri hai letto. Invece di usare una struct puoi usare un vettore di interi dove la posizione indica la lunghezza. Quindi se nella posizione 4 ci piazzi il valore 2 sai che ci sono due stringhe di lunghezza 4.
  • Re: Esercizio sulle stringhe in C

    Grazie per le risposte, ho risolto con il seguente codice, utilizzando istruzioni semplici
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    #define LUNG_STRING 60
    #define TRUE 1
    #define FALSE 0
    #define N_PAROLE 5
    
    
    
    int main()
    {
    int indice,vett[LUNG_STRING+1],cont_str,tot_carat;
    int sono_in_parola,quante_parole,cont_carat,lenght_stringa;
    char stringa[LUNG_STRING+1];
    
    printf("inserisci una stringa di max %d caratteri e contenente max %d parole:\n", LUNG_STRING, N_PAROLE);
    gets(stringa);
    
    lenght_stringa=strlen(stringa);
    if(lenght_stringa>LUNG_STRING)
        printf("Sono stati inseriti troppi caratteri\n");
    else
    {
        for(indice=0; indice <= LUNG_STRING; indice++)
            vett[indice] = 0;    /*  */
        sono_in_parola=FALSE; /* si inializza a FALSE perché non ho ancora scandito la stringa */
        cont_carat=0;
        quante_parole=0;       /* Tutte le variabili sono inizializzate a zero */
        cont_str=0;
        tot_carat=0;
    
        while(cont_str<=lenght_stringa)
            {
            if(!sono_in_parola)
                {
                    if(isalpha(stringa[cont_str]))
                    {
                    sono_in_parola=TRUE;
                    cont_carat++;
                    }
                }
            else    /* sono in parola */
                {
                if(isalpha(stringa[cont_str]))
                    cont_carat++;
                else
                        {
                        quante_parole++;
                        sono_in_parola=FALSE;
                        vett[cont_carat]++;
                        tot_carat = tot_carat+cont_carat;
                        cont_carat=0;
                        }
                }
            cont_str++;
            }
        if(quante_parole<(N_PAROLE+1))
        {
        printf("La stringa contiene %d parole\n", quante_parole);
        printf("La lunghezza media delle parole e' %.2f\n",(float)tot_carat / (float)quante_parole);
        printf("La stringa contiene:\n");
        for(indice = 1; indice <= LUNG_STRING; indice++)
            if(vett[indice] > 0)
                printf (" %2d parole da %d caratteri\n",vett[indice], indice);
        }
        else
            printf("Sono state inserite piu' di %d parole\n",N_PAROLE);
    }
    return EXIT_SUCCESS;
    }
Devi accedere o registrarti per scrivere nel forum
6 risposte