Soluzioni esercizi proposti il 19/10/2006
Esercizio 1 - Verifica Divisibilità
program ListeRicorsive;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TypeElem=integer;
Lista=^cella;
Cella=record
inf:TypeElem;
next:Lista;
end;
var
L,L2,ListaCopiata:Lista;
x,n:TypeElem;
menu:integer;
posizione:integer;
S,i:Integer;
m:real;
//*************Procedura STAMPA***************************
Procedure Print_Lista(P:Lista);
var
AUX:Lista;
begin
AUX:=P;
while AUX<>nil do
begin
write(AUX^.inf,'-->');
AUX:=AUX^.next;
end;
Writeln;
//for i:=1 to 5 do writeln;
end;
//*************INSERIMENTO IN CODA*************************
Procedure Ins_Coda(var P:Lista;X:TypeElem);
var
AUX:Lista;
LAST:Lista;
begin
New(AUX);
AUX^.inf:=(x);
AUX^.next:=nil;
if P=nil then
P:=AUX
else
begin
LAST:=P;
while LAST^.next<>nil do
LAST:=LAST^.next;
LAST^.next:=AUX;
end;
end;
//************ESERCIZIO N1***********************
Procedure SommaMedia(P:lista;var somma:integer; var media:real;N:integer);
begin
if P=nil then
if n=0 then
begin
somma:=0;
media:=0;
end
else
media:=somma/n
else
begin
somma:=somma+P^.inf;
sommaMedia(p^.next,somma,media,n+1);
end;
end;
//*****************ESERCIZIO N2*********************
Function ContaOccRicorsiva(P:Lista;x:TypeElem):integer;
begin
If P=nil then
ContaOccRicorsiva:=0
else
begin
if P^.inf=x then
ContaOccRicorsiva:=(ContaOccRicorsiva(P^.next,x)+1)
else
ContaOccRicorsiva:=ContaOccRicorsiva(P^.next,x)
end;
end;
//***************ESERCIZIO N.3 PRIMA PARTE*****************
Procedure SommaPari(P:Lista; var somma:integer);
begin
if P<>nil then
begin
if not odd(p^.inf) then somma:=somma+P^.inf;
SommaPari(P^.next,somma);
end;
end;
//***************ESERCIZIO N.3 seconda PARTE*****************
Function SommaPosPari(P:Lista;var somma:integer;pos:integer):integer;
begin
If P<> nil then
begin
if odd(pos) then somma:=somma+p^.inf;
SommaPosPari:=SommaPosPari(p^.next,somma,pos+1);
end;
SommaposPari:=somma;
end;
//*************ESERCIZIO 5*********************************+
Procedure Cancella(var P:Lista;X:TypeElem);
var
AUX:Lista;
begin
if (p<> nil) and (p^.inf<=x) then
begin
if p^.inf=x then
begin
aux:=p;
p:=p^.next;
dispose(AUX);
end
else
begin
//writeln(p^.inf);
cancella(p^.next,x);
end;
end;
end;
//********ESERCIZIO 6a*************************
Function CopiaLista(P:lista;var Q:lista):Lista;
var
AUX:Lista;
begin
If P <> nil then
begin
Q^.inf:=p^.inf;
new(q^.next);
CopiaLista(p^.next,Q^.next);
end
else
Q:=nil;
Copialista:=Q;
end;
//********ESERCIZIO 6b*************************
Procedure CopiaInversa(P:lista ;var Q:Lista);
var
AUX:Lista;
begin
if P<> nil then
begin
CopiaInversa(p^.next,q);
Ins_coda(Q,p^.inf);
end
end;
//********************main del programma*********************
begin
new(L);
l:=nil;
Writeln('Questo programma esegue una serie di operazione con le liste concatenate');
Repeat
Writeln('Scegli l''opizione desiderata (99 per uscire)');
Writeln;
Writeln('1. Creazione della lista concatenata');
Writeln('2. Calcola sommma e media (eserc. n. 1)');
Writeln('3. Conta numero di occorrenze (eserc. n. 2)');
Writeln('4. Somma gli elementi pari (Eserc. n. 3a)');
Writeln('5. Somma gli elementi di posto pari (Eserc. n. 3b)');
Writeln('6. Cancella ricorsivamente da una lista ordinata (Eserc. n. 5)');
Writeln('7. Copia Ricorsiva di una lista (Eserc. n. 6a)');
Writeln('8. Copia Inversa di una lista (Eserc. n. 6b)');
readln(menu);
case menu of
1: begin
Writeln('-= INSERIMENTO IN CODA =-');
Writeln('Inserisci gli elementi, 0 per uscire');
Readln(x);
while x <>0 do
begin
ins_Coda(L,X);
readln(x);
end;
Write('Lista: -->');
Print_lista(L);
for i:=1 to 5 do writeln;
end;
2: Begin
writeln;
Writeln('-= Somma gli elementi di posto pari =-');
s:=0;
m:=0;
SommaMedia(L,s,m,0);
Writeln('Somma: ',s);
Writeln('Media: ',m:0:2);
for i:=1 to 5 do writeln;
end;
3: Begin
Writeln('-= CALCOLA OCCORRENZE =-');
Write('Inserisci l''elemento da cercare: ');
readln(n);
Writeln;
Writeln('Il numero ',n,' e'' presente ',ContaOccRicorsiva(L,n),' volte');
for i:=1 to 5 do writeln;
End;
4: Begin
Writeln('-= SOMMA NUMERI PARI =-');
S:=0;
SommaPari(L,s);
Writeln('La somma degli elementi pari e'': ',s);
for i:=1 to 5 do writeln;
End;
5: Begin
Writeln('-= SOMMA DEGLI ELEMENTI DI POSTO PARI =-');
posizione:=0;
s:=0;
writeln('La Somma degli elemnti di posto pari e'': ', SommaposPari(L,s,posizione));
for i:=1 to 5 do writeln;
End;
6: Begin
Writeln('-= CANCELLA DA LISTA ORDINATA =-');
Write('Inserisci l''elemento da cancellare: ');
Readln(n);
Cancella(L,n);
Print_Lista(L);
for i:=1 to 5 do writeln;
End;
7: Begin
Writeln('-= COPIA RICORSIVA DI UNA LISTA =-');
NEW(L2);
CopiaLista(L,L2);
Write('Prima lista......');
Print_lista(L);
Writeln;
Write('Seconda lista....');
Print_Lista(L2);
for i:=1 to 5 do writeln;
End;
8: Begin
Writeln('-= COPIA INVERSA =-');
new(l2);
L2:=nil;
CopiaInversa(L,L2);
Write('Prima lista......');
Print_lista(L);
Writeln;
Write('Seconda lista....');
Print_Lista(L2);
for i:=1 to 5 do writeln;
End;
end;
Writeln('Premi invio per continuare');
readln;
until menu=99;
end.
--
Torna all'indice
Non ci sono commenti in questa pagina. [Scrivi commento]