PDA

Visualizza la versione completa : [PASCAL] Calcolo somma di numeri interi rappresentati mediante liste


serfabio
11-01-2012, 16:44
Salve a tutti!!!Torno sul problema già trattato del calcolo, mediante un programma redatto in linguaggio Pascal, della somma di due interi rappresentati mediante liste di record e puntatori, proponendo due versioni corrette rispetto alle precedenti fornite( una non ricorsiva e l'altra ricorsiva ) del problema, 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:




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 e, in caso contrario, fornirmi quella giusta . Grazie e ciao a tutti!!! :ciauz:

alka
11-01-2012, 17:16
Hai già aperto questa discussione (http://forum.html.it/forum/showthread.php?s=&threadid=1491485) con un titolo del tutto identico, quindi perché aprirne un'altra ancora con lo stesso titolo e sullo stesso problema?

Ti è già stato detto qui (http://forum.html.it/forum/showthread.php?s=&postid=13473347#post13473347) il modo corretto in cui condurre le discussioni, senza fare un monologo: posti codice troppo lungo, o problemi troppo generali e "aperti" per poterti aiutare, visto che non si conosce qual è il problema specifico o spesso questo problema nemmeno c'è, poiché il codice che riporti (particolarmente lungo) andrebbe letto, esaminato e approfondito tutto per poter suggerire una miglioria, cosa che gli utenti non hanno ovviamente il tempo di fare, e non ha senso nemmeno richiederlo.

In conclusione, preciso ancora una volta che la discussione si apre quando c'è un problema specifico o un ostacolo che - a seguito di vari tentativi - non si riesce a superare, e in quel caso semplicemente si riporta la parte di codice rilevante da esaminare per poter suggerire una modifica o una correzione al codice.

Aprire una discussione, o anche più di una, mettendo un programma completo e chiedere genericamente di "migliorarlo" non è tollerato (tant'è che le tue discussioni vengono puntualmente ignorate, proprio per questi motivi).

Loading