Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Dubbio sul tipo file
Forum - Pascal - Dubbio sul tipo file

Avatar
Tommaso95 (Normal User)
Newbie


Messaggi: 17
Iscritto: 17/10/2012

Segnala al moderatore
Postato alle 20:04
Martedì, 12/02/2013
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?

Codice sorgente - presumibilmente Delphi

  1. program registro;
  2. uses crt;
  3. const
  4.      Nmax = 30;    (* Numero studenti massimo *)
  5.      cognome : array[1..19] of string[20] = ('a','b','c','d','e'
  6.                                           ,'f','g','h','i','l'
  7.                                              ,'m','n','o','p','q','r','s','t','z');
  8.      nome : array[1..19] of string[20] = ('a','b','c','d','e'
  9.      ,'f','g','h','i','l','m','n','o','p'
  10.      ,'q','r','s','s','t');
  11. type
  12.     studente = record
  13.              cognomi : string[20];
  14.              nomi : string[20];
  15.              voti : array[1..5] of byte;
  16.              contatore_voti : byte;
  17.              media : real;
  18.              ok: boolean;
  19.     end;
  20.     Tabellaregistro = array[1..Nmax] of studente;
  21. var
  22.      reg_4a,reg_4a_copia: Tabellaregistro;
  23.      i,j,n,numAlunni:byte;
  24.      scelta: char;
  25.  
  26.  
  27. procedure centra(scritta:string;y:integer);
  28. var
  29.         x:integer;
  30. begin
  31.         x:=((80-(length(scritta)))div 2);
  32.         gotoxy(x,y);
  33.         write(scritta);
  34. end;
  35.  
  36.  
  37. procedure riempi_voti(n:byte);
  38. var
  39.    i,j:byte;
  40. begin
  41.            reg_4a[n].contatore_voti:=random(5)+1;
  42.            for i:=1 to reg_4a[n].contatore_voti do
  43.                reg_4a[n].voti[i]:=random(7)+3;
  44. end;
  45.  
  46.  
  47. function calMedia(n:byte) : real;
  48. var
  49.    j,somma:byte;
  50. begin
  51.      somma:=0;
  52.      for j:=1 to reg_4a[n].contatore_voti do
  53.          somma:=somma+reg_4a[n].voti[j];
  54.      calMedia:=somma/reg_4a[n].contatore_voti;
  55. end;
  56.  
  57.  
  58. procedure InizializzazioneDati;
  59. begin
  60.      for i:=1 to numAlunni do
  61.          begin
  62.               with reg_4a[i] do
  63.               begin
  64.               cognomi := cognome[i];
  65.               nomi := nome[i];
  66.               riempi_voti(i);
  67.               media := calMedia(i);
  68.               ok:=true;
  69.               end;
  70.          end;
  71. end;
  72.  
  73. procedure ordina_def(var n:byte);
  74. var
  75.         aux:studente;
  76.         i,j:byte;
  77. begin
  78.                  for i:=1 to n do
  79.                     for j:=1 to n-1 do
  80.                          if (reg_4a[j].cognomi) > (reg_4a[i].cognomi) then
  81.                               begin
  82.                                 aux:=(reg_4a[i]);
  83.                                 (reg_4a[i]):=(reg_4a[j]);
  84.                                 (reg_4a[j]):=aux;
  85.                               end;
  86. end;
  87.  
  88. procedure Inserisci(VAR tabella:Tabellaregistro; var n:byte);
  89. var
  90.         h:byte;  contatore_voti_temp:integer;
  91. begin
  92.      clrscr;
  93.      centra('2 - Inserisci un nuovo studente',1);
  94.      Writeln;
  95.      Writeln;
  96.      n:=n+1;
  97.      with tabella[n] do
  98.        begin
  99.             Write('Cognome: '); Readln(cognomi);
  100.             Write('Nome: '); Readln(nomi);
  101.             Write('Quanti voti vuole inserire (massimo 5 per studente)? ');
  102.                           repeat Readln(contatore_voti_temp);                 (* controllo che il numero di voti sia compreso tra 0 e 5*)
  103.                                  if (contatore_voti_temp>5) or (contatore_voti_temp<0) then
  104.                                       begin
  105.                                             write('Inserire un numero minore di 5');
  106.                                       end;
  107.                           until (contatore_voti_temp<=5) and (contatore_voti_temp>=0);
  108.                           contatore_voti:=contatore_voti_temp;
  109.             Write('Voti separati da uno spazio: ');
  110.                 for h:=1 to contatore_voti do
  111.                         read(voti[h]);
  112.               media := calMedia(n);
  113.             ok:=true;
  114.        end;
  115.  
  116. end;
  117.  
  118.  
  119. procedure stampa(VAR tabella:Tabellaregistro; n:byte);
  120. var
  121.         i,raw,cont: byte;
  122. begin
  123.      clrscr;
  124.      raw:=6;
  125.      gotoxy(1,2);
  126.      Write('Cognome');
  127.      gotoxy(20,2);
  128.      Write('Nome');
  129.      gotoxy(43,2);
  130.      Write('Voti');
  131.      gotoxy(64,2);
  132.      Write('Media');
  133.      Writeln;
  134.      Writeln;
  135.      for i:=1 to 80 do
  136.          Write('=');
  137.       for i:=1 to n do
  138.          begin
  139.               with reg_4a[i] do
  140.               begin
  141.                 if ok=true then begin
  142.                              gotoxy(1,raw);
  143.                              write(cognomi);
  144.                              gotoxy(20,raw);
  145.                              write(nomi);
  146.                              gotoxy(64,raw);
  147.                              write(media:4:2);
  148.                              gotoxy(40,raw);
  149.                              for j:=1 to contatore_voti do
  150.                                 write(voti[j]:4);end;
  151.               raw:=raw+1;
  152.               end;
  153.          end;
  154.       Writeln;
  155.       Writeln;
  156.       cont:=0;
  157.       for i:=1 to n do   (* Stampo numero studenti escludendo quelli che hanno come ok il valore false *)
  158.         if tabella[i].ok=true then
  159.                 cont:=cont+1;
  160.       Write('Numero studenti: ', cont);
  161.      readln;
  162. end;
  163.  
  164. procedure Elimina(var tabella:TabellaRegistro;var n:byte);
  165. var
  166.         i,riga:byte;
  167.         scelta:char;
  168.         cogn:string[20];
  169. begin
  170.    clrscr;
  171.    centra('4 - Elimina uno studente',1);
  172.    Writeln;
  173.    Writeln;
  174.    Writeln(' 1 - Eliminare uno studente usando la riga corrispondente ad esso');
  175.    Writeln(' 2 - Eliminare uno studente usando il cognome corrisppondente ad esso');
  176.    Writeln;
  177.    Write(' Scegli un opzione: ');readln(scelta);
  178.    case scelta of
  179.         '1' : begin
  180.                  Write('Inserisci la riga dello studente da eliminare: '); Readln(riga);
  181.                  tabella[riga].ok:=false;
  182.               end;
  183.         '2' : begin
  184.                  Write('Inserisci il cognome dello studente da eliminare: '); Readln(cogn);
  185.                  for i:=1 to n do
  186.                         if cogn=tabella[i].cognomi then
  187.                                 tabella[i].ok:=false;
  188.               end;
  189.    end;
  190.    for i:=1 to n do
  191.         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*)
  192.                 begin
  193.                         reg_4a[i].cognomi:='zzzzzz';
  194.                         reg_4a[i].nomi:='zzzzzzzz';
  195.                         reg_4a[i].media:=11;
  196.                 end;
  197. end;
  198.  
  199.  
  200. procedure ripristina;
  201. var
  202.    decisione:char;
  203. begin
  204.      clrscr;
  205.      centra('5 - Ripristina il registro',1);
  206.      Writeln;
  207.      Writeln;
  208.      numAlunni:=19;  (* Reimposto il numero degli studenti a quello di partenza *);
  209.      Write('E'' sicruo di volere ripristinare il registro al suo punto di partenza?(s/n) ');readln(decisione);
  210.                if decisione='s' then
  211.                   reg_4a:=reg_4a_copia
  212.                else
  213. end;
  214.  
  215.  
  216. procedure cerca;
  217. var
  218.         x:string[20];
  219.         pos,h,contatore_voti_temp,voti_temp: byte;
  220.         modifica: char;
  221. begin
  222.         clrscr;
  223.         centra('3 - Cerca e modifica',1);                    (* Cerca un cognome *)
  224.         Writeln;
  225.         Writeln;
  226.         Write('Cerca un cognome: ');
  227.         Readln(x);
  228.         pos:=1;
  229.         while (x<>reg_4a[pos].cognomi) and (pos<=numAlunni)  do                                (* Inizio Ricerca Sequenziale *)
  230.                 pos:=pos+1;
  231.         if (pos>numAlunni) then begin
  232.                                         Write('Nessun risultato trovato usando il cognome');
  233.                                         textcolor(green); writeln(' "',x,'"'); textcolor(7);
  234.                                         Writeln('Premi invio per tornare al menu');
  235.                                         readln;
  236.                                 end
  237.         else
  238.               begin
  239.                 Write('Informazioni corrispondenti al cognome'); textcolor(green); Writeln(' "',x,'"'); textcolor(7);
  240.                  (* Stampa riga trovata *)
  241.                 gotoxy(1,6);
  242.                 write(reg_4a[pos].cognomi);
  243.                 gotoxy(20,6);
  244.                 write(reg_4a[pos].nomi);
  245.                 gotoxy(64,6);
  246.                 write(reg_4a[pos].media:4:2);
  247.                 gotoxy(40,6);
  248.                 for j:=1 to 5 do
  249.                   write(reg_4a[pos].voti[j]:4);
  250.  
  251.                 Writeln;
  252.                 Writeln;
  253.                 Write('Vuole modificare i dati di questo studente? (s\n)'); readln(modifica);
  254.                   (* Possibilit… di modificare il programma *)
  255.                 if modifica='s' then
  256.                         with reg_4a[pos] do
  257.                         begin
  258.                                 Write('Nuovo Cognome: '); Readln(cognomi);
  259.                                 Write('Nuovo Nome: '); Readln(nomi);
  260.                         Write('Quanti voti vuole inserire (massimo 5 per studente)? ');
  261.                           repeat Readln(contatore_voti_temp);                                  (*Controllo sul numero dei voti*)
  262.                                  if (contatore_voti_temp>5) or (contatore_voti_temp<0) then
  263.                                       begin
  264.                                             write('Inserire un numero minore di 5');
  265.                                       end;
  266.                           until (contatore_voti_temp<=5) and (contatore_voti_temp>=0);
  267.                           contatore_voti:=contatore_voti_temp;
  268.                        Write('Voti separati da uno spazio: ');
  269.                        for h:=1 to contatore_voti do
  270.                          begin                                                    (*Controllo sul voto stesso*)
  271.                           repeat
  272.                                  Read(voti_temp);
  273.                                  if(voti_temp>10) OR (voti_temp<1)then
  274.                                             begin
  275.                                                    writeln('Errore, valore non corrretto');
  276.                                                    Writeln('Inserisci un''altro numero tra 1 e 10');
  277.  
  278.                                             end;
  279.  
  280.                            until ((voti_temp<=10) and (voti_temp>=1));
  281.                                  voti[h]:=voti_temp;
  282.                             end;
  283.                        media := calMedia(pos);
  284.  
  285.                         end;
  286.               end
  287. end;
  288.  
  289.  
  290. procedure ordina(var n:byte);
  291. var
  292.       i,j:byte; aux:studente;scelta:char;
  293. begin
  294.  
  295.    clrscr;
  296.    centra('6 - Ordina i dati',1);
  297.    Writeln;
  298.    Writeln;
  299.    Writeln(' 1 - Ordinare il registro in ordine alfabetico dei nomi');
  300.    Writeln(' 2 - Ordinare il registro in ordine alfabetico dei cognomi');
  301.    Writeln(' 3 . Ordinare il registro in ordine crescente della media');
  302.    Writeln;
  303.    Write(' Scegli un opzione: ');readln(scelta);
  304.    case scelta of
  305.            '1' : begin
  306.                  for i:=1 to n do                        (*Ordinamento tramite selection sort*)
  307.                     for j:=1 to n-1 do
  308.                          if (reg_4a[j].nomi) > (reg_4a[i].nomi) then
  309.                               begin
  310.                                 aux:=(reg_4a[i]);
  311.                                 (reg_4a[i]):=(reg_4a[j]);
  312.                                 (reg_4a[j]):=aux;
  313.                               end;
  314.                  end;
  315.            '2' : begin
  316.                  for i:=1 to n do
  317.                     for j:=1 to n-1 do
  318.                          if (reg_4a[j].cognomi) > (reg_4a[i].cognomi) then
  319.                               begin
  320.                                 aux:=(reg_4a[i]);
  321.                                 (reg_4a[i]):=(reg_4a[j]);
  322.                                 (reg_4a[j]):=aux;
  323.                               end;
  324.                  end;
  325.            '3' : begin
  326.                  for i:=1 to n do
  327.                     for j:=1 to n-1 do
  328.                          if (reg_4a[j].media) > (reg_4a[i].media) then
  329.                               begin
  330.                                 aux:=(reg_4a[i]);
  331.                                 (reg_4a[i]):=(reg_4a[j]);
  332.                                 (reg_4a[j]):=aux;
  333.                               end;
  334.                  end;
  335.  
  336.     end;
  337.     stampa(reg_4a,numAlunni);
  338. end;
  339.  
  340.  
  341. begin
  342.     numAlunni:=19;
  343.     randomize;
  344.     InizializzazioneDati;
  345.     reg_4a_copia:=reg_4a;
  346.      repeat
  347.         clrscr;
  348.         centra('Registro di classe',1);
  349.         gotoxy(10,10);
  350.         writeln('MENU');
  351.         Writeln;
  352.         Writeln(' 1 - Stampa dati');
  353.         Writeln(' 2 - Inserisci dati');
  354.         Writeln(' 3 - Cerca e modifica');
  355.         Writeln(' 4 - Elimina dati');
  356.         Writeln(' 5 - Ripristina il registro');
  357.         Writeln(' 6 - Ordina i dati');
  358.         Writeln(' 7 - Esci dal programma');
  359.         Writeln;
  360.  
  361.         Write(' Scegli un opzione: ');
  362.         readln(scelta);
  363.         case scelta of
  364.                   '1' : begin
  365.                          stampa(reg_4a,numAlunni) ;
  366.                         end;
  367.                   '2' : begin
  368.                          clrscr;
  369.                          Inserisci(reg_4a,numAlunni);
  370.                          ordina_def(numAlunni);
  371.                         end;
  372.                   '3' : begin
  373.                            cerca;
  374.                            ordina_def(numAlunni);
  375.                         end;
  376.                   '4' : begin
  377.                            Elimina(reg_4a,numAlunni);
  378.                            ordina_def(numAlunni);
  379.                         end;
  380.                   '5' : begin
  381.                              ripristina;
  382.                         end;
  383.                   '6' : begin
  384.                              ordina(numAlunni);
  385.                         end;
  386.         end;
  387.      until scelta = '7';
  388. end.



Grazie

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 21:49
Martedì, 12/02/2013
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. (http://www.marinsalta.net/pascal/I_FILES_IN_TURBO_PASCAL.htm)

PM Quote
Avatar
Tommaso95 (Normal User)
Newbie


Messaggi: 17
Iscritto: 17/10/2012

Segnala al moderatore
Postato alle 23:34
Martedì, 12/02/2013
Testo quotato

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. (http://www.marinsalta.net/pascal/I_FILES_IN_TURBO_PASCAL.htm)



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:

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 0:45
Mercoledì, 13/02/2013
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:http://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.



PM Quote