Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Aiuto programma in c
Forum - C/C++ - Aiuto programma in c

Avatar
nicspa92 (Normal User)
Newbie


Messaggi: 6
Iscritto: 29/06/2012

Segnala al moderatore
Postato alle 19:01
Venerdì, 29/06/2012
Sto provando a fare un programma in c: leggere da un file come sotto

numero matricole
matricola
numero esami
esame1 voto1
esame2 voto2
matricola
numero esami
esame1 voto1
..

memorizzaro su apposita struttura, ecc. Io ho fatto questo :


/*
Leggere da file una struttura dati matricole ed esami

Il file ha la seguente struttura:
<numero matricole>
<matricola>
<numero esami>
<esame> <descrizione esame> <voto esame>
<esame> <descrizione esame> <voto esame>
..
<matricola>
<numero esami>
<esame> <descrizione esame> <voto esame>
..
*/

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

#include <cstdlib>
#include <iostream>

#define MAX_CHARS 100

using namespace std;

/* Data structure matricole */
typedef struct matricole matricole_t;

struct matricole
{
char * matricola;
int nEsami;
} ;

/* Inizializza data structure matricole */
matricole_t * init_matricole( const unsigned size);

/* Data structure esami */
typedef struct esami esami_t;

struct esami
{
char * matricola;
char * esame;
char * nomeEsame;
int votoEsame;

} ;

/* Inizializza data structure esami */
esami_t * init_esami( const unsigned size );


/* Rilascia la memoria allocata per la struttura dati */
void free_matricole( matricole_t *matricole );
void free_esami( esami_t *esami);

/* Main */
main()
{
FILE *fileptr;
char buffer[ MAX_CHARS ];
int nMatricole;
int lMatricole;
char matricola[ MAX_CHARS ];
int nEsami;
char esame[ MAX_CHARS ];
char nomeEsame[ MAX_CHARS ];
int votoEsame;
int pM;
int pE;
int n;
matricole_t *matricole = NULL;
esami_t *esami = NULL;

printf( "Nome del file? " );
scanf( "%s", buffer );

fileptr = fopen( buffer, "rt" );
if (fileptr == NULL)
{
printf ( "Errore durante l' apertura del file richiesto.\n" );
system("PAUSE");
return 0;
}

pM = 0;
pE = 0;
n = 0;
nMatricole = 0;

fscanf( fileptr, "%d", &nMatricole );

printf ("Numero matricole: %d\n", nMatricole);
n++;
for (int y=0; y < nMatricole; y++)
{
fscanf( fileptr, "%s", &matricola);
printf ("Matricola: %s\n", matricola);

nEsami = 0;
fscanf( fileptr, "%d", &nEsami );
printf ("Numero esami: %d\n", nEsami);
matricole = (matricole_t *)realloc(matricole,sizeof(matricole_t)*n);
matricole[pM].matricola = strdup(matricola);
matricole[pM].nEsami = nEsami;
pM++;

for (int i=0; i < nEsami; i++)
{
fscanf( fileptr, "%s %s %d", &esame , &nomeEsame , &votoEsame );
printf ("%s %s %s %d %d\n", matricola, esame, nomeEsame, votoEsame, pE);

esami = (esami_t *)realloc(esami,sizeof(esami_t)*n);
esami[pE].matricola = strdup(matricola);
esami[pE].esame = strdup(esame);
esami[pE].nomeEsame = strdup(nomeEsame);
esami[pE].votoEsame = votoEsame;
pE++;
}
}
fclose( fileptr );

int scelta;
for(;;)
{

/* Menu operazioni disponibili */

printf("\nGestione di un file contenente studenti ed esami\n");
printf("\n1) Visualizza dati");
printf("\n2) Visualizza esami matricola");
printf("\n3) ..");
printf("\n4) ..");
printf("\n0) Fine elebaorazione\n");
printf("\nScelta operazione (1..4,0) ");
scanf("%d",&scelta);
while(!getchar()=='\n');

if(!scelta)
break;

/* Richiama funzione scelta */
switch(scelta)
{
case 1:
for (int i=0; i != pM; i++)
{
printf ("Matricola: %s %d\n", matricole.matricola, matricole.nEsami);
}

for (int y=0; y != pE ; y++)
{
printf ("%s %s %s %d \n", esami[y].matricola, esami[y].esame, esami[y].nomeEsame, esami[y].votoEsame);
}

break;
case 2:
printf( "Quale matricola? " );
scanf( "%s", &matricola );

for (int y=0; y != pE ; y++)
{
if (esami[y].matricola = matricola)
printf ("%s %s %s %d\n", esami[y].matricola ,esami[y].esame, esami[y].nomeEsame, esami[y],votoEsame);
}

break;
free_matricole (matricole);
free_esami (esami);
}
}

}

/* Inizializza la struttura dati */
matricole_t * init_matricole( const unsigned size )
{
matricole_t *matricole = (matricole_t *) malloc( size * sizeof(matricole_t) );

if( matricole == NULL )
return NULL;

return matricole;
}

/* Inizializza la struttura dati */
esami_t * init_esami( const unsigned size )
{
esami_t *esami = (esami_t *) malloc( size * sizeof(esami_t) );

if( esami == NULL )
return NULL;

return esami;
}

/* Rilascia la memoria allocata per la struttura dati */
void free_matricole( matricole_t *matricole )
{
if( matricole != NULL )
free( matricole );
}


/* Rilascia la memoria allocata per la struttura dati */
void free_esami( esami_t *esami )
{
if( esami != NULL )
free( esami );
}


Quando visualizzo le strutture separate vanno bene, ma se voglio gli esami di una matricola li visualizza tutti. Perche ???????

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6114
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 23:09
Venerdì, 29/06/2012
Codice sorgente - presumibilmente C/C++

  1. for (int y=0; y != pE ; y++)
  2. {
  3. if (esami[y].matricola = matricola)



Linea 3 e' totalmente sbagliata... non e' nemmeno un confronto, stai facendo un assegnazione (che di fatto ritorna true ad ogni iterazione).

Devi usare questa funzione per confrontare due stringhe: http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

Ultima modifica effettuata da pierotofy il 29/06/2012 alle 23:09


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote
Avatar
nicspa92 (Normal User)
Newbie


Messaggi: 6
Iscritto: 29/06/2012

Segnala al moderatore
Postato alle 22:27
Domenica, 01/07/2012
Grazie infinite per l' aiuto.
Ora se devo cancellare un esame è giusto, dopo aver richiesto matricola ed esame è giusto

  for (int y=0; y != pE ; y++)
           {
               if ((strcmp (matricola,esami[y].matricola) == 0) &&
                   (strcmp (esame,esami[y].esame) == 0))
               {    
                  free (esami);
               }
           }

Mentre per inserire un nuovo esame, dopo aver richiesto tutti i dati necessari è giusto

          pE++;
           n++;
           esami = (esami_t *)realloc(esami,sizeof(esami_t)*n);    
           esami[pE].matricola = strdup(matricola);
           esami[pE].esame = strdup(esame);
           esami[pE].nomeEsame = strdup(nomeEsame);
           esami[pE].votoEsame = votoEsame;

PM Quote
Avatar
anthony015 (Member)
Pro


Messaggi: 116
Iscritto: 20/05/2011

Segnala al moderatore
Postato alle 11:11
Lunedì, 02/07/2012
2 piccoli suggerimenti:
1)Utilizza il tag Code quando posti del codice
2)Per domande riguardo il linguaggio C posta nella sezione C, non C++

PM Quote
Avatar
nicspa92 (Normal User)
Newbie


Messaggi: 6
Iscritto: 29/06/2012

Segnala al moderatore
Postato alle 11:28
Lunedì, 02/07/2012
Con l' aiuto precedente sono riuscito ad andare avandi. Grazie ancora. Ora mi sono rimasti due problemi sull' inserimento del nuovo esame e sulla cancellazione di un esame.
Allego il codice. Grazi.
Codice sorgente - presumibilmente Plain Text

  1.  

/*
    Leggere da file una struttura dati matricole ed esami

    Il file ha la seguente struttura:
    <numero matricole>
    <matricola>
    <numero esami>
    <esame> <descrizione esame> <voto esame>
    <esame> <descrizione esame> <voto esame>
    ..
     <matricola>
    <numero esami>
    <esame> <descrizione esame> <voto esame>
    ..
*/

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

#include <cstdlib>
#include <iostream>

#define MAX_CHARS    100

using namespace std;

/* Data structure matricole */
typedef struct matricole matricole_t;

struct matricole
{
    char* matricola;
    int nEsami;
} ;

/* Inizializza data structure matricole */
matricole_t * init_matricole( const unsigned size);

/* Data structure esami */
typedef struct esami esami_t;

struct esami
{  
    char*   esame;
    char*   nomeEsame;
    int votoEsame;
    char* matricola;

} ;

/* Inizializza data structure esami */
esami_t * init_esami( const unsigned size );


/* Rilascia la memoria allocata per la struttura dati */
void free_matricole( matricole_t *matricole );
void free_esami( esami_t *esami);

/* Main */
main()
{
    FILE *fileptr;
    char buffer[ MAX_CHARS ];
    int nMatricole;
    int lMatricole;
    char matricola[ MAX_CHARS ];
    int nEsami;
    char esame[ MAX_CHARS ];
    char nomeEsame[ MAX_CHARS ];
    int votoEsame;
    int pM;
    int pE;
    int n;
    
    int sVoti;
    int sEsami;
    int stEsami;
    int stVoti;
    float mVoti;
    
    int ok;
    
    matricole_t *matricole = NULL;  
    esami_t *esami = NULL;
    
    printf( "Nome del file? " );
    scanf( "%s", buffer );

    fileptr = fopen( buffer, "rt" );
    if (fileptr == NULL)
    {
         printf ( "Errore durante l' apertura del file richiesto.\n" );
         system("PAUSE");
         return 0;
    }

    pM = 0;
    pE = 0;
    n = 1;
    nMatricole = 0;
       
       
    fscanf( fileptr, "%d", &nMatricole );
    
//    printf ("Numero matricole: %d\n", nMatricole);
    n++;
    for (int y=0; y < nMatricole; y++)
    {
         fscanf( fileptr, "%s", &matricola);
//        printf ("Matricola: %s\n", matricola);
        
        nEsami = 0;    
        fscanf( fileptr, "%d", &nEsami );
//        printf ("Numero esami: %d\n", nEsami);        
        matricole = (matricole_t *)realloc(matricole,sizeof(matricole_t)*n);    
        matricole[pM].matricola = strdup(matricola);
        matricole[pM].nEsami = nEsami;
        pM++;

        for (int i=0; i < nEsami; i++)
        {
               fscanf( fileptr, "%s %s %d", &esame , &nomeEsame , &votoEsame );
//            printf ("%s %s %s %d %d\n", matricola, esame, nomeEsame, votoEsame, pE);  
            
            esami = (esami_t *)realloc(esami,sizeof(esami_t)*n);    
            esami[pE].matricola = strdup(matricola);
            esami[pE].esame = strdup(esame);
            esami[pE].nomeEsame = strdup(nomeEsame);
            esami[pE].votoEsame = votoEsame;
            
            pE++;
        }
    }    
    fclose( fileptr );    
              
  int scelta;
  for(;;)
  {
    system("CLS");
    /* Menu operazioni disponibili */
    printf("\nGestione di un file contenente studenti ed esami\n");
    printf("\n1) Visualizza dati matricole ed esami");
    printf("\n2) Visualizza singola matricola");
    printf("\n3) Modifica voto esame");
    printf("\n4) Inserisci nuovo esame");
    printf("\n5) Cancella esame");
    printf("\n0) Fine elebaorazione\n");
    printf("\nScelta operazione (1..5,0) ");
    scanf("%d",&scelta);
    while(!getchar()=='\n');

    if(!scelta)
      break;

    /* Richiama funzione scelta */
    switch(scelta)
    {
      /* Visualizza tutto il file matricole ed esami */            
      case 1:
          system("CLS");
          stVoti = 0;
          for (int i=0; i != pM; i++)
          {
                printf ("Matricola: %s Numero esami sostenuti: %d\n", matricole.matricola, matricole.nEsami);
              stEsami = stEsami +  matricole.nEsami;
              sVoti = 0;        
              for (int y=0; y != pE ; y++)
              {
                  if (strcmp (esami[y].matricola, matricole.matricola) == 0)
                  {
                      printf ("%s %s %d\n", esami[y].esame, esami[y].nomeEsame, esami[y].votoEsame);  
                      sVoti = sVoti + esami[y].votoEsame;
                      stVoti = stVoti + esami[y].votoEsame;
                  }
              }
              mVoti = (float)sVoti / matricole.nEsami;
              printf("Totale voti matricola: %d Media voti matricola: %.2lf\n", sVoti, mVoti);
              
              printf ("\n");
          }
          
          mVoti = (float)stVoti / stEsami;
          printf("Totale generale voti: %d Media generale voti: %.2lf\n", stVoti, mVoti);
          system("PAUSE");
          break;
      /* Visualizza matricole ed esami */    
      case 2:
           system("CLS");
           printf( "Digitare il codice matricola? " );
           scanf( "%s", &matricola );
           ok = 0;
           for (int i=0; i != pM; i++)
           {
               if (strcmp (matricola, matricole.matricola) == 0)
               ok = 1;
           }
           if (ok != 1)
           {
               printf ("La matricola richiesta non e' presente\n");
               system("PAUSE");
               break;
           }    
           system("CLS");    
           printf ("Situazione esami matricola: %s\n", matricola);
          
           sEsami = 0;
           sVoti = 0;  
           for (int y=0; y != pE ; y++)
           {
               if (strcmp (esami[y].matricola,matricola) == 0)
               {  
                   printf ("%s %s %s %d\n", esami[y].matricola ,esami[y].esame, esami[y].nomeEsame, esami[y].votoEsame);  
                   sEsami = sEsami + 1;
                   sVoti = sVoti + esami[y].votoEsame;
               }
           }
           mVoti = (float)sVoti / sEsami;
           printf("Esami sostenuti: %d Totale voti: %d Media voti : %.2lf\n", sEsami, sVoti, mVoti);
           system("PAUSE");  
           break;
      /* Modifica voto esame */    
      case 3:
           system("CLS");
           printf( "Digitare il codice matricola? " );
           scanf( "%s", &matricola );
           ok = 0;
           for (int i=0; i != pM; i++)
           {
               if (strcmp (matricola, matricole.matricola) == 0)
               ok = 1;
           }
           if (ok != 1)
           {
               printf ("La matricola richiesta non e' presente\n");
               system("PAUSE");
               break;
           }
           printf( "Digitare il codice esame? " );
           scanf( "%s", &esame );
           ok = 0;
           for (int y=0; y != pE ; y++)
           {
               if ((strcmp (matricola,esami[y].matricola) == 0) &&
                   (strcmp (esame,esami[y].esame) == 0))
               {    
                  ok = 1;
                  strcpy(nomeEsame,esami[y].nomeEsame);
                  votoEsame = esami[y].votoEsame;
               }
           }
           if (ok != 1)
           {
               printf ("L' esame richiesto non e' presente\n");
               system("PAUSE");
               break;
           }  
           printf ("Esame : %s Voto: %d\n", nomeEsame, votoEsame);
           printf( "Digitare il nuovo voto ? " );
           scanf( "%d", &votoEsame);
           /* Aggiorno il voto dell' esame richiesto */
           for (int y=0; y != pE ; y++)
           {
               if ((strcmp (matricola,esami[y].matricola) == 0) &&
                   (strcmp (esame,esami[y].esame) == 0))
                  esami[y].votoEsame = votoEsame;
           }
           system("PAUSE");  
           break;
      /* Inserisce nuovo esame */    
      case 4:
           system("CLS");
           printf( "Digitare il codice matricola " );
           scanf( "%s", &matricola );
           ok = 0;
           for (int i=0; i != pM; i++)
           {
               if (strcmp (matricola, matricole.matricola) == 0)
               ok = 1;
           }
           if (ok != 1)
           {
               printf ("La matricola richiesta non e' presente\n");
               system("PAUSE");
               break;
           }
           printf( "Digitare il codice esame " );
           scanf( "%s", &esame );
           printf( "Digitare la descrizione esame" );
           scanf( "%s", &nomeEsame );
           printf( "Digitare il voto esame" );
           scanf( "%d", &votoEsame);
           pE++;
           n++;
           esami = (esami_t *)realloc(esami,sizeof(esami_t)*n);    
           esami[pE].matricola = strdup(matricola);
           esami[pE].esame = strdup(esame);
           esami[pE].nomeEsame = strdup(nomeEsame);
           esami[pE].votoEsame = votoEsame;
           break;
      /* Cancella esame */
      case 5:
           system("CLS");
           printf( "Digitare il codice matricola? " );
           scanf( "%s", &matricola );
           ok = 0;
           for (int i=0; i != pM; i++)
           {
               if (strcmp (matricola, matricole.matricola) == 0)
               ok = 1;
           }
           if (ok != 1)
           {
               printf ("La matricola richiesta non e' presente\n");
               system("PAUSE");
               break;
           }
           printf( "Digitare il codice esame? " );
           scanf( "%s", &esame );
           ok = 0;
           for (int y=0; y != pE ; y++)
           {
               if ((strcmp (matricola,esami[y].matricola) == 0) &&
                   (strcmp (esame,esami[y].esame) == 0))
               {    
                  ok = 1;
                  strcpy(nomeEsame,esami[y].nomeEsame);
                  votoEsame = esami[y].votoEsame;
               }
           }
           if (ok != 1)
           {
               printf ("L' esame richiesto non e' presente\n");
               system("PAUSE");
               break;
           }  
           for (int y=0; y != pE ; y++)
           {
               if ((strcmp (matricola,esami[y].matricola) == 0) &&
                   (strcmp (esame,esami[y].esame) == 0))
               {    
                  free (esami);
               }
           }
           break;
          
    }
  }
free_matricole (matricole);
free_esami (esami);  

}

/* Inizializza la struttura dati */
matricole_t * init_matricole( const unsigned size )
{
    matricole_t *matricole = (matricole_t *) malloc( size * sizeof(matricole_t) );

    if( matricole == NULL )
        return NULL;

    return matricole;
}

/* Inizializza la struttura dati */
esami_t * init_esami( const unsigned size )
{
    esami_t *esami = (esami_t *) malloc( size * sizeof(esami_t) );

    if( esami == NULL )
        return NULL;

    return esami;
}

/* Rilascia la memoria allocata per la struttura dati */
void free_matricole( matricole_t *matricole )
{
    if( matricole != NULL )
        free( matricole );
}


/* Rilascia la memoria allocata per la struttura dati */
void free_esami( esami_t *esami )
{
    if( esami != NULL )
        free( esami );
}


PM Quote