Problema con un programma in C

di il
7 risposte

Problema con un programma in C

Ciao a tutti,
sono nuovo del forum sto studiando programmazione in C e avrei bisogno di una mano. Vi posto il testo dell'esercizio e la mia risoluzione. Utilizzo codeblocks e nella compilazione del debug non ci sono warning. Sbaglio qualcosa a livello logico?
Ringrazio in anticipo chiunque abbia voglia di rispondere.
Non me ne vogliate, ho provato a leggere il regolamento ma non funziona il link di sotto... se ho violato qualche regola dite pure.

Si desidera scrivere un programma per analizzare le abitudine degli italiani durante le vacanze estive.
Un primo file, il cui nome è passato come primo argomento sulla linea di comando, contiene un elenco di persone (nome e cognome) e di informazioni relative alle località di vacanza. Ogni riga del file si riferisce ad una singola persona ed è formattata come segue:
<NOME> <COGNOME> <LOCALITA> <REGIONE >
Dove NOME (stringa) e COGNOME (stringa) sono il nome e cognome di ciascuna persona, LOCALITA (stringa) è il nome della località dove tale persona ha trascorso le vacanze e REGIONE è la regione dove si trova la località.
Si facciano inoltre le seguenti assunzioni:
• Tutti i campi sono separati tra loro da uno o più spazi;
• Il numero di persone (e di conseguenza la dimensione del file) non è noto a priori;
• Le stringhe sono lunghe al più 40 caratteri e non contengono spazi al loro interno (eg. Emilia-Romagna, Valle_d'Aosta);
• Il formato e il contenuto del file sono corretti.
Un secondo file, dal nome prefissato “regioni.txt”, contiene l'elenco dei nomi regioni italiane di cui si vuole la statistica. Le regioni sono al massimo 20 (in generale il file potrebbe contenere meno di 20 regioni).
Il programma deve creare un terzo file, il cui nome viene specificato come secondo argomento sulla linea di comando, le cui righe conterranno, per ogni regione del secondo file, il nome della regione e il numero di persone che vi ha trascorso le vacanze. I due campi devono essere separati da uno spazio.
Il programma deve inoltre stampare a video il numero di persone che hanno trascorso le vacanze in una regione non presente nell'elenco di regioni specificato nel file “regioni.txt”.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 40
#define M 20

typedef struct {
char regione[M];
int npersone;
}struttura;

int main(int argc, char* argv[])
{
//parte dichiarativa//
FILE*fr1,*fr2,*fw;
struttura risultato[M];
char base[N];
char regione[M][N];
int i,j,regioni_non_in_elenco,flag,dim,indice;

//controllo linea di comando//
if (argc != 3)
{fprintf(stderr,"Errore linea di comando");
return 1; }
//apertura file//
fr1 = fopen(argv[1],"r");

if (fr1 == NULL)
{
fprintf(stderr,"Errore apertura file");
return 1;
}

fr2 = fopen("regioni.txt","r");
if (fr2 == NULL)
{
fprintf(stderr,"Errore apertura file");
return 1;
}

fw = fopen(argv[2],"w");
if (fw == NULL)
{
fprintf(stderr,"Errore apertura file");
return 1;
}
//algoritmo//
for ( i= 0; i<N ;i++)
{
fscanf(fr2,"%s",regione);
}
dim = i;

//chiusura file//
fclose(fr2);

while ((fscanf(fr1,"%*s %*s %*s %s",base))!= EOF)
{
for (i=0; i<dim; i++)
if (strcmp(base, regione)!= 0)
{regioni_non_in_elenco ++;}

if (strcmp(base, regione)== 0)
{
flag = 0;
for (j=0; j<indice; j++)
{
if ((strcmp(regione,risultato[j].regione)==0) && flag != 1)
{risultato[j].npersone ++;
flag = 1;}

if ((strcmp(regione,risultato[j].regione)!=0) && flag == 0)
{strcpy(risultato.regione,regione[j]);
indice ++;}
}
}
}

fclose(fr2);

//ciclo di stampa struttura
printf("Regione Persone");
for ( i=0; i<indice; i++)
{fprintf(fw,"%40s %d",risultato.regione,risultato.npersone);}

fclose(fw);

return 0;
}

7 Risposte

  • Re: Problema con un programma in C

    Usa i tag CODE altrimenti il codice non si legge facilmente ...

    E soprattutto ... la tua domanda precisa qual è? Non ho capito ...
  • Re: Problema con un programma in C

    
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N 40
    #define M 20
    
    typedef struct {
    char regione[M];
    int npersone;
    }struttura;
    
    int main(int argc, char* argv[])
    {
    //parte dichiarativa//
    FILE*fr1,*fr2,*fw;
    struttura risultato[M];
    char base[N];
    char regione[M][N];
    int i,j,regioni_non_in_elenco,flag,dim,indice;
    
    //controllo linea di comando//
    if (argc != 3)
    {fprintf(stderr,"Errore linea di comando");
    return 1; }
    //apertura file//
    fr1 = fopen(argv[1],"r");
    
    if (fr1 == NULL)
    {
    fprintf(stderr,"Errore apertura file");
    return 1;
    }
    
    fr2 = fopen("regioni.txt","r");
    if (fr2 == NULL)
    {
    fprintf(stderr,"Errore apertura file");
    return 1;
    }
    
    fw = fopen(argv[2],"w");
    if (fw == NULL)
    {
    fprintf(stderr,"Errore apertura file");
    return 1;
    }
    //algoritmo//
    for ( i= 0; i<N ;i++)
    {
    fscanf(fr2,"%s",regione[i]);
    }
    dim = i;
    
    //chiusura file//
    fclose(fr2);
    
    while ((fscanf(fr1,"%*s %*s %*s %s",base))!= EOF)
    {
    for (i=0; i<dim; i++)
    if (strcmp(base, regione[i])!= 0)
    {regioni_non_in_elenco ++;}
    
    if (strcmp(base, regione[i])== 0)
    {
    flag = 0;
    for (j=0; j<indice; j++)
    {
    if ((strcmp(regione[i],risultato[j].regione)==0) && flag != 1)
    {risultato[j].npersone ++;
    flag = 1;}
    
    if ((strcmp(regione[i],risultato[j].regione)!=0) && flag == 0)
    {strcpy(risultato[i].regione,regione[j]);
    indice ++;}
    }
    }
    }
    
    fclose(fr2);
    
    //ciclo di stampa struttura
    printf("Regione Persone");
    for ( i=0; i<indice; i++)
    {fprintf(fw,"%40s %d",risultato[i].regione,risultato[i].npersone);}
    
    fclose(fw);
    
    return 0;
    }
    Il programma non gira.. e non capisco se è un problema del mio compilatore... Ci sono errori nel codice?
    Grazie per la precedente risposta.
  • Re: Problema con un programma in C

    Intanto usa l'indentazione per rendere più leggibile il codice!
    Detto questo, cosa significa "il programma non gira"?
    La compilazione produce errori? Il programma non stampa nulla? Stampa valori diversi da quelli che ti aspetti? Dove pensi sia il problema?
    Un po' di informazioni in più e di debug, anche con delle semplici printf sparse qua e là fanno risparmiare tempo a noi e a te
  • Re: Problema con un programma in C

    Intanto nella riga

    for (j=0; j<indice; j++)

    la variabile indice non ha un valore perché non è mai stata usata.
  • Re: Problema con un programma in C

    Grazie a tutti per i consigli. Scusate se non sono molto chiaro ma è il primissimo corso di informatica.
    Il debug l'ho fatto e non mi rivela né warning né errori. Ho inizializzato la variabile indice a 0, ma una volta lanciato il programma mi da un messaggio di errore apertura file.
    I file che dovrebbero essere inseriti da linea di comando li ho creati e li ho inseriti da code blocks in
    project --> set program arguments
    Ciò che mi preme di più è capire se l'algoritmo è corretto.
    Grazie a tutti per l'aiuto.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N 40
    #define M 20
    
    typedef struct {
     char regione[M];
     int npersone;
     }struttura;
    
    int main(int argc, char* argv[])
    {
        //parte dichiarativa//
        FILE*fr1,*fr2,*fw;
        struttura risultato[M];
        char base[N];
        char regione[M][N];
        int i,j,regioni_non_in_elenco =0,flag =0,dim =0,indice = 0;
    
        //controllo linea di comando//
        if (argc != 3)
        {fprintf(stdout,"Errore linea di comando");
            return 1; }
        //apertura file//
        fr1 = fopen(argv[1],"r");
    
        if (fr1 == NULL)
        {
            fprintf(stdout,"Errore apertura file");
            return 1;
        }
    
        fr2 = fopen("regioni.txt","r");
        if (fr2 == NULL)
        {
            fprintf(stdout,"Errore apertura file");
            return 1;
        }
    
        fw = fopen(argv[2],"w");
        if (fw == NULL)
        {
            fprintf(stdout,"Errore apertura file");
            return 1;
        }
        //algoritmo//
        for ( i= 0; i<N ;i++)
        {
            fscanf(fr2,"%s",regione[i]);
        }
        dim = i;
    
        //chiusura file//
        fclose(fr2);
    
        while ((fscanf(fr1,"%*s %*s %*s %s",base))!= EOF)
        {
            for (i=0; i<dim; i++)
                if (strcmp(base, regione[i])!= 0)
                {regioni_non_in_elenco ++;}
    
                if (strcmp(base, regione[i])== 0)
                {
                    flag = 0;
                    for (j=0; j<indice; j++)
                        {
                        if ((strcmp(regione[i],risultato[j].regione)==0) && flag != 1)
                        {risultato[j].npersone ++;
                        flag = 1;}
    
                        if ((strcmp(regione[i],risultato[j].regione)!=0) && flag == 0)
                        {strcpy(risultato[i].regione,regione[j]);
                        indice ++;}
                        }
                }
        }
    
        fclose(fr2);
    
        //ciclo di stampa struttura
        printf("Regione                         Persone");
        for ( i=0; i<indice; i++)
        {fprintf(fw,"%40s %d",risultato[i].regione,risultato[i].npersone);}
    
        fclose(fw);
    
        return 0;
    }
    
  • Re: Problema con un programma in C

    Scusa, ragioniamo ... se indice lo metti uguale a zero, la for non sarà eseguita ... il valore di indice deve essere maggiore di zero perché la for venga eseguita. Ma la domanda è

    cosa dovrebbe rappresentare la variabile indice?

    quale valore dovrebbe avere prima della for?

    Per l'errore del file (anche se non l'hai mostrato, e devi farlo quando scrivi nel forum perché non ce lo possiamo inventare ...), potrebbe essere che il file non esiste o non è nella cartella opportuna ...
  • Re: Problema con un programma in C

    Grazie a tutti. Sono riuscito a risolvere. Ho trovato un errore nella parentesi di chiusura del for e un problema con i file.
Devi accedere o registrarti per scrivere nel forum
7 risposte