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.