12/02/13 19:04
Tommaso95
Ciao a tutti, ho realizzato questo programma che permette di gestire con varie funzioni un registro scolastico.
Per ora funziona tutto ma mi è stato chiesto di usare il tipo file permettendo quindi di salvare il tutto in un file .dat
Premetto che non sono molto familiare con il tipo file non sono sicuro se posso inserire il tipo file all'intero del mio programma o se mi conviene rifare tutto da 0.
Per esempio la funziona di ricerca devo rifarla da 0 oppure posso tenere quella che avevo già fatto?
Grazie
Per ora funziona tutto ma mi è stato chiesto di usare il tipo file permettendo quindi di salvare il tutto in un file .dat
Premetto che non sono molto familiare con il tipo file non sono sicuro se posso inserire il tipo file all'intero del mio programma o se mi conviene rifare tutto da 0.
Per esempio la funziona di ricerca devo rifarla da 0 oppure posso tenere quella che avevo già fatto?
program registro; uses crt; const Nmax = 30; (* Numero studenti massimo *) cognome : array[1..19] of string[20] = ('a','b','c','d','e' ,'f','g','h','i','l' ,'m','n','o','p','q','r','s','t','z'); nome : array[1..19] of string[20] = ('a','b','c','d','e' ,'f','g','h','i','l','m','n','o','p' ,'q','r','s','s','t'); type studente = record cognomi : string[20]; nomi : string[20]; voti : array[1..5] of byte; contatore_voti : byte; media : real; ok: boolean; end; Tabellaregistro = array[1..Nmax] of studente; var reg_4a,reg_4a_copia: Tabellaregistro; i,j,n,numAlunni:byte; scelta: char; procedure centra(scritta:string;y:integer); var x:integer; begin x:=((80-(length(scritta)))div 2); gotoxy(x,y); write(scritta); end; procedure riempi_voti(n:byte); var i,j:byte; begin reg_4a[n].contatore_voti:=random(5)+1; for i:=1 to reg_4a[n].contatore_voti do reg_4a[n].voti[i]:=random(7)+3; end; function calMedia(n:byte) : real; var j,somma:byte; begin somma:=0; for j:=1 to reg_4a[n].contatore_voti do somma:=somma+reg_4a[n].voti[j]; calMedia:=somma/reg_4a[n].contatore_voti; end; procedure InizializzazioneDati; begin for i:=1 to numAlunni do begin with reg_4a[i] do begin cognomi := cognome[i]; nomi := nome[i]; riempi_voti(i); media := calMedia(i); ok:=true; end; end; end; procedure ordina_def(var n:byte); var aux:studente; i,j:byte; begin for i:=1 to n do for j:=1 to n-1 do if (reg_4a[j].cognomi) > (reg_4a[i].cognomi) then begin aux:=(reg_4a[i]); (reg_4a[i]):=(reg_4a[j]); (reg_4a[j]):=aux; end; end; procedure Inserisci(VAR tabella:Tabellaregistro; var n:byte); var h:byte; contatore_voti_temp:integer; begin clrscr; centra('2 - Inserisci un nuovo studente',1); Writeln; Writeln; n:=n+1; with tabella[n] do begin Write('Cognome: '); Readln(cognomi); Write('Nome: '); Readln(nomi); Write('Quanti voti vuole inserire (massimo 5 per studente)? '); repeat Readln(contatore_voti_temp); (* controllo che il numero di voti sia compreso tra 0 e 5*) if (contatore_voti_temp>5) or (contatore_voti_temp<0) then begin write('Inserire un numero minore di 5'); end; until (contatore_voti_temp<=5) and (contatore_voti_temp>=0); contatore_voti:=contatore_voti_temp; Write('Voti separati da uno spazio: '); for h:=1 to contatore_voti do read(voti[h]); media := calMedia(n); ok:=true; end; end; procedure stampa(VAR tabella:Tabellaregistro; n:byte); var i,raw,cont: byte; begin clrscr; raw:=6; gotoxy(1,2); Write('Cognome'); gotoxy(20,2); Write('Nome'); gotoxy(43,2); Write('Voti'); gotoxy(64,2); Write('Media'); Writeln; Writeln; for i:=1 to 80 do Write('='); for i:=1 to n do begin with reg_4a[i] do begin if ok=true then begin gotoxy(1,raw); write(cognomi); gotoxy(20,raw); write(nomi); gotoxy(64,raw); write(media:4:2); gotoxy(40,raw); for j:=1 to contatore_voti do write(voti[j]:4);end; raw:=raw+1; end; end; Writeln; Writeln; cont:=0; for i:=1 to n do (* Stampo numero studenti escludendo quelli che hanno come ok il valore false *) if tabella[i].ok=true then cont:=cont+1; Write('Numero studenti: ', cont); readln; end; procedure Elimina(var tabella:TabellaRegistro;var n:byte); var i,riga:byte; scelta:char; cogn:string[20]; begin clrscr; centra('4 - Elimina uno studente',1); Writeln; Writeln; Writeln(' 1 - Eliminare uno studente usando la riga corrispondente ad esso'); Writeln(' 2 - Eliminare uno studente usando il cognome corrisppondente ad esso'); Writeln; Write(' Scegli un opzione: ');readln(scelta); case scelta of '1' : begin Write('Inserisci la riga dello studente da eliminare: '); Readln(riga); tabella[riga].ok:=false; end; '2' : begin Write('Inserisci il cognome dello studente da eliminare: '); Readln(cogn); for i:=1 to n do if cogn=tabella[i].cognomi then tabella[i].ok:=false; end; end; for i:=1 to n do if reg_4a[i].ok=false then (* Gli studenti con campo ok=false vengono riempiti con delle z in modo di finire in fondo alla lista*) begin reg_4a[i].cognomi:='zzzzzz'; reg_4a[i].nomi:='zzzzzzzz'; reg_4a[i].media:=11; end; end; procedure ripristina; var decisione:char; begin clrscr; centra('5 - Ripristina il registro',1); Writeln; Writeln; numAlunni:=19; (* Reimposto il numero degli studenti a quello di partenza *); Write('E'' sicruo di volere ripristinare il registro al suo punto di partenza?(s/n) ');readln(decisione); if decisione='s' then reg_4a:=reg_4a_copia else end; procedure cerca; var x:string[20]; pos,h,contatore_voti_temp,voti_temp: byte; modifica: char; begin clrscr; centra('3 - Cerca e modifica',1); (* Cerca un cognome *) Writeln; Writeln; Write('Cerca un cognome: '); Readln(x); pos:=1; while (x<>reg_4a[pos].cognomi) and (pos<=numAlunni) do (* Inizio Ricerca Sequenziale *) pos:=pos+1; if (pos>numAlunni) then begin Write('Nessun risultato trovato usando il cognome'); textcolor(green); writeln(' "',x,'"'); textcolor(7); Writeln('Premi invio per tornare al menu'); readln; end else begin Write('Informazioni corrispondenti al cognome'); textcolor(green); Writeln(' "',x,'"'); textcolor(7); (* Stampa riga trovata *) gotoxy(1,6); write(reg_4a[pos].cognomi); gotoxy(20,6); write(reg_4a[pos].nomi); gotoxy(64,6); write(reg_4a[pos].media:4:2); gotoxy(40,6); for j:=1 to 5 do write(reg_4a[pos].voti[j]:4); Writeln; Writeln; Write('Vuole modificare i dati di questo studente? (s\n)'); readln(modifica); (* Possibilit… di modificare il programma *) if modifica='s' then with reg_4a[pos] do begin Write('Nuovo Cognome: '); Readln(cognomi); Write('Nuovo Nome: '); Readln(nomi); Write('Quanti voti vuole inserire (massimo 5 per studente)? '); repeat Readln(contatore_voti_temp); (*Controllo sul numero dei voti*) if (contatore_voti_temp>5) or (contatore_voti_temp<0) then begin write('Inserire un numero minore di 5'); end; until (contatore_voti_temp<=5) and (contatore_voti_temp>=0); contatore_voti:=contatore_voti_temp; Write('Voti separati da uno spazio: '); for h:=1 to contatore_voti do begin (*Controllo sul voto stesso*) repeat Read(voti_temp); if(voti_temp>10) OR (voti_temp<1)then begin writeln('Errore, valore non corrretto'); Writeln('Inserisci un''altro numero tra 1 e 10'); end; until ((voti_temp<=10) and (voti_temp>=1)); voti[h]:=voti_temp; end; media := calMedia(pos); end; end end; procedure ordina(var n:byte); var i,j:byte; aux:studente;scelta:char; begin clrscr; centra('6 - Ordina i dati',1); Writeln; Writeln; Writeln(' 1 - Ordinare il registro in ordine alfabetico dei nomi'); Writeln(' 2 - Ordinare il registro in ordine alfabetico dei cognomi'); Writeln(' 3 . Ordinare il registro in ordine crescente della media'); Writeln; Write(' Scegli un opzione: ');readln(scelta); case scelta of '1' : begin for i:=1 to n do (*Ordinamento tramite selection sort*) for j:=1 to n-1 do if (reg_4a[j].nomi) > (reg_4a[i].nomi) then begin aux:=(reg_4a[i]); (reg_4a[i]):=(reg_4a[j]); (reg_4a[j]):=aux; end; end; '2' : begin for i:=1 to n do for j:=1 to n-1 do if (reg_4a[j].cognomi) > (reg_4a[i].cognomi) then begin aux:=(reg_4a[i]); (reg_4a[i]):=(reg_4a[j]); (reg_4a[j]):=aux; end; end; '3' : begin for i:=1 to n do for j:=1 to n-1 do if (reg_4a[j].media) > (reg_4a[i].media) then begin aux:=(reg_4a[i]); (reg_4a[i]):=(reg_4a[j]); (reg_4a[j]):=aux; end; end; end; stampa(reg_4a,numAlunni); end; begin numAlunni:=19; randomize; InizializzazioneDati; reg_4a_copia:=reg_4a; repeat clrscr; centra('Registro di classe',1); gotoxy(10,10); writeln('MENU'); Writeln; Writeln(' 1 - Stampa dati'); Writeln(' 2 - Inserisci dati'); Writeln(' 3 - Cerca e modifica'); Writeln(' 4 - Elimina dati'); Writeln(' 5 - Ripristina il registro'); Writeln(' 6 - Ordina i dati'); Writeln(' 7 - Esci dal programma'); Writeln; Write(' Scegli un opzione: '); readln(scelta); case scelta of '1' : begin stampa(reg_4a,numAlunni) ; end; '2' : begin clrscr; Inserisci(reg_4a,numAlunni); ordina_def(numAlunni); end; '3' : begin cerca; ordina_def(numAlunni); end; '4' : begin Elimina(reg_4a,numAlunni); ordina_def(numAlunni); end; '5' : begin ripristina; end; '6' : begin ordina(numAlunni); end; end; until scelta = '7'; end.
Grazie
aaa