Ciao ragazzi, ho un problema con un esercizio, vi allego il testo:
Si desidera sviluppare un programma in linguaggio C per gestire in modo informatico un
registro di esame.
Il registro è memorizzato in un ?le di testo con nome registro.txt e contiene i dati
di N studenti, ove N è il numero intero scritto nella prima riga del ?le. Dopo questa prima
riga, ogni riga successiva contiene il dato relativo ad un singolo studente, indicando il numero di matricola dello studente (numero intero compreso 1 e 999999) ed il voto conseguito
(numero intero con valore tra 18 e 30, oppure zero per indicare che l’esame non è ancora
stato sostenuto).
Il programma può essere attivato in due modi diversi.
Se viene attivato passando come primo parametro sulla linea di comando la parola stat
allora deve fornire le seguenti statistiche: numero di studenti promossi (e relativa percentuale sul totale, espressa con una cifra dopo la virgola) e voto medio degli studenti promossi
(indicato con una sola cifra dopo la virgola).
Il programma può anche essere attivato passando come primo parametro la parola
voto, come secondo parametro il numero di matricola di uno studente e come ultimo parametro il voto conseguito dallo studente. In questo caso il programma deve inserire nel?le il voto dello studente, segnalando però errore nel caso che lo studente non sia iscritto
all’esame (ossia il suo numero di matricola non compaia nel ?le) oppure abbia già superato
l’esame (ossia voto diverso da zero nella riga contenente la sua matricola).
Ad esempio se il ?le registro.txt contenesse i seguenti dati:
3
33467 30
24356 0
224678 18
ed il programma – supposto chiamarsi esame – venisse attivato con la seguente riga di
comando:
esame stat
allora il programma dovrebbe produrre il seguente output:
promossi = 2 (66.7 %)
voto medio = 24.0
Se invece il programma venisse attivato nel seguente modo:
esame voto 24356 24
allora dopo l’esecuzione del programma il ?leregistro.txtdovrebbe contenere i seguenti
dati:
3
33467 30
24356 24
224678 18
Il mio problema riguarda la seconda parte dell'esercizio quando sulla linea di comando metto voto matricola e il voto conseguito dallo studente (nella mia risoluzione si riferisce alla parte successiva a if(argc==4)). Il programma mi da sempre che ntrovato=1 anche se inserisco un voto diverso da 0.Grazie mille...
La mia risoluzione è:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char *argv[])
{
FILE *finput;
int matricola, votos, numstud;
int somma=0, cont=0, ntrovato=0;
int studente, votostud;
float statistica, media;
char riga[100];
if ( argc!=2 && argc!=4)
{
fprintf(stderr, "Errore sulla linea di comando");
return -1;
}
if (argc==2)
{
if((finput=fopen("registro.txt", "r"))==NULL)
{
fprintf(stderr,"Errore in apertura file \n");
return -2;
}
if ((strcmp(argv[1], "stat"))!=0)
{
printf("ERRORE\n");
}
else
{
fgets(riga, 100, finput);
sscanf(riga, "%d%*c", &numstud);
while (fscanf(finput, "%d %d", &matricola, &votos)!=EOF)
{
if(votos>=18)
{
cont++;
somma+=votos;
}
}
statistica= (float) cont/numstud*100;
media= (float) somma/cont;
printf("\nPromossi = %d (%.1f%%)\n", cont, statistica);
printf("voto medio= %.1f\n", media);
}
fclose(finput);
}
if(argc==4)
{
if(strcmp(argv[1], "voto")!=0)
printf("Errore sulla linea di comando\n");
else
{
if((finput=fopen("registro.txt", "r"))==NULL)
{
fprintf(stderr,"Errore in apertura file \n");
return -2;
}
studente=atoi(argv[2]);
votostud=atoi(argv[3]);
fgets(riga, 100, finput);
sscanf(riga, "%d%*c", &numstud);
while ((fscanf(finput, "%d %d", &matricola, &votos))!=EOF)
{
if((studente!=matricola) || ((studente==matricola) && (votos!=0)) )
ntrovato=1;
else
ntrovato=0;
}
fclose(finput);
}
if(ntrovato==0)
{
if((finput=fopen("registro.txt","a"))==NULL)
{
fprintf(stderr,"Errore in apertura file di ingresso\n");
return -4;
}
fprintf(finput, "%d %d", studente, votostud);
}
fclose(finput);
}
return 0;
}