Ciao a tutti.
Il programma viene eseguito digitando "nome_programma candidati.txt punteggi.txt" al prompt dei comandi.
candidati.txt contiene le seguenti linee:
codice:
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:
codice:
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:
codice:
Marco 16
Nicola 14
Enzo 13
Ciccio 12
Franco 10
Di seguito il codice:
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!