Oppure

Loading
29/05/12 17:05
fabioser
Salve a tutti amici del forum. Ho il seguente problema da risolvere riguardo alla scrittura di una lista simmetrica in Pascal. La procedura da me elaborata infatti mi stampa la lista intera solo se è composta da un numero pari di cifre altrimenti me la tronca all'ultimo elemento. C'è qualcuno di voi che è in grado di suggerirmi dove sbaglio? ecco il codice:


program ScritturaDiUnaListaSimmetrica(input,output);
label 99;
const bell=07;
type punt=^elem;
     elem= record
                 val: integer;
                 back : punt;
                 next : punt;
           end;
var p,q : punt;
    m : integer;

    procedure LeggiEScriviLista( var p,q : punt; k : integer);
    begin
         if k=0
         then p:=nil
         else begin
                   new(p);
                   read(p^.val);
                   new(q);
                   read(q^.val);
                   p^.back:=q;
                   write(p^.val,' ');
                   write(q^.val,' ');
                   LeggiEScriviLista(p^.back,q,k-1);
              end;
    end;{ Fine procedura LeggiEScriviLista }

     
{ Corpo del programma }

begin
     writeln('------------------------- Dati di ingresso --------------------------');
     writeln;
     write('Fornire la lunghezza della lista: ');
     readln(m);
     writeln;
     if m>=20 then begin
                        writeln(chr(bell),'Errore nei dati di ingresso!- STOP -');
                        goto 99;
                   end
              else begin
                        write('Fornire la lista: ');
                        LeggiEScriviLista(p,q,m);
                   end;
     99 :
     readln;
     
end.



Ringraziandovi sin da ora per la collaborazione vi saluto. Ciao!:)
aaa
29/05/12 19:03
Poggi Marco
Ciao!

Ho letto il codice, e ho notato che la procedura LeggiEScriviLista fa troppe cose.

_ Crea due nuove istanze punt, senza concatenarli con quelli creati in precedenza.
_ Richiede l' inserimento dei dati.
_ Richiama se stessa in modo ricorsivo.

Ognuno di questi punti, andrebbe "sviluppato" con un' apposita funzione.
aaa
29/05/12 19:31
fabioser
Rispondo alle tre questioni:

a) il primo puntatore p serve per memorizzare il valore k-esimo della lista, dunque và inizializzato perchè non noto. Il secondo puntatore q serve a memorizzare il valore dell'elemento puntato da p, procedendo da destra a sinistra ( ovvero leggendo al contrario la lista cioè dall'ultimo elemento scritto al primo); anch'esso và inizializzato perchè non noto, ed è legato a p dall'istruzione :
p^.back:=q;
.
Dopo seguono stampe dei valori e la chiamata ricorsiva della funzione che genera tutte le k istanze di p e q, perchè viene ripetuta k-1 volte.
aaa
29/05/12 20:47
fabioser
A beneficio di tutti gli utenti del Forum pubblico la soluzione del problema.



program ScritturaDiUnaListaSimmetrica(input,output);
label 99;
const bell=07;
type punt=^elem;
     elem= record
                 val: integer;
                 back : punt;
                 next : punt;
           end;
var p,q : punt;
    m : integer;

    procedure LeggiEScriviLista( var p,q : punt; k : integer);
    begin
         if k=0
         then p:=nil
         else begin
                   new(p);
                   read(p^.val);
                   write(p^.val,' ');
                   new(q);
                   read(q^.val);
                   p^.back:=q;
                   write(q^.val,' ');
                   LeggiEScriviLista(q,p^.back,k-1);
              end;
    end;{ Fine procedura LeggiEScriviLista }

     
{ Corpo del programma }

begin
     writeln('------------------------- Dati di ingresso --------------------------');
     writeln;
     write('Fornire la lunghezza della lista: ');
     readln(m);
     writeln;
     if m>=20 then begin
                        writeln(chr(bell),'Errore nei dati di ingresso!- STOP -');
                        goto 99;
                   end
              else begin
                        writeln('Fornire la lista: ');
                        writeln;
                        LeggiEScriviLista(q,p,m);
                   end;
     99 :
     readln;
     
end.




Grazie a Tutti.
aaa
30/05/12 2:35
fabioser
La soluzione
ottimizzata
è la seguente (la prima stampa una lista di lunghezza m non superiore a 20, questa invece tampa una
lista
simmetrica
:



program ScritturaDiUnaListaSimmetrica(input,output);
label 99;
const bell=07;
type punt=^elem;
     elem= record
                 val: integer;
                 back : punt;
                 next : punt;
           end;
var p,q : punt;
    m : integer;

    procedure LeggiEScriviLista( q : punt; var p : punt; k : integer);
    begin
         if k=0
         then p:=nil
         else begin
                   new(p);
                   read(p^.val);
                   write(p^.val,' ');
                   new(q);
                   read(q^.val);
                   p^.back:=q;
                   write(q^.val,' ');
                   LeggiEScriviLista(q,p^.back,k-1);
              end;
    end;{ Fine procedura LeggiEScriviLista }

     
{ Corpo del programma }

begin
     writeln('------------------------- Dati di ingresso --------------------------');
     writeln;
     write('Fornire la lunghezza della lista: ');
     readln(m);
     writeln;
     if m>=20 then begin
                        writeln(chr(bell),'Errore nei dati di ingresso!- STOP -');
                        goto 99;
                   end
              else begin
                        writeln('Fornire la lista: ');
                        writeln;
                        LeggiEScriviLista(nil,p,m);
                   end;
     99 :
     readln;
     
end.

aaa