30/05/12 3:03
fabioser
Salve amici del Forum! Provo a riaprire una discussione su un tema già trattato in precedenza, con la speranza di risultare più chiaro questa volta. Il problema consiste nel calcolo della somma di due numeri interi di lunghezza qualsiasi. Va precisato che:
1) L'intero è rappresentato da singole cifre, cominciando da destra e procedendo via via verso sinistra, ossia dalle cifre meno significative a quelle più significative (es . : 1 2 5 6 7 rappresenta 12.567):
2) Gli interi sono tutti non negativi ( la lista è cioè composta di singole cifre intere comprese ovviamente fra 0 e 9 e non negative).
3) La singola cifra deve essere rappresentata mediante un intero.
All'atto pratico, faccio solo un esempio, si tratterà cioè di effettuare una somma del tipo:
1 2 5 6 7 +
2 0 5 =
_________
1 2 7 7 2
ovvero la somma della lista 12567,ossia del numero 12.567, e di quella 205,ovvero del numero 205, deve risultare la lista 12772 corrispondente al numero 12.772.
Per la rappresentazione delle due liste, ho scelto quella simmetrica e per risolvere il problema ho fatto uso di procedure ricorsive, sia per scrivere le due liste , sia per calcolarne la somma. Ecco il codice dell'intero programma:
Qualcuno di voi mi sa dire perchè il programma medesimo non funziona? Infatti al momento del calcolo della somma mi da errore. Forse è sbagliata la procedura CalcoloSommaDiDueListe? Vi sarei molto grato se mi segnalaste errori ed eventuali correzioni. Ciao!!!
1) L'intero è rappresentato da singole cifre, cominciando da destra e procedendo via via verso sinistra, ossia dalle cifre meno significative a quelle più significative (es . : 1 2 5 6 7 rappresenta 12.567):
2) Gli interi sono tutti non negativi ( la lista è cioè composta di singole cifre intere comprese ovviamente fra 0 e 9 e non negative).
3) La singola cifra deve essere rappresentata mediante un intero.
All'atto pratico, faccio solo un esempio, si tratterà cioè di effettuare una somma del tipo:
1 2 5 6 7 +
2 0 5 =
_________
1 2 7 7 2
ovvero la somma della lista 12567,ossia del numero 12.567, e di quella 205,ovvero del numero 205, deve risultare la lista 12772 corrispondente al numero 12.772.
Per la rappresentazione delle due liste, ho scelto quella simmetrica e per risolvere il problema ho fatto uso di procedure ricorsive, sia per scrivere le due liste , sia per calcolarne la somma. Ecco il codice dell'intero programma:
program SommaDiDueListe(input,output); type punt=^elem; elem= record val: integer; back : punt; next : punt; end; var p,q,s,t: punt; m,n : integer; procedure LeggiEScriviLista( t : punt; var p : punt; k : integer); begin if k=0 then p:=nil else begin new(p); read(p^.val); write(p^.val,' '); new(t); read(t^.val); p^.back:=t; write(t^.val,' '); LeggiEScriviLista(t,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; s^.next^.val:=p^.next^.val+q^.next^.val; if s^.next^.val>=10 then begin s^.next^.val:=(s^.next^.val)mod 10; s^.val:=p^.val+q^.val+(s^.next^.val)div 10; end; if s^.val<10 then write(s^.val,' ') else begin s^.val:=(s^.val)mod 10; write(s^.val,' '); end; if k=m then if s^.val>=10 then begin s^.back^.val:=(s^.val)div 10; write(s^.back^.val,' '); 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); write('Fornire la prima lista: '); LeggiEScriviLista(nil,p,m); writeln; write('Fornire la seconda lista: '); LeggiEScriviLista(nil,q,n); writeln; writeln('La lista somma e'':'); writeln; CalcoloSommaDiDueListe(s,p,q,m); readln; end.
Qualcuno di voi mi sa dire perchè il programma medesimo non funziona? Infatti al momento del calcolo della somma mi da errore. Forse è sbagliata la procedura CalcoloSommaDiDueListe? Vi sarei molto grato se mi segnalaste errori ed eventuali correzioni. Ciao!!!
aaa