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 - Ordinamento in senso inverso rispetto a quello dato di una lista simmetrica
Forum - Pascal - Ordinamento in senso inverso rispetto a quello dato di una lista simmetrica

Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 17:25
Martedì, 26/06/2012
Salve a tutti, utenti e moderatori del forum. Ho il seguente problema da sottoporre alla vostra attenzione. Si tratta di ordinare e stampare una lista nell'ordine inverso rispetto a quello fornito in ingresso. Ho elaborato il seguente programma come soluzione, che fa uso, per la rappresentazione della lista di due campi puntatore back e next, e di due funzioni una per acquisire la lista, l'altra per invertirla. Il codice è il seguente ( e fa uso di suggerimenti precedenti dei membri del forum):

Codice sorgente - presumibilmente Delphi

  1. program InvertiLista(input,output);
  2. type verso=(vNext,vBack);
  3.      punt=^elem;
  4.      elem=record
  5.                 val : real;
  6.                 back : punt;
  7.                 next : punt;
  8.           end;
  9. var p,lista: punt;
  10.     n,risposta : integer;
  11.  
  12.     Function LeggiLista( p,q: punt; k : integer): punt;
  13.     begin
  14.          if k=0
  15.          then p:=nil
  16.          else begin
  17.                    new(p);
  18.                    read(p^.val);
  19.                    new(q);
  20.                    read(q^.val);
  21.                    p^.next:=q;
  22.                    p^.back:=LeggiLista(p,q,k-1)
  23.               end;
  24.     end;{ fine function LeggiLista }
  25.     Function GiraLista( setverso : verso; r : punt ): punt;
  26.     begin
  27.          p:=r;
  28.          case setverso of
  29.          vBack : begin
  30.                       while p^.back<>nil
  31.                       do p:=p^.back;
  32.                  end;
  33.          vNext : begin
  34.                       while p^.next<>nil
  35.                       do p:=p^.next;
  36.                  end;
  37.          end;
  38.     end;{ fine function GiraLista }
  39. { corpo del programma }
  40. begin
  41.      repeat
  42.            writeln('--------------------- Dati di ingresso ------------------------');
  43.            writeln;
  44.            writeln;
  45.            write('Fornire la lunghezza della lista: ');
  46.            readln(n);
  47.            writeln;
  48.            writeln('Fornire le lista in ingresso:');
  49.            writeln;
  50.            p:=LeggiLista(p,nil,n);
  51.            writeln;
  52.            writeln;
  53.            writeln('La lista risultante e'':');
  54.            writeln;
  55.            p:=GiraLista(vNext,p);
  56.            writeln;
  57.            lista:=p;
  58.            repeat
  59.                  write(lista^.val:2:2,' ');
  60.                  lista:=lista^.back;
  61.            until lista=nil;
  62.            write(lista^.val:2:2,' ');
  63.            writeln;
  64.            writeln;
  65.            writeln('Finito?');
  66.            writeln;
  67.            write('Scrivere ''1'' per finire ''2'' per continuare');
  68.            readln(risposta);
  69.      until(risposta=1);
  70.      readln;
  71. end.



Tuttavia il programma non mi fornisce il risultato finale alla pressione del tasto <INVIO>. Qualcuno tra voi è in grado di spiegarmi perchè? Certo dell'attenzione che vorrete porre al mio problema vi saluto e vi ringrazio in anticipo per la disponibilità. Ciao!!!:)

PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 17:57
Martedì, 26/06/2012

Quale dovrebbe essere il risultato finale :-?


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 18:03
Martedì, 26/06/2012
La lista di partenza con gli elementi disposti in senso inverso, ossia dall'ultimo al primo.

PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 18:45
Martedì, 26/06/2012

Dopo che hai immesso il numero di elementi (n), non hai modo di sapere

passo passo il punto della lista che stai inserendo, se per esempio inserisci

n = 100, ti voglio vedere a tenere a mente 100 inserimenti :yup:


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 19:13
Martedì, 26/06/2012
Non capisco...si può inserire un'istruzione di controllo che imponga che n non superi un dato valore, ma questo è sufficiente per far funzionare il programma?

PM Quote
Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 19:26
Martedì, 26/06/2012
...se per cortesia puoi postare un esempio con del codice forse riuscirei meglio a capire l'errore e l'eventuale correzione da applicare...

PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 23:32
Martedì, 26/06/2012


  
Codice sorgente - presumibilmente Delphi

  1. Function LeggiLista( p,q: punt; k : integer): punt;
  2.     begin
  3.          writeln('Elementi da inserire nella Lista =  ',K);
  4.          if k=0
  5.          then p:=nil
  6.          else begin
  7.                    writeln('Inserisci elemento nella Lista:');
  8.                    new(p);
  9.                    read(p^.val);
  10.                    new(q);
  11.                    read(q^.val);
  12.                    p^.next:=q;
  13.                    p^.back:=LeggiLista(p,q,k-1)
  14.               end;
  15.     end;{ fine function LeggiLista }
  16.  
  17.     In questo modo dovresti avere un controllo migliore



If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Segnala al moderatore
Postato alle 1:00
Mercoledì, 27/06/2012
Secondo me non puoi prendere pezzi di codice, incollarli e sperare che tutto funzioni.

la funzione di lettura vediamo di metterla dritta una volta x tutte:

Codice sorgente - presumibilmente Delphi

  1. Function LeggiLista(pNext: punt; k: integer): Punt;
  2.     begin
  3.       if k=0 then
  4.         Result := nil
  5.       else
  6.       begin
  7.         new(Result);
  8.         read(Result.val);
  9.         Result.back:=pNext;
  10.         Result.next := LeggiLista(Result, k-1);
  11.       end;
  12.     end;


In next ci va il prossimo numero in back quello vecchio e la chiamata è:
Codice sorgente - presumibilmente Plain Text

  1. p:=LeggiLista(Nil, n);



Poi la funzione giraliste vediamo di farla un po' più furba in modo che capisca "da sola" il verso da cambiare e per far questo c'e' bisogno di un ulteriore funzione che ricava il verso
Codice sorgente - presumibilmente Delphi

  1. Function GetVerso(oLista: Punt):Verso;
  2.   begin
  3.    if oLista.next = Nil then
  4.      Result := vNext
  5.    else
  6.      Result := vBack;
  7.   end;
  8.  
  9.   Function GiraListe(oPunt: Punt): punt;
  10.   var oVerso: verso;
  11.   begin
  12.     Result := oPunt;
  13.     oVerso := GetVerso(Result);
  14.     case oVerso of
  15.       vBack: begin
  16.                while Result.next<>nil do
  17.                  Result := Result.next;
  18.              end;
  19.       vNext: begin
  20.                while Result.back<>nil do
  21.                  Result := Result.back;
  22.              end;
  23.     end;
  24.   end;



Ok adesso abbiamo tutto e per non farci mancare niente facciamo anche una funzioncina di stampa, ovviamente anche questa sfrutta il verso di stampa
Codice sorgente - presumibilmente Delphi

  1. Procedure StampaLista(oLista: punt);
  2.   Var oVerso: verso;
  3.   begin
  4.     oVerso := GetVerso(oLista);
  5.  
  6.     while not(oLista = nil) do
  7.     begin
  8.       write(oLista^.val:2:2,' ');
  9.       case oVerso of
  10.        vNext : oLista := oLista^.Back;
  11.        vBack : oLista := oLista^.next;
  12.       end;
  13.     end;
  14.   end;



bene adesso che abbiamo tutto facciamo mente locale, uso delphi per compilare, ma il succo è lo stesso, l'ho provata solo qualche min non sono stato tanto a fargli le pulci,  

Codice sorgente - presumibilmente Delphi

  1. program Project24;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. {$R *.res}
  6.  
  7. uses
  8.   System.SysUtils;
  9.     type verso=(vNext,vBack);
  10.          punt=^elem;
  11.          elem=record
  12.                     val : real;
  13.                     back : punt;
  14.                     next : punt;
  15.               end;
  16.     var p,lista, lista1: punt;
  17.         n,risposta : integer;
  18.  
  19.     Function LeggiLista(pNext: punt; k: integer): Punt;
  20.     begin
  21.       if k=0 then
  22.         Result := nil
  23.       else
  24.       begin
  25.         new(Result);
  26.         read(Result.val);
  27.         Result.back:=pNext;
  28.         Result.next := LeggiLista(Result, k-1);
  29.       end;
  30.     end;{ Fine procedura LeggiEScriviLista }
  31.  
  32.   Function GetVerso(oLista: Punt):Verso;
  33.   begin
  34.    if oLista.next = Nil then
  35.      Result := vNext
  36.    else
  37.      Result := vBack;
  38.   end;
  39.  
  40.   Function GiraListe(oPunt: Punt): punt;
  41.   var oVerso: verso;
  42.   begin
  43.     Result := oPunt;
  44.     oVerso := GetVerso(Result);
  45.     case oVerso of
  46.       vBack: begin
  47.                while Result.next<>nil do
  48.                  Result := Result.next;
  49.              end;
  50.       vNext: begin
  51.                while Result.back<>nil do
  52.                  Result := Result.back;
  53.              end;
  54.     end;
  55.   end;
  56.  
  57.   Procedure StampaLista(oLista: punt);
  58.   Var oVerso: verso;
  59.   begin
  60.     oVerso := GetVerso(oLista);
  61.  
  62.     while not(oLista = nil) do
  63.     begin
  64.       write(oLista^.val:2:2,' ');
  65.       case oVerso of
  66.        vNext : oLista := oLista^.Back;
  67.        vBack : oLista := oLista^.next;
  68.       end;
  69.     end;
  70.   end;
  71.  
  72. begin
  73.   try
  74.  
  75.     { corpo del programma }
  76.    repeat
  77.          writeln('--------------------- Dati di ingresso ------------------------');
  78.          writeln;
  79.          writeln;
  80.          write('Fornire la lunghezza della lista: ');
  81.          readln(n);
  82.          writeln;
  83.          writeln('Fornire le lista in ingresso:');
  84.          writeln;
  85.          p:=LeggiLista(Nil, n);
  86.          writeln;
  87.          writeln;
  88.          writeln('La lista risultante e'':');
  89.          writeln;
  90.          lista  := GiraListe(p);
  91.          lista1 := GiraListe(lista);
  92.          writeln;
  93.          writeln;
  94.          writeln('Lista originale');
  95.          StampaLista(p);
  96.          writeln;
  97.          writeln;
  98.          writeln('Lista Girata');
  99.          StampaLista(lista);
  100.          writeln;
  101.          writeln;
  102.          writeln('Lista RI-Girata');
  103.          StampaLista(lista1);
  104.          writeln;
  105.          writeln;
  106.          writeln('Finito?');
  107.          writeln;
  108.          write('Scrivere ''1'' per finire ''2'' per continuare');
  109.          readln(risposta);
  110.    until(risposta=1);
  111.    readln;
  112.   except
  113.     on E: Exception do
  114.       Writeln(E.ClassName, ': ', E.Message);
  115.   end;
  116. end.



Ibis redibis non morieris in bello
PM Quote
Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 8:00
Mercoledì, 27/06/2012
Grazie Goblin!!!

PM Quote