codice:
/*
Note : Il file nome fisico docenti.dat contiene l'elenco dei
docenti(tipo Rdocente) che insegnano in un corso il cui
nome è Corso, mentre il file di nome fisico studenti.dat
contiene l'elenco degli studenti (tipo Rstudente) che
devono seguire quei corsi. I record degli studenti
contendono Cognome,Nome,dataN,Corsi. I due file sono
entrambi ordinati per key.
Scrivere una procedura che, per ogni docente, crei un
file, il cui nome coincide col cognome del docente,
contenente tutti gli studenti di quel corso(campi
nome, congnome, data di nascita) in ordine alfabetico
per cognome e nome e a parità per data di nascita.
*/
#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
struct Tpdata {
int giorno;
int mese;
int anno;
};
struct cors{
char cor[20];
};
struct Rlibro{
int key;
char cognome[20];
char nome[20];
char corso[20];
};
struct Rstudente{
int key;
char cognome[20];
char nome[20];
Tpdata dataN;
cors corso[20];
int Ncorsi;
};
typedef Rlibro* Plibro;
typedef Rstudente* Pstudente;
void getfile(Pstudente [],int );
void insort(Pstudente [],int ,Pstudente);
double Datanum(Pstudente );
const char Nomefile[ ]="studente.dat";
const int Lrec=sizeof(Rlibro);
const int Numpers=6;
int main(){
char chr;
Rstudente libro;
/*int Numpers;
cout<<"Numero di libri da inserire: ";
cin>>Numpers;
fstream filepers;
filepers.open("studente.dat",ios::in|ios::out|ios::binary|ios::ate);
if (!filepers)
filepers.open("studente.dat",ios::out|ios::binary|ios::trunc);
while(Numpers>0){
Inserimento(libro,chr);
if (chr=='s') {
filepers.seekp(0,ios::end);
filepers.write((char*)&libro,Lrec);
Numpers--;
}}
filepers.close();*/
Pstudente PuntaP1[101];
getfile(PuntaP1,Lrec);
//for(int k=1;k<=Numpers;k++){
// stampa(*PuntaP1[k]);
// }
system("pause");
//SortStud(PuntaP1,Numpers,true);
//putfile(PuntaP1,Numpers,Lrec);
system("pause");
return 0;
}
double Datanum(Pstudente x){
return x->dataN.anno*10000+x->dataN.mese*100+x->dataN.giorno;
}
void getfile(Pstudente PuntaP1[],int Lrec){
fstream file,file1;
Rlibro temp;
Rstudente temp1;
file.open("docente.dat",ios::in|ios::out|ios::binary|ios::ate);
if (!file)
file.open("docente.dat",ios::out|ios::binary|ios::trunc);
file1.open("studente.dat",ios::in|ios::out|ios::binary|ios::ate);
if (!file1)
file1.open("studente.dat",ios::out|ios::binary|ios::trunc);
int NumFileStud=file1.tellg()/sizeof(Rstudente);
//HACK
NumFileStud=3;
int Numstud=file.tellg()/Lrec;
//HACK
Numstud=3;
file.seekg(0,ios::beg);
int k=0,z=1;
for(int i=1;i<=Numstud;i++){
file.read((char*) &temp,Lrec);
//HACK
if(i==1){
strcpy(temp.corso,"DB");
cout<<temp.corso<<endl;
system("pause");
temp.key=1;
strcpy(temp.cognome,"Peron");
strcpy(temp.nome,"Adriano");
}
else if(i==2){
strcpy(temp.corso,"PRB");
cout<<temp.corso<<endl;
system("pause");
temp.key=2;
strcpy(temp.cognome,"Burattini");
strcpy(temp.nome,"Ernesto");
}
else if(i==3){
strcpy(temp.corso,"LUP");
cout<<temp.corso<<endl;
system("pause");
temp.key=3;
strcpy(temp.cognome,"Ax");
strcpy(temp.nome,"Int");
}
//
cout<<temp.cognome<<endl;
system("pause");
file1.read((char*) &temp1,sizeof(Rstudente));
//HACK
if(k==0){
temp1.dataN.giorno=26;
temp1.dataN.mese=02;
temp1.dataN.anno=87;
temp1.Ncorsi=2;
for(int i=0;i<temp1.Ncorsi;i++){
if(i==0)strcpy(temp1.corso[i].cor,"PRB");
else if(i==1)strcpy(temp1.corso[i].cor,"LUB");
cout<<temp1.corso[i].cor<<endl;
system("pause");
}
temp.key=1;
strcpy(temp1.cognome,"F");
strcpy(temp1.nome,"V");
}
//
cout<<temp1.cognome<<endl;
system("pause");
int inseriti=1;
while(k<NumFileStud){
file1.read((char*) &temp1,sizeof(Rstudente));
//HACK
if(k==1){
temp1.dataN.giorno=30;
temp1.dataN.mese=11;
temp1.dataN.anno=88;
temp1.Ncorsi=2;
for(int i=0;i<temp1.Ncorsi;i++){
if(i==0)strcpy(temp1.corso[i].cor,"DB");
else if(i==1)strcpy(temp1.corso[i].cor,"PRB");
cout<<temp1.corso[i].cor<<endl;
system("pause");
}
temp.key=2;
strcpy(temp1.cognome,"C");
strcpy(temp1.nome,"Z");
}
if(k==2){
temp1.dataN.giorno=30;
temp1.dataN.mese=12;
temp1.dataN.anno=90;
temp1.Ncorsi=0;
for(int i=0;i<temp1.Ncorsi;i++){
cout<<temp1.corso[i].cor<<endl;
system("pause");
}
temp.key=3;
strcpy(temp1.cognome,"Z");
strcpy(temp1.nome,"L");
}
//
int z=0;bool check=false;
while(z<temp1.Ncorsi && !check){
if(stricmp(temp1.corso[z].cor,temp.corso)==0){
cout<<"DEVO INSERIRE NELL\'ARRAY "<<temp1.cognome<<endl;
cout<<endl<<"INSERITI "<<inseriti;
system("pause");
check=true;
PuntaP1[inseriti]=new Rstudente;
*PuntaP1[inseriti]=temp1;
insort(PuntaP1,inseriti,PuntaP1[inseriti]);
inseriti++;
}
cout<<"Ricerco Corso"<<temp1.corso[z].cor<<endl;
z++;
}
k++;
cout<<"Incremento k "<<k<<endl;
system("pause");
}
k=0;
cout<<endl<<"INSERITI FUORI"<<inseriti<<endl;
for(int n=1;n<inseriti;n++){
cout<<PuntaP1[n]->cognome<<endl;
system("pause");
}
if(inseriti>1){
char* NomeFile=temp.cognome;
cout<<"NOM FILE "<<NomeFile<<endl;
system("pause");
fstream file2;
file2.open(NomeFile,ios::in|ios::out|ios::binary|ios::ate);
if (!file2)
file2.open(NomeFile,ios::out|ios::binary|ios::trunc);
cout<<"\n\nINSERISCO"<<endl;
for(int n=1;n<inseriti;n++){
file2.write((char*) &*PuntaP1[n]->cognome,sizeof(char[20]));
cout<<"Inserisco "<<PuntaP1[n]->cognome<<endl;
system("pause");
file2.write((char*) &*PuntaP1[n]->nome,sizeof(char[20]));
cout<<"Inserisco "<<PuntaP1[n]->nome<<endl;
file2.write((char*) &PuntaP1[n]->dataN.giorno,sizeof(int));
cout<<"Inserisco "<<PuntaP1[n]->dataN.giorno<<endl;
file2.write((char*) &PuntaP1[n]->dataN.mese,sizeof(int));
cout<<"Inserisco "<<PuntaP1[n]->dataN.mese<<endl;
file2.write((char*) &PuntaP1[n]->dataN.anno,sizeof(int));
cout<<"Inserisco "<<PuntaP1[n]->dataN.anno<<endl;
}
file2.close();
}
file1.seekg(0,ios::beg);
cout<<"Ritorno Sopra"<<endl;
}
file.close();
}
void insort(Pstudente Punt[],int n,Pstudente Temp){
int j;
Punt[0]=Temp;
j=n-1;
cout<<"Sono nel Insertion"<<endl;
system("pause");
if(j>0 && stricmp(Punt[j]->cognome,Punt[0]->cognome)>0){
while(j>0 && stricmp(Punt[j]->cognome,Punt[0]->cognome)>0){
Punt[j+1]=Punt[j];
cout<<"Cognome"<<endl;
system("pause");
j--;
}
}
if(j>0 && stricmp(Punt[j]->cognome,Punt[0]->cognome)==0 &&
stricmp(Punt[j]->nome,Punt[0]->nome)<0){
while(j>0 && stricmp(Punt[j]->nome,Punt[0]->nome)<0){
Punt[j+1]=Punt[j];
cout<<"Nome"<<endl;
system("pause");
j--;
}
}
if(j>0 && stricmp(Punt[j]->nome,Punt[0]->nome)==0 &&
Datanum(Punt[j])<Datanum(Punt[0])){
while(j>0 && Datanum(Punt[j])<Datanum(Punt[0])){
Punt[j+1]=Punt[j];
cout<<"Data"<<endl;
system("pause");
j--;
}
}
cout<<"Controlli Finiti"<<endl;
system("pause");
Punt[j+1]=Punt[0];
}