INFOPedia : PRGsolb1

HomePage :: Categorie :: Indice :: Ultime modifiche :: Ultimi commenti :: Login/Registrazione

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
1begin
       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;
 2Begin
      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;
 3Begin
      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;
  4Begin
      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;
 5Begin
      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;
 6Begin
      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;
 7Begin
      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;
 8Begin
      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]

Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by Wikka Wakka Wiki 1.1.6.1
La pagina è stata generata in 0.2989 secondi