Oppure

Loading
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?

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
12/02/13 20:49
Poggi Marco
Ciao!

Ho letto il programma, e credo che la gestione del registro con i file sia facilmente implementabile, dato che hai già definito il tipo studente. Di conseguenza ti consiglio di utilizzare i file binari. (marinsalta.net/pascal/…)
aaa
12/02/13 22:34
Tommaso95
Postato originariamente da Poggi Marco:

Ciao!

Ho letto il programma, e credo che la gestione del registro con i file sia facilmente implementabile, dato che hai già definito il tipo studente. Di conseguenza ti consiglio di utilizzare i file binari. (marinsalta.net/pascal/…)


Prima di tutto grazie mille per il link, sembra molto interessante e domani ci darò sicuramente uno sguardo (adesso sono too tired).

Volevo solo chiederti due cose che ho notato mentre facevo dei test:
1) all'interno dei record ho anche un campo di tipo boolean ma mi pare che il tutto non sia "gestibile" dal tipo file. C'è qualche soluzione?
2) Continuo a non essere sicuro su alcune cose. Nel senso la procedure di ricerca devo riscriverla da zero o c'è qualche modo per tenerla cosi implementando i file?


Grazie mille ancora:k:
aaa
12/02/13 23:45
Poggi Marco
Il tipo boolean può essere registrato su un file binario senza nessun problema.
L' unico problema, sono le stringhe, che vanno obbligatoriamente dimensionate.
(Per eventuali prove, vedi questo semplice editor binario:sourceforge.net/projects/winexe/files/)

Le funzioni cerca e ordina_def, hanno il difetto di appoggiarsi sul vettore globale. Una buona cosa, è quella di renderle indipendenti.


aaa