Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52

    Soluzione di un esercizio in Pascal

    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:

    codice:
    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.
    Grazie a tutti coloro che saranno in grado di fornire la soluzione corretta del programma, segnalandomi gli errori. Ciao

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52
    Ecco una forma che mi sembra più corretta del programma. Ma...il medesimo non funziona ancora!!!

    codice:
    program SommaDiDuePolinomi(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 l>=m
         then begin
                   for i:=1 to l-m
                               do begin
                                       polsomma[i].coeff:=pol1[i].coeff+pol2[i].coeff;
                                       polsomma[i].esp:=pol1[i].esp;
                                  end;
                   for i:=l-m+1 to l
                       do begin
                               polsomma[i].coeff:=pol1[i].coeff;
                               polsomma[i].esp:=pol1[i].esp;
                          end
              end
         else begin
                   for i:=1 to m-l
                               do begin
                                       polsomma[i].coeff:=pol1[i].coeff+pol2[i].coeff;
                                       polsomma[i].esp:=pol2[i].esp;
                                  end;
                   for i:=m-l+1 to m
                       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 l>m
         then begin
                   for i:=1 to l
                                   do write((polsomma[i].coeff):2:2,' * X^ ',(polsomma[i].esp):2,' + ');
                   writeln(d,' = 0')
              end
         else begin
                   for i:=1 to m
                            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.
    Ciao!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52
    Questa ulteriore versione, opportunamente corretta, funziona se i due polinomi hanno lo stesso grado. Il programma è il seguente:

    codice:
    program SommaDiDuePolinomi(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 l>=m
         then begin
                   for i:=1 to m
                               do begin
                                       polsomma[i].coeff:=pol1[i].coeff+pol2[i].coeff;
                                       polsomma[i].esp:=pol1[i].esp;
                                  end;
                   for i:=m+1 to l
                       do begin
                               polsomma[i].coeff:=pol1[i].coeff;
                               polsomma[i].esp:=pol1[i].esp;
                          end
              end
         else begin
                   for i:=1 to l-1
                               do begin
                                       polsomma[i].coeff:=pol1[i].coeff+pol2[i].coeff;
                                       polsomma[i].esp:=pol2[i].esp;
                                  end;
                   for i:=l to m
                       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 l>m
         then begin
                   for i:=1 to l
                                   do write((polsomma[i].coeff):2:2,' * X^ ',(polsomma[i].esp):2,' + ');
                   writeln(d,' = 0')
              end
         else begin
                   for i:=1 to m
                            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.
    Credo che la soluzione sia nel valutare due polinomi dello stesso grado attribuendo coefficiente zero al termine (o ai termini) di grado più alto nel caso risultino nulli, quando si confrontano due polinomi di grado diverso tra di loro!!!

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52
    Il programma corretto è il seguente:

    codice:
    program SommaDiDuePolinomi(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;
        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
         for i:=1 to m
                     do begin
                             polsomma[i].coeff:=pol1[i].coeff+pol2[i].coeff;
                             polsomma[i].esp:=pol1[i].esp;
                        end;
         d:=c1+c2;
         writeln;
         writeln('Il polinomio somma e'': ');
         writeln;
         for i:=1 to m
                  do write((polsomma[i].coeff):2:2,' * X^ ',(polsomma[i].esp):2,' + ');
         writeln(d,' = 0');
    end;(* fine procedura Somma *)
    
    (*Corpo del programma *)
    begin
    
         writeln('------------------ Dati di ingresso ----------------------------');
         writeln;
         write('Fornire il grado dei polinomi: ');
         readln(m);
         writeln;
         leggipolinomio(pol1,c1,m);
         writeln;
         leggipolinomio(pol2,c2,m);
         Somma(polsomma,c1,c2,pol1,pol2);
         99 :
         readln;
    
    
    end.
    Grazie a tutti. Ciao!!!

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    1,469
    goto? erano almeno 20 anni, se non più, che non ne vedevo uno


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.