Salve a tutti!!! Chiedo aiuto nella soluzione del seguente esercizio che, pur essendo semplice, non mi riesce di risolvere completamente. Si tratta di scrivere la somma di due polinomi di grado qualunque con un programma Pascal, tenendo presente che un polinomio di grado qualsiasi( che noi supporremo non superi il grado dieci) può essere pensato come un array di record con quest'ultimo costituito da due campi, che rappresentano il coefficiente e l'esponente di ogni suo termine, rispettivamente. Nella soluzione che vi propongo ho usato due procedure, una per acquisire i due polinomi e rappresentarli in forma scritta e la seconda per calcolarne la somma, tenendo presente che se i due polinomi hanno gradi diversi n ed m ( con ad esempio n>m), si dovranno sommare solo i primi m coefficienti dei rispettivi termini lasciando inalterati gli altri n-m.
Il programma che presento è sintatticamente corretto ma non fornisce risultati esatti; ad esempio se il primo polinomio è: 2 x^2+3 x+1=0, e il secondo è 3 x^3+2x^2+5x+2=0, il risultato è: 5 X^2+3=0 e non 3x^3+4x^2+8x+3=0. Ecco il testo del programma:
Grazie a tutti coloro che saranno in grado di fornire la soluzione corretta del programma, segnalandomi gli errori. Ciaocodice:program SommaDiPolinomi(input,output); label 99; const bell=07; n=10; type termine = record coeff : real; esp : integer; end; pol=array[1..n]of termine; var p,pol1,pol2,polsomma : pol; l,m,c1,c2 : integer; procedure leggipolinomio( var p :pol; var c : integer; k : integer); var i : integer; begin if k>n then begin writeln(chr(bell),'Errore nei dati di ingresso! - STOP -'); goto 99 end else writeln('Fornire il polinomio in ingresso: '); writeln; for i:=1 to k do begin readln(p[i].coeff); readln(p[i].esp); end; readln(c); writeln; for i:=1 to k do write((p[i].coeff):2:2,' * X^ ',(p[i].esp):2,' + '); writeln(c,' = 0'); end;(* fine procedura leggipolinomio *) procedure Somma( var polsomma : pol; c1,c2 : integer; pol1,pol2 : pol); var i,d : integer; begin if pol1[l].esp>=pol2[m].esp then begin for i:=1 to pol2[m].esp do begin polsomma[i].coeff:=pol1[i].coeff+pol2[i].coeff; polsomma[i].esp:=pol1[i].esp; end; for i:=pol2[m].esp+1 to pol1[l].esp do begin polsomma[i].coeff:=pol1[i].coeff; polsomma[i].esp:=pol1[i].esp; end end else begin for i:=1 to pol1[l].esp-1 do begin polsomma[i].coeff:=pol1[i].coeff+pol2[i].coeff; polsomma[i].esp:=pol2[i].esp; end; for i:=pol1[l].esp to pol2[m].esp do begin polsomma[i].coeff:=pol2[i].coeff; polsomma[i].esp:=pol2[i].esp; end; end; d:=c1+c2; writeln; writeln('Il polinomio somma e'': '); writeln; if pol1[l].esp>pol2[m].esp then begin for i:=1 to pol1[l].esp do write((polsomma[i].coeff):2:2,' * X^ ',(polsomma[i].esp):2,' + '); writeln(d,' = 0') end else begin for i:=1 to pol2[m].esp do write((polsomma[i].coeff):2:2,' * X^ ',(polsomma[i].esp):2,' + '); writeln(d,' = 0'); end; end;(* fine procedura Somma *) (*Corpo del programma *) begin writeln('------------------ Dati di ingresso ----------------------------'); writeln; write('Fornire il grado del primo polinomio: '); readln(l); writeln; write('Fornire il grado del secondo polinomio: '); readln(m); writeln; leggipolinomio(pol1,c1,l); writeln; leggipolinomio(pol2,c2,m); Somma(polsomma,c1,c2,pol1,pol2); 99 : readln; end.![]()

Rispondi quotando
