Oppure

Loading
15/05/12 9:20
fabioser
Ho provato ad elaborare una nuova versione della forma ricorsiva del programma risolutore, che è la seguente:



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

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

     if k=0
     then s:=nil
     else begin
               new(s);
               s^.val:=p^.val+q^.val;
               case (p^.next^.val+q^.next^.val)of
               0,1,2,3,4,5,6,7,8,9 : s^.val:=p^.val+q^.val;
               10,11,12,13,14,15,16,17,18 : s^.val:=p^.val+q^.val+1
               end;
               case(s^.val)of
               0,1,2,3,4,5,6,7,8,9 :  write(s^.val,' ');
               10,11,12,13,14,15,16,17,18 : begin s^.val:=(s^.val)-10;
                                                  s^.back:=1;
                                                  s^.back^.val:=1;
                                                  write(s^.val,' ');
                                                  write(s^.back^.val,' ');
                                            end
               end;
               CalcoloSommaDiDueListe(s^.back,p^.back,q^.back,k-1);
          end;
end;{ Fine procedura CalcoloSommaDiDueListe }

{ Corpo del programma }
begin
     writeln('------------------------- Dati di ingresso --------------------------');
     writeln;
     write('Fornire la lunghezza della prima lista: ');
     readln(m);
     writeln;
     write('Fornire la lunghezza della seconda lista: ');
     readln(n);
     writeln;
     if m<n then begin
                      writeln(chr(bell),'Errore nei dati di ingresso!- STOP -');
                      goto 99;
                 end
            else begin
                      write('Fornire la prima lista: ');
                      LeggiEScriviLista(p,m);
                      writeln;
                      write('Fornire la seconda lista: ');
                      LeggiEScriviLista(q,n);
                      writeln;
                      write('La lista somma e'':');
                      CalcoloSommaDiDueListe(s,p,q,m+1);
                 end;
     99 :
     readln;

end.





Grazie dell'aiuto, se avrai tempo e modo di prestarmelo, nella soluzione del mio problema.Ciao!!!:asd:
aaa
15/05/12 12:30
Phi
Concordo quando dici che tu conosci già i valori nei campi val, ma il problema di cui parlo non è lì.
Tu non assegni mai un valore al campo next(nel corso dell'esecuzione il programma sa quale valore dovrebbe andare lì, ma non lo salva). Potresti risolvere apportando una leggera modifica qui:
procedure LeggiEScriviLista( var p : punt; pnext: punt; k : integer);
begin
     if k=0
     then p:=nil
     else begin
               new(p);
               read(p^.val);
               write(p^.val,' ');
               p^.next:=pnext; //Assegno qui a p.next il valore del puntatore all'elemento precedente
               LeggiEScriviLista(p^.back,p,k-1);
          end;
end;


Edit:
Potresti postare anche l'output del programma ?
Ultima modifica effettuata da Phi 15/05/12 12:36
aaa
15/05/12 14:37
fabioser
Grazie tanto della risposta quanto del suggerimento. Per quanto riguarda l'output, lavoro su ambiente Windows e pertanto riesco con il compilatore che uso ad arrivare sino all'inserimento dei dati della prima lista, dopodichè, alla pressione del tasto <INVIO>, invece della visualizzazione della lista stessa,Dev-Pascal chiude improvvisamente la finestra del compilatore, impedendo l'inserimento di altri dati e quindi di completare la verifica.:_doubt:
aaa
15/05/12 16:10
Phi
alla pressione del tasto <INVIO>, invece della visualizzazione della lista stessa,Dev-Pascal chiude improvvisamente la finestra del compilatore,

Puoi risolvere aprendo una tua finestra console. Per farlo cerca "prompt dei comandi" o schiaccia Windows+R[i] e scrivi [i]cmd. Ora spostati nella cartella dove si trova l'eseguibile compilato ed eseguilo.

aaa
15/05/12 19:16
fabioser
Grazie mille. Tuttavia scusami non mi ricordo il comando per eseguire il file .pas...:(
aaa
15/05/12 21:25
Phi
Non devi eseguire il file sorgente, ma il programma creato dal compilatore(.exe).
Non hai bisogno di comandi per eseguire un file.
aaa
16/05/12 4:02
fabioser
Mi da sempre lo stesso tipo di errore. Ma credo che ciò sia dovuto al fatto che bisogna usare readln e writeln, con i dati inseriti uno per uno separati da <INVIO>.Ho provato a modificare il programma in questo senso ma mi da come risultato sempre lo stesso tipo di errore. Credo che ci sia qualche difetto nella sintassi delle due procedure che provoca ciò e che il testo vada rivisto. Grazie per l'aiuto e le preziose informazioni. Ciao!!!
aaa
16/05/12 11:24
Phi
No. Il problema riguarda il tuo codice.
Dovrebbe darti un "Runtime error 216"(ovvero una violazione di memoria) nell'eseguire la somma infatti non esegui alcun controllo per verificare che il puntatore successivo sia allocato, e(per come hai costruito la procedura somma) arriverai sempre ad un puntatore non allocato. A quel punto il programma di dà errore. Se provi a debuggarlo te ne rendi subito conto.
aaa