PDA

Visualizza la versione completa : [C] Problemi con un tipo struct e con una funzione


08arco80
12-09-2008, 18:14
Ciao a tutti.
Il programma viene eseguito digitando "nome_programma candidati.txt punteggi.txt" al prompt dei comandi.
candidati.txt contiene le seguenti linee:


Marco 1 3 2 2 3 3 1 4 4 1
Nicola 1 3 4 2 4 3 2 3 1 2
Franco 1 4 2 3 1 2 1 2 3 4
Ciccio 3 4 2 3 2 1 1 1 3 4
Enzo 2 2 3 3 4 1 2 3 4 2


punteggi.txt contiene le seguenti linee:


Domanda1 3 2 1 0
Domanda2 3 2 1 0
Domanda3 3 2 1 0
Domanda4 3 2 1 0
Domanda5 3 2 1 0
Domanda6 3 2 1 0
Domanda7 3 2 1 0
Domanda8 3 2 1 0
Domanda9 3 2 1 0
Domanda10 3 2 1 0


Il programma deve calcolare per ogni candidato il punteggio totale conseguito in funzione:
- delle risposte date ad ognuna delle dieci domande (risposte contenute nel primo file)
- del punteggio associato ad ognuna delle quattro risposte alle dieci domande (punteggio contenuto nel secondo file).
Infine deve venir visualizzato su schermo l'elenco dei candidati e il punteggio ottenuto, ordinato (l'elenco) dal candidato col punteggio maggiore a quello col punteggio minore.
Esempio di visualizzazione:


Marco 16
Nicola 14
Enzo 13
Ciccio 12
Franco 10


Di seguito il codice:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
char nome[20];
int dom[10];
}struct_candidato;

typedef struct
{
char nome[20];
int punti;
}struct_risultato;

int i, j, k;

struct_risultato bubble_sort(struct_risultato risultato_funz[],int ncandidati_funz);

main(int argc, char *argv[])
{
struct_candidato candidato[100];
struct_risultato risultato[100];
struct_risultato risultato_ordinato[100];

FILE *in;
int ndomande, ncandidati;
int domanda_risp[10][4];
char nome[20];
int punteggio;
int indice_risp;
int totale;

/*controllo del numero dei parametri*/
if(argc!=3)
{
printf("Numero di argomenti errato\n");
exit(0);
}

/*apertura file punteggi.txt e controllo*/
if((in=fopen(argv[2],"r"))==NULL)
{
printf("Errore apertura file %s\n",argv[2]);
exit(2);
}

/*lettura e chiusura file punteggi.txt*/
ndomande=0;
while(!feof(in))
{
fscanf(in,"%s%d%d%d%d",nome,&domanda_risp[ndomande][0],&domanda_risp[ndomande][1],\
&domanda_risp[ndomande][2],&domanda_risp[ndomande][3]);
ndomande++;
}
fclose(in);

/*apertura file candidati.txt e controllo*/
if((in=fopen(argv[1],"r"))==NULL)
{
printf("Errore apertura file %s\n",argv[1]);
exit(1);
}

/*lettura e chiusura file candidati.txt*/
ncandidati=0;
while(!feof(in))
{
fscanf(in,"%s%d%d%d%d%d%d%d%d%d%d",candidato[ncandidati].nome,&candidato[ncandidati].dom[0],\
&candidato[ncandidati].dom[1],&candidato[ncandidati].dom[2],&candidato[ncandidati].dom[3],\
&candidato[ncandidati].dom[4],&candidato[ncandidati].dom[5],&candidato[ncandidati].dom[6],\
&candidato[ncandidati].dom[7],&candidato[ncandidati].dom[8],&candidato[ncandidati].dom[9]);
ncandidati++;
}
fclose(in);

/*calcolo punteggio per ogni studente e creazione vettore di output*/
for(i=0;i<ncandidati;i++)
{
strcpy(risultato[i].nome,candidato[i].nome);
totale=0;
for(j=0;j<10;j++)
{
indice_risp=candidato[i].dom[j];
totale=totale+domanda_risp[j][(indice_risp-1)];
risultato[i].punti=totale;
}
}

risultato_ordinato[100]=bubble_sort(risultato, ncandidati);

/*visualizzazione vettore ordinato*/
for(i=0;i<ncandidati;i++)
{
printf("\n%s %d\n",risultato_ordinato[i].nome,risultato_ordinato[i].punti);
}
}

/*ordinamento vettore di output*/
struct_risultato bubble_sort(struct_risultato risultato_funz[], int ncandidati_funz)
{
char nome_provv[20];
int totale_provv;
int ordinato_funz;

ordinato_funz=0;
while(ordinato_funz=0)
{
ordinato_funz=1;
for(i=0;i<ncandidati_funz;i++)
{
if(risultato_funz[i].punti>risultato_funz[i+1].punti)
{
totale_provv=risultato_funz[i].punti;
strcpy(nome_provv,risultato_funz[i].nome);
risultato_funz[i].punti=risultato_funz[i+1].punti;
strcpy(risultato_funz[i].nome,risultato_funz[i+1].nome);
risultato_funz[i+1].punti=totale_provv;
strcpy(risultato_funz[i+1].nome,nome_provv);
ordinato_funz=0;
}
}
}
return(risultato_funz[100]);
}


Compilando ed eseguendo il codice riportato, il programma non restituisce l'output voluto.
Il problema ha a che fare con funzione bubble_sort (assicuro che le procedure di acquisizione dei dati da entrambi i file e di calcolo del punteggio funzionano perfettamente).
In particolare credo che il problema abbia a che fare con il passaggio della struttura come parametro della funzione bubble_sort e/o con la restituzione della struttura ordinata alla funzione main.
Ho provato in diversi modi ma niente da fare.
Qualsiasi suggerimento gradito.
Grazie 1000!

menphisx
13-09-2008, 08:42
***EDIT***

menphisx
13-09-2008, 08:59
Anzi proprio sbagliata bubble_sort (gli errori sono in grassetto):


/*ordinamento vettore di output*/
struct_risultato bubble_sort(struct_risultato risultato_funz[], int ncandidati_funz)
{
char nome_provv[20];
int totale_provv;
int ordinato_funz;
/*Manca la dichiarazione della variabile i*/

ordinato_funz=0;
while(ordinato_funz=0)
{
ordinato_funz=1;
for(i=0;i<ncandidati_funz;i++)
{
if(risultato_funz[i].punti>risultato_funz[i+1].punti)
{

totale_provv=risultato_funz[i].punti;
strcpy(nome_provv,risultato_funz[i].nome);
risultato_funz[i].punti=risultato_funz[i+1].punti;
strcpy(risultato_funz[i].nome,risultato_funz[i+1].nome);
risultato_funz[i+1].punti=totale_provv;
strcpy(risultato_funz[i+1].nome,nome_provv);

ordinato_funz=0;
}
}
}

return(risultato_funz[100]);

}



Corretta:


struct_risultato* bubble_sort(struct_risultato *risultato_funz, int ncandidati_funz)
{
struct_risultato tmp;
int i, j;

for(i = 0; i < ncandidati_fun; i++){
for(j = i + 1; j < ncandidati_funz; j++)
{
if(risultato_funz[i].punti > risultato_funz[j].punti)
{
tmp = risultato_funz[i];
risultato_funz[i] = risultato_funz[j];
risultato_funz[j] = tmp;
}
}
}

return risultato_funz;

}


Spazia un po' di pi il codice, e aumenta l'indentazione.
Grazie.

:ciauz:

08arco80
13-09-2008, 13:23
Grazieee! Sei stato di grande aiuto.

Loading