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 - Problema con un programma di stampa di una lista semplice memorizzata in maniera non ricorsiva
Forum - Pascal - Problema con un programma di stampa di una lista semplice memorizzata in maniera non ricorsiva

Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 10:28
Domenica, 03/06/2012
Salve a tutti. Ho il seguente semplice problema da sottoporre all'attenzione degli amici del forum. Il programma riportato di seguito, che dovrebbe stampare una lista memorizzata in ingresso in forma non ricorsiva, non mi accetta la formulazione in maniera dinamica, ovvero mi stampa solo la prima lista ma non le successive, se io rispondendo 'n' alla domanda 'Finito?' chiedo al programma medesimo di continuarea 'girare'. Vorrei sapere dov'è che sbaglio; forse nella formulazione della procedura di stampa? Riporto di seguito il codice, ove
Codice sorgente - presumibilmente Plain Text

  1. p

costituisce il puntatore della lista e
Codice sorgente - presumibilmente Plain Text

  1. piniz

il puntatore iniziale:

Codice sorgente - presumibilmente Delphi

  1. program LeggiEStampaNonRicorsivamente(input,output);
  2. type punt=^elem;
  3.      elem=record
  4.                 val : integer;
  5.                 next : punt;
  6.           end;
  7. var p,piniz: punt;
  8.     k,n : integer;
  9.     risposta : char;
  10.     finito : boolean;
  11.  
  12. procedure LeggiEMemorizza( var p,piniz : punt );
  13. begin
  14.      for k:=1 to n
  15.               do begin
  16.                       if piniz=nil
  17.                       then begin
  18.                                 new(piniz);
  19.                                 p:=piniz;
  20.                            end
  21.                       else begin
  22.                                 new(p^.next);
  23.                                 p:=p^.next;
  24.                            end;
  25.                       read(p^.val);
  26.                       p^.next:=nil;
  27.                   end;
  28. end;{fine procedura LeggiEMemorizza}
  29. Procedure StampaLista( var p,piniz : punt);
  30. begin
  31.      new(p);
  32.      p:=piniz;
  33.      repeat write(piniz^.val:2,' ');
  34.             piniz:=piniz^.next;
  35.      until piniz^.next=nil;
  36.      write(piniz^.val:2,' ');
  37.      readln;
  38. end;{ fine procedura StampaLista }
  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 la lista in ingresso:');
  49.            writeln;
  50.            LeggiEMemorizza(p,piniz);
  51.            writeln;
  52.            writeln('La stampa della lista e'':');
  53.            writeln;
  54.            StampaLista(p,piniz);
  55.            writeln;
  56.            writeln;
  57.            writeln('Finito?');
  58.            writeln;
  59.            writeln('Scrivere ''s'' per finire ''n'' per continuare');
  60.            writeln;
  61.            readln(risposta);
  62.            finito:=(risposta='s');
  63.            readln;
  64.      until finito;
  65.  
  66. end.



Scusandomi in anticipo per la banalità della questione e per gli eventuali errori commessi, rimango in attesa di una risposta.Ciao!!!:)

PM Quote
Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 9:02
Lunedì, 04/06/2012
P.S.Ho usato procedure e non funzioni poichè lo richiede espressamente il problema da risolvere.

PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 17:55
Martedì, 05/06/2012
Ciao,

innanzitutto dovresti inizializzare esplicitamente le variabili p e piniz al valore nil, onde evitare errori imprevedibili...
anche l'utilizzo di k e n come variabili globali per la procedura LeggiEMemorizza andrebbe evitato, sarebbe prferibile dargli n come parametro e dichiarare k all'interno.
Poi e' sempre preferibile non agire direttamente sui puntatori passati come parametri di i/op^.next e piniz;
la procedura LeggiEMemorizza andrebbe modificata cosi':

Codice sorgente - presumibilmente Delphi

  1. procedure LeggiEMemorizza( var p,piniz : punt, n: integer );
  2. var El: punt
  3.      k: integer
  4. begin
  5.      for k := 1 to n
  6.               do begin
  7.                       El := New(punt);
  8.                       read(El^.val);
  9.                       El^.next := nil;
  10.  
  11.                       if piniz = nil
  12.                            then piniz := El;
  13.                            else p^.next := El;
  14.  
  15.                       p := El;
  16.                   end;
  17. end;{fine procedura LeggiEMemorizza}



riguardo alla procedura StampaLista, l'istruzione

Codice sorgente - presumibilmente Plain Text

  1. new(p);



e' inutile

inoltre nel ciclo dovresti usare e modificare p, non piniz;
la write dopo il ciclo potrebbe potrebbe essere evitata se chiudi il ciclo cosi'

Codice sorgente - presumibilmente Pascal

  1. until p = nil;



infine nel programma principale l'uso della variabile finito e' inutile, il ciclo dovresti chiuderlo cosi'

Codice sorgente - presumibilmente Pascal

  1. until ((risposta = 's') or (risposta = 'S'))
  2. {oppure}
  3. until (upcase(risposta) = 'S')




Ciao :k:

Ultima modifica effettuata da gigisoft il 05/06/2012 alle 18:00
PM Quote
Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 20:32
Martedì, 05/06/2012
Grazie mille per la dettagliata correzione del testo del programma!!!

PM Quote