Help programma C

pinox1
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

Risposte
Omega1
Che cosa non ti funziona?

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.

pinox1
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
:cry:

Omega1
Hai provato a fare il debug?

pinox1
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);

}
}

apatriarca
Cerca di usare il tag [ code ] per inserire il codice che così è molto difficile da leggere. Cosa non funziona esattamente?

pinox1
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??
:?

Omega1
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:

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); 
} 


pinox1
ok grazie proverò.
:wink:

pinox1
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

:D :D

Omega1

pinox1
grazie tante
:D

pinox1
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);

Rggb1
Scusa, ti è stato anche già detto, cerca di racchiudere il codice all'interno di due tag come
 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' ;)

pinox1
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).
:oops:

Omega1
"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.

Rggb1
"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. ;)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.