13/01/12 11:23
serfabio
Salve a tutti amici del forum!!!Mi rivolgo a voi, nella speranza di trovare un aiuto nella soluzione del seguente problema; è noto come due numeri interi ( che noi supporremo tali che il primo in ingresso sia maggiore o uguale al secondo, in quanto a numero di cifre che lo caratterizzano) possano essere rappresentati mediante due liste distinte che fanno uso di record e puntatori; si vuole scrivere un programma che dati due numeri così rappresentati, calcoli e stampi la loro somma. Ho provato ad elaborare un programma, risolutore del problema sopra citato, che fa uso di due procedure, la prima scritta per acquisire le due liste e rappresentarle, la seconda per calcolare la somma degli elementi delle liste suddette. In tale calcolo bisogna tenere conto delle cifre da riportare e da sommare, quando l'addizione di due elementi delle due liste superi il valore di dieci ed inoltre occorre tenere conto del fatto che , se le due liste sono di uguale lunghezza e la somma dell'ultima coppia di elementi ( le prime due cifre dei due numeri dati da sinistra!) ha valore maggiore di dieci occorre che la lista che rappresenta la somma abbia un elemento in più e pari ad 1. Ho provato ad elaborare due soluzioni distinte del problema ( una non ricorsiva e l'altra ricorsiva ),ove s, p e q costituiscono la lista somma e le due liste da sommare di cui la prima di lunghezza m e la seconda n, con m>=n:
a) Versione non ricorsiva:
b) Versione ricorsiva:
Sarei molto grato a chiunque di voi, amici del forum, sapesse indicarmi se possono essere considerate soluzioni corrette poichè Dev-Pascal mi da errori a tempo di esecuzione ( MI CHIUDE LA FINESTRA AL MOMENTO DEL CALCOLO DELLA SOMMA) e, quindi , in caso non lo fossero, fornirmi le correzioni giuste . Grazie e ciao a tutti!!!
a) Versione non ricorsiva:
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,k : 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); var i : integer; begin new(s); begin s^.val:=p^.val+q^.val; 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^.back^.val:=p^.back^.val+q^.back^.val+1; s^.val:=(s^.val)-10; write(s^.val,' '); end end; p:=p^.back; q:=q^.back; s:=s^.back; for i:=2 to m do begin case(p^.val+q^.val)of 0,1,2,3,4,5,6,7,8,9 : begin if s^.back^.next^.val=p^.val+q^.val+1 then begin s^.val:=(p^.val+q^.val+1); write(s^.val,' ') end else begin s^.val:=(p^.val+q^.val); write(s^.val,' ') end; end; 10,11,12,13,14,15,16,17,18 : begin if s^.back^.next^.val=p^.val+q^.val+1 then begin s^.val:=(p^.val+q^.val+1)-10; write(s^.val,' '); end else begin s^.val:=(p^.val+q^.val)-10; write(s^.val,' ') end; end end; p:=p^.back; q:=q^.back; s:=s^.back; end; if i=m then begin case(p^.val+q^.val)of 0,1,2,3,4,5,6,7,8,9 : s^.back:=nil; 10,11,12,13,14,15,16,17,18 : begin(s^.back^.val):=1; write(s^.back^.val,' '); end end; s^.back^.back:=nil; end; 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; writeln('La lista somma e'':'); CalcoloSommaDiDueListe(p,q,s); end; 99 : readln; end.
b) Versione ricorsiva:
program SommaDiDueListe(input,output); label 99; const bell=07; type punt=^elem; elem= record val: integer; back : punt; end; var p,q,s : punt; m,n,k : 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^.back:=nil else begin new(s); s^.val:=p^.val+q^.val; 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; write(s^.val,' '); s^.back^.val:=(p^.back^.val+q^.back^.val+1); 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; writeln('La lista somma e'':'); CalcoloSommaDiDueListe(s,p,q,m); end; 99 : readln; end.
Sarei molto grato a chiunque di voi, amici del forum, sapesse indicarmi se possono essere considerate soluzioni corrette poichè Dev-Pascal mi da errori a tempo di esecuzione ( MI CHIUDE LA FINESTRA AL MOMENTO DEL CALCOLO DELLA SOMMA) e, quindi , in caso non lo fossero, fornirmi le correzioni giuste . Grazie e ciao a tutti!!!
aaa