Help programma C
ciao a tutti
ho bisogno di una mano nella risoluzione di un programma.
dopo aver inserito un record di studenti nell'apposito file.
char nome_cognome[50];
char corso_laurea[20];
char materia_tesi[30];
int voto;
int anno_laurea;
char mese[20];
***
la traccia richiede di calcolare la media dei laureati tra il 2008 e 2009
io lo risolto cosi ma non con i risultati sperati:
void media()
{
FILE *fp;
fp=fopen("File.txt","rb");
int conta=0;
while(fread(&studenti,sizeof(record),1,fp)>0)
if (studenti.anno_laurea>=2008 && studenti.anno_laurea<=2009)
printf("\n nome e cognome:\n");
printf("\t\t\t%s ",studenti.nome_cognome);
conta=conta+1;
med=conta/conta;
printf("\n numero studenti tra 2008 e 2009 e:\n");
printf("\t\t\t%f ",med);
fclose(fp);
}
***
grazie tante per l'aiuto
ho bisogno di una mano nella risoluzione di un programma.
dopo aver inserito un record di studenti nell'apposito file.
char nome_cognome[50];
char corso_laurea[20];
char materia_tesi[30];
int voto;
int anno_laurea;
char mese[20];
***
la traccia richiede di calcolare la media dei laureati tra il 2008 e 2009
io lo risolto cosi ma non con i risultati sperati:
void media()
{
FILE *fp;
fp=fopen("File.txt","rb");
int conta=0;
while(fread(&studenti,sizeof(record),1,fp)>0)
if (studenti.anno_laurea>=2008 && studenti.anno_laurea<=2009)
printf("\n nome e cognome:\n");
printf("\t\t\t%s ",studenti.nome_cognome);
conta=conta+1;
med=conta/conta;
printf("\n numero studenti tra 2008 e 2009 e:\n");
printf("\t\t\t%f ",med);
fclose(fp);
}
***
grazie tante per l'aiuto
Risposte
Che cosa non ti funziona?
Credo che l' errore sia qui:
In med devi sommare i vodi degli studenti, e fuori dal ciclo la dividi per il numero dei laureati.
Credo che l' errore sia qui:
conta=conta+1; med=conta/conta; printf("\n numero studenti tra 2008 e 2009 e:\n"); printf("\t\t\t%f ",med);
In med devi sommare i vodi degli studenti, e fuori dal ciclo la dividi per il numero dei laureati.
ciao
in pratica devo calcolarmi la media dei laureati tra il 2008 e il 2009..
poi mi esce a video l'ultimo record inserito.
grazie tante
in pratica devo calcolarmi la media dei laureati tra il 2008 e il 2009..
poi mi esce a video l'ultimo record inserito.
grazie tante

Hai provato a fare il debug?
scusami
in pratica la domanda è di calcolarmi la media dei voti dei laureati tra il 2008 e il 2009,mentre la seconda richiesta e di visualizzare le info dei studenti laureati nella sessione di aprile 2010 con voto almeno pari a 108.
mi sono un pò incasinato:
#include
#include
#include
#include "prenotati.h"
typedef struct {
char nome_cognome[50];
char corso_laurea[20];
char materia_tesi[30];
int voto;
int anno_laurea;
int mese;
} record;
record studenti;/* dichiarazione della variabile di tipo studenti*/
void inserimento();
void media();
void visualizza();
int conta;
float med;
int main()
{
char operazione;
do
{
printf("\n**************M E N U*******************************");
printf("\n----------------------------------------------------");
printf("\n 1: INSERIMENTO laureati");
printf("\n----------------------------------------------------");
printf("\n 2: CALCOLO MEDIA VOTO laureati tra 2008 e 2009");
printf("\n----------------------------------------------------");
printf("\n 3: VISUALIZZA INFO laureati aprile 2010 con 108");
printf("\n----------------------------------------------------");
printf("\n 4: ESC");
printf("\n----------------------------------------------------\n\n\n\n");
scanf("%c",&operazione);
switch(operazione)
{
case '1':
inserimento();
break;
case '2':
media();
break;
case '3':
visualizza();
break;
}}
while(operazione!='4');
}
void media()
{
FILE *fp;
fp=fopen("File.txt","rb");
int conta=0;
while(fread(&studenti,sizeof(record),1,fp)>0)
if (studenti.anno_laurea>=2008 && studenti.anno_laurea<=2009)
printf("\n nome e cognome:\n");
printf("\t\t\t%s ",studenti.nome_cognome);
conta=studenti.voto;
med=conta/conta;
printf("\n media voti laurea studenti tra 2008 e 2009 e:\n");
printf("\t\t\t%f ",med);
fclose(fp);
}
void visualizza()
{
int mesedue;
int k=0;
printf("\ninserisci mese da visualizzare info:\n");
scanf("%d",&mesedue);
FILE *fp;
fp=fopen("File.txt","rb");
while(fread(&studenti,sizeof(record),1,fp)==0)
{
if (studenti.mese,&mesedue)
{
k++;
printf("\n nome e cognome:\n");
printf("\t\t\t%c ",studenti.nome_cognome);
}
}
fclose(fp);
}
void inserimento()
{
FILE *fp;
fp=fopen("File.txt","a");
if (fp==NULL)
{printf("impossibile aprire il file");
exit(1);
}
{
printf("\n inserire nome e cognome\n");
scanf("%s",studenti.nome_cognome);
printf("\n inserire corso di laurea\n");
scanf("%s",studenti.corso_laurea);
printf("\n inserire materia di tesi\n");
scanf("%s",studenti.materia_tesi);
printf("\n inserire voto\n");
scanf("%d",&studenti.voto);
printf("\n inserire anno di laurea\n");
scanf("%d" ,&studenti.anno_laurea);
printf("\n inserire mese di laurea\n");
scanf("%d" ,&studenti.mese);
fflush(stdin);
fwrite(&studenti,sizeof(record),1,fp);
fclose(fp);
}
}
in pratica la domanda è di calcolarmi la media dei voti dei laureati tra il 2008 e il 2009,mentre la seconda richiesta e di visualizzare le info dei studenti laureati nella sessione di aprile 2010 con voto almeno pari a 108.
mi sono un pò incasinato:
#include
#include
#include
#include "prenotati.h"
typedef struct {
char nome_cognome[50];
char corso_laurea[20];
char materia_tesi[30];
int voto;
int anno_laurea;
int mese;
} record;
record studenti;/* dichiarazione della variabile di tipo studenti*/
void inserimento();
void media();
void visualizza();
int conta;
float med;
int main()
{
char operazione;
do
{
printf("\n**************M E N U*******************************");
printf("\n----------------------------------------------------");
printf("\n 1: INSERIMENTO laureati");
printf("\n----------------------------------------------------");
printf("\n 2: CALCOLO MEDIA VOTO laureati tra 2008 e 2009");
printf("\n----------------------------------------------------");
printf("\n 3: VISUALIZZA INFO laureati aprile 2010 con 108");
printf("\n----------------------------------------------------");
printf("\n 4: ESC");
printf("\n----------------------------------------------------\n\n\n\n");
scanf("%c",&operazione);
switch(operazione)
{
case '1':
inserimento();
break;
case '2':
media();
break;
case '3':
visualizza();
break;
}}
while(operazione!='4');
}
void media()
{
FILE *fp;
fp=fopen("File.txt","rb");
int conta=0;
while(fread(&studenti,sizeof(record),1,fp)>0)
if (studenti.anno_laurea>=2008 && studenti.anno_laurea<=2009)
printf("\n nome e cognome:\n");
printf("\t\t\t%s ",studenti.nome_cognome);
conta=studenti.voto;
med=conta/conta;
printf("\n media voti laurea studenti tra 2008 e 2009 e:\n");
printf("\t\t\t%f ",med);
fclose(fp);
}
void visualizza()
{
int mesedue;
int k=0;
printf("\ninserisci mese da visualizzare info:\n");
scanf("%d",&mesedue);
FILE *fp;
fp=fopen("File.txt","rb");
while(fread(&studenti,sizeof(record),1,fp)==0)
{
if (studenti.mese,&mesedue)
{
k++;
printf("\n nome e cognome:\n");
printf("\t\t\t%c ",studenti.nome_cognome);
}
}
fclose(fp);
}
void inserimento()
{
FILE *fp;
fp=fopen("File.txt","a");
if (fp==NULL)
{printf("impossibile aprire il file");
exit(1);
}
{
printf("\n inserire nome e cognome\n");
scanf("%s",studenti.nome_cognome);
printf("\n inserire corso di laurea\n");
scanf("%s",studenti.corso_laurea);
printf("\n inserire materia di tesi\n");
scanf("%s",studenti.materia_tesi);
printf("\n inserire voto\n");
scanf("%d",&studenti.voto);
printf("\n inserire anno di laurea\n");
scanf("%d" ,&studenti.anno_laurea);
printf("\n inserire mese di laurea\n");
scanf("%d" ,&studenti.mese);
fflush(stdin);
fwrite(&studenti,sizeof(record),1,fp);
fclose(fp);
}
}
Cerca di usare il tag [ code ] per inserire il codice che così è molto difficile da leggere. Cosa non funziona esattamente?
in pratica nel calcolo della media mi esce un numero diverso :il problema e che dovrei inserire la somma dei voti per quella data /il numero dei voti(che non sò come inserirlo).
mentre nella visualizzazione non compare nulla??
mentre nella visualizzazione non compare nulla??

Ciao! Ho letto il tuo programma, e credo che l' errore sia nella funzione media:
Non specifichi le parentesi per delimitare il ciclo while.
Inoltre, dovresti calcolare la somma dei voti, il numero degli studenti e calcolare la media fuori dal ciclo in questo modo:
Non specifichi le parentesi per delimitare il ciclo while.
Inoltre, dovresti calcolare la somma dei voti, il numero degli studenti e calcolare la media fuori dal ciclo in questo modo:
void media() { FILE *fp; fp=fopen("File.txt","rb"); int conta=0, med=0; while(fread(&studenti,sizeof(record),1,fp)>0) { if (studenti.anno_laurea>=2008 && studenti.anno_laurea<=2009) { printf("\n nome e cognome:\n"); printf("\t\t\t%s ",studenti.nome_cognome); conta++; med+=studenti.voto;; } } printf("\n media voti laurea studenti tra 2008 e 2009 e:\n"); printf("\t\t\t%f ",(float) med/conta); fclose(fp); }
ok grazie proverò.

ho provato funziona ,grazie tante per l'aiuto.
spero di passare l'esame a settembre,mi puoi consigliare dei siti o libri dove ci sono esercizi svolti?
grazie ancora
spero di passare l'esame a settembre,mi puoi consigliare dei siti o libri dove ci sono esercizi svolti?
grazie ancora


Di nulla!
Per un libro di testo sul c ti consigio http://books.google.it/books?id=Jz9zhsQJ_8AC&pg=PA539&dq=c&hl=it&ei=V3hxTIO2K9jNjAeFw8T7CA&sa=X&oi=book_result&ct=result&resnum=1&ved=0CC0Q6AEwAA#v=onepage&q&f=false
Auguri per l' easme!
Per un libro di testo sul c ti consigio http://books.google.it/books?id=Jz9zhsQJ_8AC&pg=PA539&dq=c&hl=it&ei=V3hxTIO2K9jNjAeFw8T7CA&sa=X&oi=book_result&ct=result&resnum=1&ved=0CC0Q6AEwAA#v=onepage&q&f=false
Auguri per l' easme!
grazie tante

a un'ultima cosa poi non ti disturbo Più,per la visualizzazione mi compare solo uno dei due record,puoi aiutarmi?
*****************
void visualizza()
{
FILE *fp;
fp=fopen("File.txt","rb");
int k=0;
while(fread(&studenti,sizeof(record),1,fp)==0)
if(strcmp(studenti.mese,"aprile")==0 && studenti.anno_laurea==2010 && studenti.voto>=108);
{
printf("\n nome e cognome:");
printf("%s ",studenti.nome_cognome);
printf("\n voto di laurea:");
printf("%d ",studenti.voto);
printf("\n mese di laurea:");
printf("%s",studenti.mese);
printf("\n anno di laurea:");
printf("%d",studenti.anno_laurea);
k++;
}
fclose(fp);
*****************
void visualizza()
{
FILE *fp;
fp=fopen("File.txt","rb");
int k=0;
while(fread(&studenti,sizeof(record),1,fp)==0)
if(strcmp(studenti.mese,"aprile")==0 && studenti.anno_laurea==2010 && studenti.voto>=108);
{
printf("\n nome e cognome:");
printf("%s ",studenti.nome_cognome);
printf("\n voto di laurea:");
printf("%d ",studenti.voto);
printf("\n mese di laurea:");
printf("%s",studenti.mese);
printf("\n anno di laurea:");
printf("%d",studenti.anno_laurea);
k++;
}
fclose(fp);
Scusa, ti è stato anche già detto, cerca di racchiudere il codice all'interno di due tag come
Inoltre,
cosa intendi dire "solo uno dei due"? Comunque:
quindi magari rivedi un po' il tuo ciclo di lettura. sicuro che abbia il comportamento desiderato?
Noto anche un 'while' che si esaurisce in un singolo 'if'
in questo esempio
Inoltre,
"pinox":
per la visualizzazione mi compare solo uno dei due record,puoi aiutarmi?
cosa intendi dire "solo uno dei due"? Comunque:
NAME fread, fwrite - binary stream input/output ... RETURN VALUE fread() and fwrite() return the number of items successfully read or written (i.e., not the number of characters). If an error occurs, or end-of-file is reached, the return value is a short item count (or zero). fread() does not distinguish between end-of-file and error, and callers must use feof(3) and ferror(3) to determine which occurred.
quindi magari rivedi un po' il tuo ciclo di lettura. sicuro che abbia il comportamento desiderato?
Noto anche un 'while' che si esaurisce in un singolo 'if'

ciao
nella visualizzazione secondo quello che ci ho messo,dovrebbe visualizzarmi tre studenti invece me ne visualizza uno(con i dati giusti voto=108,mese=aprile,anno=2010).
nella visualizzazione secondo quello che ci ho messo,dovrebbe visualizzarmi tre studenti invece me ne visualizza uno(con i dati giusti voto=108,mese=aprile,anno=2010).

"pinox":
a un'ultima cosa poi non ti disturbo Più,per la visualizzazione mi compare solo uno dei due record,puoi aiutarmi?
*****************
...
Non saprei...
Prima di leggere il file, prova a spoltarti al suo inizio.
Se non ti funziona ancora, posta il programma intero.
"pinox":
nella visualizzazione secondo quello che ci ho messo,dovrebbe visualizzarmi tre studenti invece me ne visualizza uno(con i dati giusti voto=108,mese=aprile,anno=2010).
Forse non sono stato abbastanza chiaro... sarò più prolisso (bla bla bla...):
1) fread ritorna un valore che (potrebbe essere) è zero a fine file e/o in caso di errore, altrimenti ritorna il numero degli elementi letti;
2) hai un ciclo while() che si esaurisce con un if(), infatti alla fine dell'if() statement c'è un punto e virgola.
Pertanto:
- il programma esegue ripetutamente le istruzioni all'interno del while(), finché cioè fread() ritorna zero;
- poiché presumibilmente fread() ritorna 1, l'istruzione che segue while() non viene mai eseguita;
- d'altro canto, anche se venisse eseguita, questa non fa nulla: controlla una condizione con if(), ma nulla segue a questo if() in caso la condizione sia verificata;
- poiché comunque, per poter eseguire while() il programma esegue fread() (per verificare la condizione), viene letto un record (se il puntatore file è all'inizio, il primo);
- a seguire hai una serie di statement, racchiusi fra parentesi graffe, che stampano il valore letto da fread() nella struttura studenti.
Risultato: ti visualizza qualcosa, un solo record.
Suggerimenti:
- per eseguire un ciclo while() di lettura in un file, usa la funzione feof() come controllo per vedere se il file è finito;
- attento a dove metti i punto e virgola.
