[C]Aiuto su programma
ciao a tutti ho un problema con questo programma in c ,non riesco a compilare in maniera corretta la ricerca .
grazie a tutti per l'aiuto.
grazie a tutti per l'aiuto.
TRACCIA:
4) Si rediga un programma in C nella gestione di un file che tenga traccia del calendario giornaliero per le prenotazioni aule per esami universitari.
Contenga una struttura:
.aula (char)
.nome esame(char 30)
.cognome docente(char 30)
.anno in corso(int)
.ora inizio(int ora,int minuti)
.tempo della prova (int)
Domande:
1) inserimento nuovi record
2) visualizzare informazioni di tutte le prenotazioni esami/esoneri primo anno
3) vvvisualizzare le informazioni delle aule prenotate nella fascia orario compresa dalle 10:00 alle 13:00
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N20 FILE * fp; typedef struct { char aula[3]; char nome_esame[30]; char docente[30]; int anno; int ora; int minuti; int tempo_prova; }prenotazione; prenotazione mia_prenotazione; //prototipo delle funzioni// void inserimento(); void ricerca(); void visualizza(); int main() { int operazione; fp=fopen("C:\\File.txt","r+b"); /*apertura file modalità binaria in scrittura e lettura*/ if (!fp) //equivale a :if(fp=(fopen(..,..)==NULL) { fp=fopen("C:\\File.txt","w+b"); // Apre o crea un file binario in lettura e scrittura// if (!fp) { printf("Impossibile aprire il file\n"); exit(1); } } do { printf("SCEGLI OPERAZIONE"); printf("\n******************************************************\n"); printf("\n1: INSERIMENTO prenotazione\n"); printf("\n2: VISUALIZZA INFO prenotazioni primo anno di corso\n"); printf("\n3: VISUALIZZA AULE prenotate dalle 10:00 alle 13:00\n"); printf("\n4: E. S. C.\n"); printf("\n******************************************************\n"); scanf("%d",&operazione); switch(operazione) { case 1: inserimento(); break; case 2: ricerca(); break; case 3: visualizza(); break; }} while(operazione!='3'); fclose(fp); return 0; } void inserimento(void) { FILE *fp; fflush(stdin); if((fp=fopen("C:\\File.txt","a"))==NULL) { printf("\nimpossibile aprire il file"); exit(1); } else { printf("\n inserire aula\n"); scanf("%s",mia_prenotazione.aula); printf("\n inserire nome esame\n"); scanf("%s",mia_prenotazione.nome_esame); printf("\n inserire nome docente\n"); scanf("%s",mia_prenotazione.docente); printf("\n inserire anno di corso\n"); scanf("%d",&mia_prenotazione.anno); printf("\n inserire ora e minuti inizio lezione\n"); scanf("%d" "%d",&mia_prenotazione.ora,&mia_prenotazione.minuti); printf("\n inserire durata prova\n"); scanf("%d" ,&mia_prenotazione.tempo_prova); fflush(stdin); fwrite(&mia_prenotazione,sizeof(prenotazione),1,fp); } fclose(fp); } void ricerca() { prenotazione datiletti; int k=0; FILE *fp; fp=fopen("C:\\File.txt","r"); fseek(fp,0L, SEEK_SET); while(fread(&mia_prenotazione,sizeof(prenotazione),1,fp)>0) { if(mia_prenotazione.anno>=0 && mia_prenotazione.anno<=1) k ++; printf("\n******************************************************\n"); printf("\t%s",mia_prenotazione.aula); printf("\t%s",mia_prenotazione.docente); printf("\t%s\n",mia_prenotazione.nome_esame); printf("\n******************************************************\n"); } fclose(fp); } void visualizza() { FILE *fp; fp=fopen("C:\\File.txt","r"); fseek(fp,0L, SEEK_SET); while(fread(&mia_prenotazione,sizeof(prenotazione),1,fp)==1) { if(mia_prenotazione.ora>=10 && mia_prenotazione.anno<=13) printf("\t%s",mia_prenotazione.aula); printf("\t%s",mia_prenotazione.docente); printf("\t%s\n",mia_prenotazione.nome_esame); } fclose(fp); }
Risposte
Ciao!
Ho letto la tue traccia, e posso suggerirti le seguenti modifiche:
1-> Passa per argomento la variabile del file alle funzioni, in questo modo, rendi il programma più flassibile, ed eviti il problema delle chiusure/ aperture sovrapposte.
2-> EVITA come la peste l' istruzione "fflush(stdin)", il suo comportamento è imprevedibile.
3-> Ho scritto alcune piccole modifiche al programma - vedi i commenti -. Per maggiori informazioni, eventualmente posta i tuoi dubbi.
Ecco il sorgente:
Ho letto la tue traccia, e posso suggerirti le seguenti modifiche:
1-> Passa per argomento la variabile del file alle funzioni, in questo modo, rendi il programma più flassibile, ed eviti il problema delle chiusure/ aperture sovrapposte.
2-> EVITA come la peste l' istruzione "fflush(stdin)", il suo comportamento è imprevedibile.
3-> Ho scritto alcune piccole modifiche al programma - vedi i commenti -. Per maggiori informazioni, eventualmente posta i tuoi dubbi.
Ecco il sorgente:
#include <stdio.h> #include <stdlib.h> #include <string.h> //FILE *fp; MODIFICA elimino la variabile locale fp typedef struct prenotazione { char aula[3]; char nome_esame[30]; char docente[30]; int anno; int ora; int minuti; int tempo_prova; }prenotazione; //prenotazione mia_prenotazione; MODIFICA: abolisci la variabile globale "mia_prenotazione" //prototipo delle funzioni// void inserimento(FILE **); // MODIFICA in tutte le funzioni void ricerca(FILE **); // passo il riferimento al file di lavoro. void visualizza(FILE **); void SvuotaBuffer(); int main(int argv, char *argc[]) { int operazione; char percorso[]="G:\\file\\file.txt"; FILE *fp; fp=fopen(percorso,"r+b"); /*fp=fopen("C:\\File.txt","r+b"); apertura file modalità binaria in scrittura e lettura*/ if (!fp) //equivale a :if(fp=(fopen(..,..)==NULL) { // Se il file non esiste fp=fopen(percorso, "wb+"); if (!fp) { printf("Impossibile aprire il file\n"); return 0; // MODIFRCA il file viene aperto solo i modalità di lettura e scrittura } } do { printf("SCEGLI OPERAZIONE"); printf("\n******************************************************\n"); printf("\n1: INSERIMENTO prenotazione\n"); printf("\n2: VISUALIZZA INFO prenotazioni primo anno di corso\n"); printf("\n3: VISUALIZZA AULE prenotate dalle 10:00 alle 13:00\n"); printf("\n4: E. S. C.\n"); printf("\n******************************************************\n"); scanf("%d",&operazione); switch(operazione) { case 1:{ inserimento(&fp); break; } case 2:{ ricerca(&fp); break; } case 3:{ visualizza(&fp); break; } } } while (operazione<=3); // while(operazione!='3'); // modifica cambio della condizione d' ucsita fclose(fp); return 0; } void inserimento(FILE **g) { // fflush(stdin); MODIFICA EVITA COME LA PESTE fflush(stdin): il suo comportamento è imprevedibile!! SvuotaBuffer(); prenotazione mia_prenotazione; printf("\n inserire aula\n"); scanf("%s", &mia_prenotazione.aula); printf("\n inserire nome esame\n"); scanf("%s", &mia_prenotazione.nome_esame); printf("\n inserire nome docente\n"); scanf("%s", &mia_prenotazione.docente); printf("\n inserire anno di corso\n"); scanf("%d",&mia_prenotazione.anno); printf("\n inserire ora e minuti inizio lezione\n"); scanf("%d" "%d",&mia_prenotazione.ora,&mia_prenotazione.minuti); printf("\n inserire durata prova\n"); scanf("%d" ,&mia_prenotazione.tempo_prova); fflush(stdin); fwrite(&mia_prenotazione,sizeof(prenotazione),1, *g); } void ricerca(FILE **g) { //prenotazione datiletti; prenotazione mia_prenotazione; // MODIFIACA inserisco la variabile locale mia_prenotazione int k=0; fseek(*g,0L, SEEK_SET); while(fread(&mia_prenotazione,sizeof(prenotazione),1, *g)>0) { if(mia_prenotazione.anno>=0 && mia_prenotazione.anno<=1) k ++; printf("\n******************************************************\n"); printf("\t%s",mia_prenotazione.aula); printf("\t%s",mia_prenotazione.docente); printf("\t%s\n",mia_prenotazione.nome_esame); printf("\n******************************************************\n"); } //fclose(fp); MODIFICA elimino la cciusura del file } void visualizza(FILE **g) { /*FILE *fp; fp=fopen("C:\\File.txt","r"); MODIFICA elimino la variabile locale fp */ prenotazione mia_prenotazione; // MODIFIACA inserisco la variabile locale mia_prenotazione fseek(*g,0L, SEEK_SET); // while(fread(&mia_prenotazione, sizeof(prenotazione), 1 , *g)!= EOF) MODIFICA cambio la condizione d' uscita del file while (!feof( *g)) { // if(mia_prenotazione.ora>=10 && mia_prenotazione.anno<=13) MODIFICA Cambio la condizione if fread(&mia_prenotazione, sizeof(prenotazione), 1 , *g); if(mia_prenotazione.ora>=10 && mia_prenotazione.ora<=13) { printf("\t%s",mia_prenotazione.aula); printf("\t%s",mia_prenotazione.docente); printf("\t%s\n",mia_prenotazione.nome_esame); } } //fclose(fp); MODIFICA elimino la cciusura del file } void SvuotaBuffer() // MODIFICA aggiungo una piccola funzione per svuotare il buffer. { while (getchar() != '\n') ; }
grazie tante per l'aiuto
mi dà errore nella riga:
fwrite(&mia_prenotazione,sizeof(prenotazione),1, *g);-->indicandomi 'g' come errore.
mi dà errore nella riga:
fwrite(&mia_prenotazione,sizeof(prenotazione),1, *g);-->indicandomi 'g' come errore.

ho sistemato gli errori ,ora l'unica cosa che non funziona è che il video compare per pochi secondi...

Se sei in windows, aggiungi la riga:
system("pause");
dove vuoi che il calcolatore si fermi in attesa di un tuo cenno
system("pause");
dove vuoi che il calcolatore si fermi in attesa di un tuo cenno

grazie tante per il consiglio ,
ho provato ma non dà cenno di vita.
ho provato ma non dà cenno di vita.

"pinox":
grazie tante per il consiglio ,
ho provato ma non dà cenno di vita.
Non so proprio che dirti! A me funziona. Riposta il codice con le correzioni
ecco speriamo bene:
**********
#include
#include
#include
typedef struct prenotazione
{
char aula[3];
char nome_esame[30];
char docente[30];
int anno;
int ora;
int minuti;
int tempo_prova;
}prenotazione;
//prototipo delle funzioni//
void inserimento(FILE **); // MODIFICA in tutte le funzioni
void ricerca(FILE **); // passo il riferimento al file di lavoro.
void visualizza(FILE **);
void SvuotaBuffer();
int main(int argv, char *argc[])
{
int operazione;
char percorso[]="G:\\file\\file.txt";
FILE *fp;
fp=fopen(percorso,"r+b"); /*fp=fopen("C:\\File.txt","r+b"); apertura file modalità binaria in scrittura e lettura*/
if (!fp) //equivale a :if(fp=(fopen(..,..)==NULL)
{
// Se il file non esiste
fp=fopen(percorso, "wb+");
if (!fp)
{
printf("Impossibile aprire il file\n");
return 0; // MODIFRCA il file viene aperto solo i modalità di lettura e scrittura
}
}
do
{
printf("SCEGLI OPERAZIONE");
printf("\n******************************************************\n");
printf("\n1: INSERIMENTO prenotazione\n");
printf("\n2: VISUALIZZA INFO prenotazioni primo anno di corso\n");
printf("\n3: VISUALIZZA AULE prenotate dalle 10:00 alle 13:00\n");
printf("\n4: E. S. C.\n");
printf("\n******************************************************\n");
scanf("%d",&operazione);
system("pause");
switch(operazione)
{
case 1:{
inserimento(&fp);
break;
}
case 2:{
ricerca(&fp);
break;
}
case 3:{
visualizza(&fp);
break;
}
}
} while (operazione<=3);
// while(operazione!='3'); // modifica cambio della condizione d' ucsita
fclose(fp);
system("pause");
return 0;
}
void inserimento(FILE **g)
{
// fflush(stdin); MODIFICA EVITA COME LA PESTE fflush(stdin): il suo comportamento è imprevedibile!!
SvuotaBuffer();
prenotazione mia_prenotazione;
printf("\n inserire aula\n");
scanf("%s", &mia_prenotazione.aula);
printf("\n inserire nome esame\n");
scanf("%s", &mia_prenotazione.nome_esame);
printf("\n inserire nome docente\n");
scanf("%s", &mia_prenotazione.docente);
printf("\n inserire anno di corso\n");
scanf("%d",&mia_prenotazione.anno);
printf("\n inserire ora e minuti inizio lezione\n");
scanf("%d" "%d",&mia_prenotazione.ora,&mia_prenotazione.minuti);
printf("\n inserire durata prova\n");
scanf("%d" ,&mia_prenotazione.tempo_prova);
fflush(stdin);
fwrite(&mia_prenotazione,sizeof(prenotazione),1, *g);
system("pause");
}
void ricerca(FILE **g)
{
//prenotazione datiletti;
prenotazione mia_prenotazione; // MODIFIACA inserisco la variabile locale mia_prenotazione
int k=0;
fseek(*g,0L, SEEK_SET);
while(fread(&mia_prenotazione,sizeof(prenotazione),1, *g)>0)
{
if(mia_prenotazione.anno>=0 && mia_prenotazione.anno<=1)
k ++;
printf("\n******************************************************\n");
printf("\t%s",mia_prenotazione.aula);
printf("\t%s",mia_prenotazione.docente);
printf("\t%s\n",mia_prenotazione.nome_esame);
printf("\n******************************************************\n");
}
//fclose(fp); MODIFICA elimino la cciusura del file
}
void visualizza(FILE **g)
{
/*FILE *fp;
fp=fopen("C:\\File.txt","r"); MODIFICA elimino la variabile locale fp */
prenotazione mia_prenotazione; // MODIFIACA inserisco la variabile locale mia_prenotazione
fseek(*g,0L, SEEK_SET);
// while(fread(&mia_prenotazione, sizeof(prenotazione), 1 , **g)!= EOF) MODIFICA cambio la condizione d' uscita del file
while (!feof( *g))
{
// if(mia_prenotazione.ora>=10 && mia_prenotazione.anno<=13) MODIFICA Cambio la condizione if
fread(&mia_prenotazione, sizeof(prenotazione), 1 , *g);
if(mia_prenotazione.ora>=10 && mia_prenotazione.ora<=13)
{
printf("\t%s",mia_prenotazione.aula);
printf("\t%s",mia_prenotazione.docente);
printf("\t%s\n",mia_prenotazione.nome_esame);
}
}
//fclose(fp); MODIFICA elimino la cciusura del file
}
void SvuotaBuffer() // MODIFICA aggiungo una piccola funzione per svuotare il buffer.
{
while (getchar() != '\n') ;
}

**********
#include
#include
#include
typedef struct prenotazione
{
char aula[3];
char nome_esame[30];
char docente[30];
int anno;
int ora;
int minuti;
int tempo_prova;
}prenotazione;
//prototipo delle funzioni//
void inserimento(FILE **); // MODIFICA in tutte le funzioni
void ricerca(FILE **); // passo il riferimento al file di lavoro.
void visualizza(FILE **);
void SvuotaBuffer();
int main(int argv, char *argc[])
{
int operazione;
char percorso[]="G:\\file\\file.txt";
FILE *fp;
fp=fopen(percorso,"r+b"); /*fp=fopen("C:\\File.txt","r+b"); apertura file modalità binaria in scrittura e lettura*/
if (!fp) //equivale a :if(fp=(fopen(..,..)==NULL)
{
// Se il file non esiste
fp=fopen(percorso, "wb+");
if (!fp)
{
printf("Impossibile aprire il file\n");
return 0; // MODIFRCA il file viene aperto solo i modalità di lettura e scrittura
}
}
do
{
printf("SCEGLI OPERAZIONE");
printf("\n******************************************************\n");
printf("\n1: INSERIMENTO prenotazione\n");
printf("\n2: VISUALIZZA INFO prenotazioni primo anno di corso\n");
printf("\n3: VISUALIZZA AULE prenotate dalle 10:00 alle 13:00\n");
printf("\n4: E. S. C.\n");
printf("\n******************************************************\n");
scanf("%d",&operazione);
system("pause");
switch(operazione)
{
case 1:{
inserimento(&fp);
break;
}
case 2:{
ricerca(&fp);
break;
}
case 3:{
visualizza(&fp);
break;
}
}
} while (operazione<=3);
// while(operazione!='3'); // modifica cambio della condizione d' ucsita
fclose(fp);
system("pause");
return 0;
}
void inserimento(FILE **g)
{
// fflush(stdin); MODIFICA EVITA COME LA PESTE fflush(stdin): il suo comportamento è imprevedibile!!
SvuotaBuffer();
prenotazione mia_prenotazione;
printf("\n inserire aula\n");
scanf("%s", &mia_prenotazione.aula);
printf("\n inserire nome esame\n");
scanf("%s", &mia_prenotazione.nome_esame);
printf("\n inserire nome docente\n");
scanf("%s", &mia_prenotazione.docente);
printf("\n inserire anno di corso\n");
scanf("%d",&mia_prenotazione.anno);
printf("\n inserire ora e minuti inizio lezione\n");
scanf("%d" "%d",&mia_prenotazione.ora,&mia_prenotazione.minuti);
printf("\n inserire durata prova\n");
scanf("%d" ,&mia_prenotazione.tempo_prova);
fflush(stdin);
fwrite(&mia_prenotazione,sizeof(prenotazione),1, *g);
system("pause");
}
void ricerca(FILE **g)
{
//prenotazione datiletti;
prenotazione mia_prenotazione; // MODIFIACA inserisco la variabile locale mia_prenotazione
int k=0;
fseek(*g,0L, SEEK_SET);
while(fread(&mia_prenotazione,sizeof(prenotazione),1, *g)>0)
{
if(mia_prenotazione.anno>=0 && mia_prenotazione.anno<=1)
k ++;
printf("\n******************************************************\n");
printf("\t%s",mia_prenotazione.aula);
printf("\t%s",mia_prenotazione.docente);
printf("\t%s\n",mia_prenotazione.nome_esame);
printf("\n******************************************************\n");
}
//fclose(fp); MODIFICA elimino la cciusura del file
}
void visualizza(FILE **g)
{
/*FILE *fp;
fp=fopen("C:\\File.txt","r"); MODIFICA elimino la variabile locale fp */
prenotazione mia_prenotazione; // MODIFIACA inserisco la variabile locale mia_prenotazione
fseek(*g,0L, SEEK_SET);
// while(fread(&mia_prenotazione, sizeof(prenotazione), 1 , **g)!= EOF) MODIFICA cambio la condizione d' uscita del file
while (!feof( *g))
{
// if(mia_prenotazione.ora>=10 && mia_prenotazione.anno<=13) MODIFICA Cambio la condizione if
fread(&mia_prenotazione, sizeof(prenotazione), 1 , *g);
if(mia_prenotazione.ora>=10 && mia_prenotazione.ora<=13)
{
printf("\t%s",mia_prenotazione.aula);
printf("\t%s",mia_prenotazione.docente);
printf("\t%s\n",mia_prenotazione.nome_esame);
}
}
//fclose(fp); MODIFICA elimino la cciusura del file
}
void SvuotaBuffer() // MODIFICA aggiungo una piccola funzione per svuotare il buffer.
{
while (getchar() != '\n') ;
}
Non visualizza nemmeno il menù iniziale?
In tal caso controlla il percorso del file da aprire.
Io ho dichiarato:
E probabile che sul tuo computer non esiste la cartella " G:\file ".
In tal caso controlla il percorso del file da aprire.
Io ho dichiarato:
... char percorso[]="G:\\file\\file.txt"; FILE *fp; fp=fopen(percorso,"r+b"); ...
E probabile che sul tuo computer non esiste la cartella " G:\file ".
Al momento sono in Giappone e non ho quindi il tempo di controllare bene il tuo codice. Ma qualche domanda potrebbe aiutare a capire meglio la causa:
1. Che compilatore stai usando e su quale piattaforma?
2. Qual'è l'output generato dal tuo compilatore? Hai per esempio controllato che il codice venga generato correttamente?
3. In quale punto dell'esecuzione il programma termina l'esecuzione (sempre se riesci ad eseguire qualcosa)?
4. Hai provato ad eseguire il debug?
1. Che compilatore stai usando e su quale piattaforma?
2. Qual'è l'output generato dal tuo compilatore? Hai per esempio controllato che il codice venga generato correttamente?
3. In quale punto dell'esecuzione il programma termina l'esecuzione (sempre se riesci ad eseguire qualcosa)?
4. Hai provato ad eseguire il debug?
grazie per l'aiuto
-sto usando visual studio 2008 in piattaforma window
-l'errore è praticamente che compare la finestra per un istante senza visualizzare nulla
-è il compilatore non rileva nessun errore
-con il debug non ne vengo a capo...
-sto usando visual studio 2008 in piattaforma window
-l'errore è praticamente che compare la finestra per un istante senza visualizzare nulla
-è il compilatore non rileva nessun errore
-con il debug non ne vengo a capo...


funziona ,
ho sistemato il percorso
char percorso[]="C:\\file.txt";
non funziona la logica della visualizzione delle info degli esami solo del primo anno..
ho sistemato il percorso
char percorso[]="C:\\file.txt";
non funziona la logica della visualizzione delle info degli esami solo del primo anno..
