Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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:
Codice sorgente - presumibilmente Delphi
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
elsebegin
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);
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!!!
Adesso creo di aver finalmente capito cosa vuoi fare (spero !!)
Io continuo a preferire le function per un ritorno di valore dunque la prima function che raccoglie i valori diventa (come ti era già stato detto):
Codice sorgente - presumibilmente Delphi
Function LeggiEScriviLista(pNext: punt; k:integer): Punt;
begin
if k=0 then
Result :=nil
else
begin
new(Result);
read(Result.val);
Result.next:=pNext;
Result.Back:= LeggiEScriviLista(Result, k-1);
end;
end;{ Fine procedura LeggiEScriviLista }
le chiamte sono:
p := LeggiEScriviLista(Nil, m);
q := LeggiEScriviLista(Nil, n);
anche qui mi/ci sono/siamo ripetuto/i.
e per stravolgere il tutto io trasformerei CalcoloSommaDiDueListe sempre in una function sulla falsa riga di LeggiEScriviLista e molto semplificata
dunque:
Codice sorgente - presumibilmente Delphi
Function CalcoloSommaDiDueListe(sBack, p, q: punt; k:integer): Punt;
Function GiraListe(oPunt: Punt; oVerso: SetVerso): punt;
begin
Result := oPunt;
case oVerso of
tvBack:begin
while Result.back<>nil do
Result := Result.back;
end;
tvNext:begin
while Result.Next<>nil do
Result := Result.Next;
end;
end;
end;
begin
try
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 -');
exit;
end
else
begin
write('Fornire la prima lista: ');
writeln;
p := LeggiEScriviLista(Nil, m);
writeln;
write('Fornire la seconda lista: ');
writeln;
q := LeggiEScriviLista(Nil, n);
writeln;
writeln('La lista somma e'':');
writeln;
p := GiraListe(p, tvBack );
q := GiraListe(q, tvBack);
s := CalcoloSommaDiDueListe(nil, p, q, 0);
s := GiraListe(s, tvNext);
oDummy := s;
repeat
Write(oDummy.val);
oDummy := oDummy.back;
until oDummy.back=nil;
Write(oDummy.val);
end;
readln(st);
end.
Non credo sia un codice molto ortodosso, si può limare e perfezionare ancora, ma dovrebbe essere un buon punto di partenza.
Non l'ho commentato ma la semplicità credo parli da sola..
a rivederlo direi che ho commesso un errore nella somma del riporto K, dunque il codice giusto dovrebbe essere:
Codice sorgente - presumibilmente Delphi
if q <> Nilthen
Result.val:= k + p.val+ q.val
else
Result.val:= k + p.val;
K viene valorizzato a 0 al primo giro
Codice sorgente - presumibilmente Plain Text
s := CalcoloSommaDiDueListe(nil, p, q, 0);
Ho effettuato un minigiro di debug, cosa che prima non avevo fatto, e mi sono accorto di alcune inesattezze nel codice, per
esempio se sommo 999 e 44 il risultato deve essere 1043 dunque la lista risultante deve essere dinamica.
Devo dire che il codice scritto così è abbastanza orribile... vediamo di fare un refactoring "parlante e più mantenibile", e di dare un commento al codice.
Codice sorgente - presumibilmente Delphi
program SommaDiDueListe;
uses
SysUtils;
const bell=07;
Type SetVerso =(tvNext, tvBack);
type TpuntElemento =^Telem;
Telem=record
val:integer;
back : TpuntElemento;
next : TpuntElemento;
end;
var Lista_1, Lista_2, Risultato, oDummy: TpuntElemento;
nLungLista_1, nLungLista_2:integer;
nDomanda:Integer;
Function LeggiEScriviLista(pNext: TpuntElemento; nLung:integer): TpuntElemento;