Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    49

    [C] Problemi con un tipo struct e con una funzione

    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!

  2. #2

  3. #3
    Anzi è proprio sbagliata bubble_sort (gli errori sono in grassetto):
    codice:
    /*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:
    codice:
    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.


  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2008
    Messaggi
    49
    Grazieee! Sei stato di grande aiuto.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.