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 - Scrittura e stampa di una lista simmetrica
Forum - Pascal - Scrittura e stampa di una lista simmetrica

Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 19:05
Martedì, 29/05/2012
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:

Codice sorgente - presumibilmente Delphi

  1. program ScritturaDiUnaListaSimmetrica(input,output);
  2. label 99;
  3. const bell=07;
  4. type punt=^elem;
  5.      elem= record
  6.                  val: integer;
  7.                  back : punt;
  8.                  next : punt;
  9.            end;
  10. var p,q : punt;
  11.     m : integer;
  12.  
  13.     procedure LeggiEScriviLista( var p,q : punt; k : integer);
  14.     begin
  15.          if k=0
  16.          then p:=nil
  17.          else begin
  18.                    new(p);
  19.                    read(p^.val);
  20.                    new(q);
  21.                    read(q^.val);
  22.                    p^.back:=q;
  23.                    write(p^.val,' ');
  24.                    write(q^.val,' ');
  25.                    LeggiEScriviLista(p^.back,q,k-1);
  26.               end;
  27.     end;{ Fine procedura LeggiEScriviLista }
  28.  
  29.      
  30. { Corpo del programma }
  31.  
  32. begin
  33.      writeln('------------------------- Dati di ingresso --------------------------');
  34.      writeln;
  35.      write('Fornire la lunghezza della lista: ');
  36.      readln(m);
  37.      writeln;
  38.      if m>=20 then begin
  39.                         writeln(chr(bell),'Errore nei dati di ingresso!- STOP -');
  40.                         goto 99;
  41.                    end
  42.               else begin
  43.                         write('Fornire la lista: ');
  44.                         LeggiEScriviLista(p,q,m);
  45.                    end;
  46.      99 :
  47.      readln;
  48.      
  49. end.



Ringraziandovi sin da ora per la collaborazione vi saluto. Ciao!:)

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 21:03
Martedì, 29/05/2012
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.

PM Quote
Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 21:31
Martedì, 29/05/2012
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 :
Codice sorgente - presumibilmente Plain Text

  1. 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.

PM Quote
Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 22:47
Martedì, 29/05/2012
A beneficio di tutti gli utenti del Forum pubblico la soluzione del problema.

Codice sorgente - presumibilmente Delphi

  1. program ScritturaDiUnaListaSimmetrica(input,output);
  2. label 99;
  3. const bell=07;
  4. type punt=^elem;
  5.      elem= record
  6.                  val: integer;
  7.                  back : punt;
  8.                  next : punt;
  9.            end;
  10. var p,q : punt;
  11.     m : integer;
  12.  
  13.     procedure LeggiEScriviLista( var p,q : punt; k : integer);
  14.     begin
  15.          if k=0
  16.          then p:=nil
  17.          else begin
  18.                    new(p);
  19.                    read(p^.val);
  20.                    write(p^.val,' ');
  21.                    new(q);
  22.                    read(q^.val);
  23.                    p^.back:=q;
  24.                    write(q^.val,' ');
  25.                    LeggiEScriviLista(q,p^.back,k-1);
  26.               end;
  27.     end;{ Fine procedura LeggiEScriviLista }
  28.  
  29.      
  30. { Corpo del programma }
  31.  
  32. begin
  33.      writeln('------------------------- Dati di ingresso --------------------------');
  34.      writeln;
  35.      write('Fornire la lunghezza della lista: ');
  36.      readln(m);
  37.      writeln;
  38.      if m>=20 then begin
  39.                         writeln(chr(bell),'Errore nei dati di ingresso!- STOP -');
  40.                         goto 99;
  41.                    end
  42.               else begin
  43.                         writeln('Fornire la lista: ');
  44.                         writeln;
  45.                         LeggiEScriviLista(q,p,m);
  46.                    end;
  47.      99 :
  48.      readln;
  49.      
  50. end.




Grazie a Tutti.

PM Quote
Avatar
fabioser (Normal User)
Rookie


Messaggi: 59
Iscritto: 12/05/2012

Segnala al moderatore
Postato alle 4:35
Mercoledì, 30/05/2012
La soluzione
Codice sorgente - presumibilmente Plain Text

  1. ottimizzata

è la seguente (la prima stampa una lista di lunghezza m non superiore a 20, questa invece tampa una
Codice sorgente - presumibilmente Plain Text

  1. lista

Codice sorgente - presumibilmente Plain Text

  1. simmetrica

:

Codice sorgente - presumibilmente Delphi

  1. program ScritturaDiUnaListaSimmetrica(input,output);
  2. label 99;
  3. const bell=07;
  4. type punt=^elem;
  5.      elem= record
  6.                  val: integer;
  7.                  back : punt;
  8.                  next : punt;
  9.            end;
  10. var p,q : punt;
  11.     m : integer;
  12.  
  13.     procedure LeggiEScriviLista( q : punt; var p : punt; k : integer);
  14.     begin
  15.          if k=0
  16.          then p:=nil
  17.          else begin
  18.                    new(p);
  19.                    read(p^.val);
  20.                    write(p^.val,' ');
  21.                    new(q);
  22.                    read(q^.val);
  23.                    p^.back:=q;
  24.                    write(q^.val,' ');
  25.                    LeggiEScriviLista(q,p^.back,k-1);
  26.               end;
  27.     end;{ Fine procedura LeggiEScriviLista }
  28.  
  29.      
  30. { Corpo del programma }
  31.  
  32. begin
  33.      writeln('------------------------- Dati di ingresso --------------------------');
  34.      writeln;
  35.      write('Fornire la lunghezza della lista: ');
  36.      readln(m);
  37.      writeln;
  38.      if m>=20 then begin
  39.                         writeln(chr(bell),'Errore nei dati di ingresso!- STOP -');
  40.                         goto 99;
  41.                    end
  42.               else begin
  43.                         writeln('Fornire la lista: ');
  44.                         writeln;
  45.                         LeggiEScriviLista(nil,p,m);
  46.                    end;
  47.      99 :
  48.      readln;
  49.      
  50. end.


PM Quote