Oppure

Loading
03/06/12 8:28
fabioser
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
p
costituisce il puntatore della lista e
piniz
il puntatore iniziale:


program LeggiEStampaNonRicorsivamente(input,output);
type punt=^elem;
     elem=record
                val : integer;
                next : punt;
          end;
var p,piniz: punt;
    k,n : integer;
    risposta : char;
    finito : boolean;

procedure LeggiEMemorizza( var p,piniz : punt );
begin
     for k:=1 to n
              do begin
                      if piniz=nil
                      then begin
                                new(piniz);
                                p:=piniz;
                           end
                      else begin
                                new(p^.next);
                                p:=p^.next;
                           end;
                      read(p^.val);
                      p^.next:=nil;
                  end;
end;{fine procedura LeggiEMemorizza}
Procedure StampaLista( var p,piniz : punt);
begin
     new(p);
     p:=piniz;
     repeat write(piniz^.val:2,' ');
            piniz:=piniz^.next;
     until piniz^.next=nil;
     write(piniz^.val:2,' ');
     readln;
end;{ fine procedura StampaLista }
{ corpo del programma }
begin
     repeat
           writeln('------------------------- Dati di ingresso -------------------------');
           writeln;
           writeln;
           write('Fornire la lunghezza della lista: ');
           readln(n);
           writeln;
           writeln('Fornire la lista in ingresso:');
           writeln;
           LeggiEMemorizza(p,piniz);
           writeln;
           writeln('La stampa della lista e'':');
           writeln;
           StampaLista(p,piniz);
           writeln;
           writeln;
           writeln('Finito?');
           writeln;
           writeln('Scrivere ''s'' per finire ''n'' per continuare');
           writeln;
           readln(risposta);
           finito:=(risposta='s');
           readln;
     until finito;

end.



Scusandomi in anticipo per la banalità della questione e per gli eventuali errori commessi, rimango in attesa di una risposta.Ciao!!!:)
aaa
04/06/12 7:02
fabioser
P.S.Ho usato procedure e non funzioni poichè lo richiede espressamente il problema da risolvere.
aaa
05/06/12 15:55
gigisoft
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':

procedure LeggiEMemorizza( var p,piniz : punt, n: integer );
var El: punt
     k: integer
begin
     for k := 1 to n
              do begin
                      El := New(punt);
                      read(El^.val);
                      El^.next := nil;

                      if piniz = nil
                           then piniz := El;
                           else p^.next := El;

                      p := El;
                  end;
end;{fine procedura LeggiEMemorizza}


riguardo alla procedura StampaLista, l'istruzione

     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'

until p = nil;


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

until ((risposta = 's') or (risposta = 'S'))
{oppure}
until (upcase(risposta) = 'S')



Ciao :k:
Ultima modifica effettuata da gigisoft 05/06/12 16:00
aaa
05/06/12 18:32
fabioser
Grazie mille per la dettagliata correzione del testo del programma!!!
aaa