# [OT] Da Delphi a C++

## alexbr

Conoscete un metodo (automatico) per tradurre codice delphi in c++.

Ho fatto un programmino in delphi (a console, serve per fare divisioni tra poliomi di qualsiasi grado a patto che il grado di A(x) sia maggiore di quello di B(x), ovvio) che vorrei portare in c++ e compilarlo per varie piattaforme.

Il problema è che in delphi uso gli array dinamici e provando a tradurre tutto in c++ usando i puntatori e i comandi di allocazione dinamica della memoria, solo che mi ci raccapezzo più!

Il codice Delphi è:

```
program divisionequ;

{$APPTYPE CONSOLE}

uses

  SysUtils;

var a,b,r,q:array of real;

    crepeat: char;

    agrad,bgrad,i,c:integer;

begin

   repeat

////////////////////////////////////////////////////////////////////////////////

// Inserimento del polinomio dividendo:                                       //

   write('Inserisci il grado del polinomio dividendo: ');

   readln(agrad);

   setlength(a,agrad+1);

   for i:=agrad downto 0 do

   begin

      if i=0 then write('Inserisci il termine noto: ')

             else write('Inserisci il coefficiente di x^',i,': ');

      readln(a[i]);

   end;

////////////////////////////////////////////////////////////////////////////////

// Inserimento del polinomio divisore:                                        //

   write('Inserisci il grado del polinomio divisore: ');

   readln(bgrad);

   if bgrad>agrad then begin writeln('Divisione impossibile.'); readln; end

   else begin

   setlength(b,bgrad+1);

   for i:=bgrad downto 0 do

   begin

      if i=0 then write('Inserisci il termine noto: ')

             else write('Inserisci il coefficiente di x^',i,': ');

      readln(b[i]);

   end;

////////////////////////////////////////////////////////////////////////////////

// Settaggio lunghezza array

   setlength(q,agrad-bgrad+1);               // a = dividendo  // r = resto

   setlength(r,agrad+1);                     // b = divisore   // q = quoziente

// Copia array a in r

   for c:=0 to length(r)-1 do r[c]:=a[c];    // agrad,bgrad = grado del dividendo, divisore

////////////////////////////////////////////////////////////////////////////////

   for i:=agrad downto bgrad do

   begin

      q[i-bgrad]:=r[i]/b[bgrad];

      for c:=bgrad downto 0 do

         r[i-bgrad+c]:=r[i-bgrad+c]-q[i-bgrad]*b[c];

   end;

////////////////////////////////////////////////////////////////////////////////

   write('Il polinomio dividendo inserito è:');

   for i:=length(a)-1 downto 1 do write(a[i]:5:2,'x^',i,' + '); writeln(a[0]:5:2); writeln;

   write('Il polinomio divisore inserito è:');

   for i:=length(b)-1 downto 1 do write(b[i]:5:2,'x^',i,' + '); writeln(b[0]:5:2); writeln;

   write('Il risultato della divisione è: ');

   for i:=length(q)-1 downto 1 do write(q[i]:5:2,'x^',i,' + '); writeln(q[0]:5:2); writeln;

   write('Il resto della divisione è: ');

   for i:=length(r)-1 downto 0 do if r[i]<>0 then write(r[i]:5:2,'x^',i,'+');

   writeln;

   end;

   write('Vuoi ricominciare? [s/n] '); readln(crepeat);

   writeln;

   until (crepeat='n');

end.

```

Il codice c++ è:

```
#include <iostream>

#include <iomanip>

using namespace std;

int main() {

   char crepeat = 's';

   int agrad = 0, bgrad = 0, qgrad = 0, rgrad = 0, i = 0, c = 0;

   while (crepeat=='s' || crepeat=='S') {

      cout << "Inserisci il grado del polinomio dividendo: "; cin >> agrad;

      double *a = new double[agrad];

      for (i=agrad+1;i--;i>=0) {

         if (i==0) cout << "Inserisci il termine noto: ";

         else cout << "Inserisci il coefficiente di x^" << i << ": ";

         cin >> a[i];

         }

      cout << "Inserisci il grado del polinomio divisore: "; cin >> bgrad;

      if (agrad<bgrad) { cout << "Divisione impossibile"; break; }

      double *b = new double[bgrad];

      for (i=bgrad+1;i--;i>=0) {

         if (i==0) cout << "Inserisci il termine noto: ";

         else cout << "Inserisci il coefficiente di x^" << i << ": ";

         cin >> b[i];

         }

      qgrad = agrad-bgrad+1;

      double *q = new double[qgrad];

      rgrad = agrad+1;

      double *r = new double[agrad+1];

      for (c=0; c++; c <= agrad) r[c]=a[c];

      for (i=agrad+1;i--;i>=bgrad)

         q[i-bgrad]=r[i]/b[bgrad];

      for (c=bgrad+1;c--;c>=0)

         r[i-bgrad+c]=r[i-bgrad+c]-q[i-bgrad]*b[c];

      cout << "Il polinomio dividendo inserito è:";

      for (i=agrad+1;i--;i>1)

         cout << setiosflags( ios::internal | ios::showpos ) << setw ( 5 )

            << a[i] << "x^" << i ;

      cout << setiosflags( ios::internal | ios::showpos ) << setw ( 5 ) << a[0] << endl;

      cout << "Il polinomio divisore inserito è:";

      for (i=bgrad+1;i--;i>1)

         cout << setiosflags( ios::internal | ios::showpos ) << setw ( 5 )

            << b[i] << "x^" << i ;

      cout << setiosflags( ios::internal | ios:: showpos ) << setw ( 5 ) << b[0] << endl;

      cout << "Il risultato della divisione è: ";

      for (i=qgrad+1;i--;i>1)

         cout << setiosflags( ios::internal | ios::showpos ) << setw ( 5 )

            << q[i] << "x^" << i ;

      cout << setiosflags( ios::internal | ios::showpos ) << setw ( 5 ) << q[0] << endl;

      cout << "Il resto della divisione è: ";

      for (i=rgrad+1;i--;i>1) if (r[i]!=0)

         cout << setiosflags( ios::internal | ios::showpos ) << setw ( 5 )

            << r[i] << "x^" << i ;

      cout << setiosflags( ios::internal | ios::showpos ) << setw ( 5 ) << r[0] << endl;      

      crepeat = EOF;

      while (crepeat!='s' && crepeat!='S' && crepeat!='n' && crepeat!='N') {

         cout << "Vuoi ricominciare? [s/n]" ; cin >> crepeat ; 

      }

   }

}
```

help!  :Shocked:   :Shocked:   :Shocked:   :Shocked:   :Shocked:   :Shocked:   :Shocked:   :Shocked:   :Shocked:   :Shocked: 

Mi scuso in anticipo se questo può sembrare spamming, ma in realtà è disperazione!  :Embarassed: 

----------

## silian87

Anche se esistesse qualche programma (che io comunque ho cercato per un po' senza trovare niente), credo che sia meglio convertirlo a mano (specie per un programma così corto). Infatti con tool automatici rischi di avere un programma lento e con codice inutile. Fai come ti insegna gentoo, fai manualmente   :Very Happy:  . Per gli array dinamici devo vedere se trovo qualche metodo, vedrò (prova a fare un array di array, mi sembra sia possibile, forse puo' servirti, spero di non aver detto una c*****a   :Embarassed:  ).

----------

## alexbr

[parlo a silian on]silian, la c*****a l'hai detta  :Evil or Very Mad:  . e smettila di mettere post senza motivo sul forum di gentoo perchè le cazzate ti conviene dirle per telefono o in faccia, dato che sai il mio numero e abiti a un chilometro da me.

inf: finito di scaricare slackware.[/parlo a silian on]

[parlo al pubblico on]scusate, ma mi sfogo con lui perchè sta stufando seriamente: non ha mai installato una gentoo (shev ne sa qualcosa), anche se devo ammettere che me l'ha fatta scoprire lui, e mette posts a vanvera solo per raggiungere un livello superiore di messaggi inviati. e' irritante.[/parlo al pubblico on]

scusate di nuovo ma la sfuriata ci voleva proprio!

----------

## silian87

Il discorso dei messaggi è del tutto falso, per quanto ruguarda il post era una risposta vera, in fine la gentoo la metto se mi arriva il powerbook (forse domani). Hai chiuso.x(per ora).  :Evil or Very Mad: 

----------

## alexbr

prova tu però a farmi un programma in c++ equvalente a quello dato in delphi! dato che ci sei fammi una telefonata che ne parliamo!

----------

## fedeliallalinea

Potete calmare gli animi... in questo forum non si vogliono vedere dei post del genere (imho)...

Comunque io non tengo la parte a nessuno dei due ma quello che ha detto silian87 e' vero i tools

di conversione da un linguaggio all'altro non funzionano mai bene creano codice incasinato e basta.

----------

## babalinux

non ho letto bene il codice... non ho molto tempo per farlo.

Ho notato pero' a primo acchitto un paio di discrepanze:

1)

```
for (i=agrad+1;i--;i>=0) 
```

 il costrutto "for" non e' corretto:

    for (<val. iniziale>; <condizione>; <inc/dec>)

2) 

```

      double *a = new double[agrad]; 

      for (i=agrad+1;i--;i>=0) { 

         if (i==0) cout << "Inserisci il termine noto: "; 

         else cout << "Inserisci il coefficiente di x^" << i << ": "; 

         cin >> a[i]; 

         } 
```

dimensioni gli array a "agrad/bgrad" e poi pretendi di salvare in (agrad+1)-esima posizione un elemento => errore "off by one"?

Poi, in generale, perche' non programmi ad oggetti? Hai a disposizione C++ e Delphi che ti permettono di farlo. 

Es.: 

```
type

   TPolinomio = class

   private

      coefficienti: array of integer;
```

   etc.

o

```
class TPolinomio

{

   private

      int* coefficienti;

  etc.

};
```

Meglio ancora potresti pensare ad oggetti tutto il modello, inclusi i coefficienti ed il termine noto...

Ti sarebbe tutto piu' facile.

Intanto dai un'occhiata a questa prima parte del main(), che da me compila, il resto modificalo tenendo conto:

```
int main()

{

   double*      a;   

   char      crepeat = 's'; 

      int         agrad = 0, 

            bgrad = 0, 

            qgrad = 0, 

            rgrad = 0, 

            i = 0, 

            c = 0;

   while (crepeat == 's' || crepeat == 'S') 

   {

      cout << "Inserisci il grado del polinomio dividendo: \n";

      cin  >> agrad;

      a = new double[agrad];

      for (int i=agrad; i>=0; i--)

      {

         if (i==0)   cout << "Inserisci il termine noto: \n";

         else      cout << "Inserisci il coefficiente di x^" << i << ": \n";

         cin >> a[i]; 

      };

      cout << "Inserisci il grado del polinomio divisore: \n"; 

      cin >> bgrad; 

      if (agrad<bgrad)  

      {

         cout << "Divisione impossibile"; 

         break; 

      };

      

      double *b = new double[bgrad]; 

      for (i=bgrad;i>=0;i--) 

      { 

         if (i==0) cout << "Inserisci il termine noto: \n"; 

         else cout << "Inserisci il coefficiente di x^" << i << ": \n"; 

         cin >> b[i]; 

       } 

      cout << "Vuoi ricominciare? [s/n]" ; cin >> crepeat; 

   };

    return 0;  

};
```

fammi sapere se hai bisogno di aiuto.... e evitate 'sti casini.

cheers, baba

----------

## alexbr

Scusate per la sfuriata...  :Embarassed:  non ho saputo trattenermi...

Abbiamo charito tutto in privato, spero vi faccia piacere.  :Rolling Eyes: 

 *Quote:*   

> dimensioni gli array a "agrad/bgrad" e poi pretendi di salvare in (agrad+1)-esima posizione un elemento => errore "off by one"? 

 

L'ho fatto perchè non ho capito bene come me li salvava... infatti se facevo 

```
cout << agrad;

cout << bgrad;
```

mi dava un numero in meno di quello che avevo memorizzato.

 *Quote:*   

> Poi, in generale, perche' non programmi ad oggetti? Hai a disposizione C++ e Delphi che ti permettono di farlo. 

 

Lo farei, ma sembra un po' stupido crearsi delle classi per un programmino abbastanza semplice, non credi?

 *Quote:*   

> 
> 
> Meglio ancora potresti pensare ad oggetti tutto il modello, inclusi i coefficienti ed il termine noto...
> 
> Ti sarebbe tutto piu' facile. 

 

Se si tratta di inserirlo in un contesto più grande, magari di risoluzione di equazioni e disequazioni, si, si potrebbe fare.

grazie baba per la dritta e mi scuso ancora per il disagio creato.

Tento di sistemare il programma e ve lo riposto a posto!

ps. Troppo forte il logo dei GECHI, vero fedeliallaliena?

----------

## fedeliallalinea

 *alexbr wrote:*   

> ps. Troppo forte il logo dei GECHI, vero fedeliallaliena?

 

Stupendo...   :Very Happy: 

----------

## alexbr

Ho sistemato un paio di errori nel programma (lo ammetto... è da un po' di tempo che non uso il c++ e ho fatto casini con i for  :Embarassed:  )

Ma quello piu' grosso e che non riesco a capire è:

quando dichiaro si blocca di brutto!

Ecco il nuovo codice:

```
#include <iostream>

#include <iomanip>

using namespace std;

int main()

{

   char     crepeat = 's';

   int      agrad = 0,

            bgrad = 0,

            qgrad = 0,

            rgrad = 0,

            i = 0,

            c = 0;

   while (crepeat == 's' || crepeat == 'S')

   {

      cout << "Inserisci il grado del polinomio dividendo: ";

      cin  >> agrad;

      double* a = new double[agrad];

      for (i=agrad; i>=0; i--)

      {

         if (i==0)   cout << "Inserisci il termine noto: ";

           else      cout << "Inserisci il coefficiente di x^" << i << ": ";

         cin >> a[i];

      };

      cout << "Inserisci il grado del polinomio divisore: ";

      cin >> bgrad;

      if (agrad<bgrad) 

      {

         cout << "Divisione impossibile";

         break;

      };

      

      double* b = new double[bgrad];

      for (i=bgrad; i>=0; i--)

      {

         if (i==0) cout << "Inserisci il termine noto: ";

           else cout << "Inserisci il coefficiente di x^" << i << ": ";

         cin >> b[i];

       }

      

      qgrad = agrad - bgrad;

//////// Si blocca qui! ////////////////////////////////////////////////////////

      double* q = new double[qgrad];

      

      rgrad = agrad+1;

      double* r = new double[rgrad];

      

      // Copia del polinomio dividendo nel polinomio resto

      for (c=0; c < rgrad; c++) r[c] = a[c];

      

      // Calcolo del polinomio quoziente

      for (i=agrad; i>=bgrad; i--) {

         q[i-bgrad] = r[i] / b[bgrad];

         for (c=bgrad; c>=0; c--)

            r[i-bgrad+c] = r[i-bgrad+c] - q[i-bgrad] * b[c];

         }

    

      // Output

      cout << "Il polinomio dividendo inserito è:";

      for (i=agrad;i>=1;i--)

         cout << a[i] << "x^" << i ;

      cout << a[0] << endl;

      cout << "Il polinomio divisore inserito è:";

      for (i=bgrad;i>=1;i--)

         cout << b[i] << "x^" << i ;

      cout << b[0] << endl;

      cout << "Il risultato della divisione è: ";

      for (i=qgrad;i>=1;i--)

         cout << q[i] << "x^" << i ;

      cout << q[0] << endl;

      cout << "Il resto della divisione è: ";

      for (i=rgrad;i>=1;i--) if (r[i]!=0)

         cout << r[i] << "x^" << i ;

      cout << r[0] << endl;

      cout << "Vuoi ricominciare? [s/n]" ; cin >> crepeat;

   };

    return 0; 

}
```

----------

## silian87

In effetti abbiamo chiarito e riappacificati. E poi oggi mi e' arrivato il Powerbook, FINALMENTE!!!

----------

## babalinux

ok, ecco la bovina traduzione del codice Pascal...

```
#include <iostream>

using namespace std;

int main()

{

   char     crepeat = 's'; 

   int      agrad = 0, 

            bgrad = 0, 

            qgrad = 0, 

            rgrad = 0, 

            i = 0, 

            c = 0; 

   while (crepeat == 's' || crepeat == 'S') 

   { 

      // baba: a e b erano sottodimensionati:

      //       devono contenere gli <grado> coefficienti + il termine noto in [0]

      //       => la dimensione e' <grado>+1;

       cout << "Inserisci il grado del polinomio dividendo: "; 

      cin  >> agrad; 

      double* a = new double[(agrad+1)]; 

      for (i=agrad; i>=0; i--) 

      { 

       if (i==0)   cout << "Inserisci il termine noto: "; 

         else      cout << "Inserisci il coefficiente di x^" << i << ": "; 

       cin >> a[i]; 

      }; 

      cout << "Inserisci il grado del polinomio divisore: "; 

      cin >> bgrad; 

      if (agrad<bgrad) 

      { 

       cout << "Divisione impossibile"; 

       break; 

      }; 

      double* b = new double[(bgrad+1)]; 

      for (i=bgrad; i>=0; i--) 

      { 

       if (i==0) cout << "Inserisci il termine noto: "; 

         else cout << "Inserisci il coefficiente di x^" << i << ": "; 

       cin >> b[i]; 

      } 

      

      // baba: il grado di q equivale alla differenza tra i gradi di a e b

      qgrad = (agrad-bgrad);    

      // la sua dimensione deve essere <grado>+1;

      double* q = new double[(qgrad+1)]; 

      // baba: vedi sopra

      rgrad = (agrad);

      double* r = new double[(rgrad+1)]; 

      // Copia del polinomio dividendo nel polinomio resto 

      for (c=0; c <= rgrad; c++)      

        r[c] = a[c];         // baba, ecco: qui andavi in "off by one": leggendo a che era sottodimensionato...

      

      // Calcolo del polinomio quoziente 

      for (i=agrad; i>=bgrad; i--) 

      { 

         // imposta il coefficiente del (i-bgrad)-esimo termine del quoziente

         q[i-bgrad] = r[i]/b[bgrad]; 

         // per ogni coefficiente calcolato, imposta il resto

         for (c=bgrad; c>=0; c--) 

            r[i-bgrad+c] = r[i-bgrad+c] - q[i-bgrad] * b[c]; 

      }; 

    

      // Output 

      cout << "Il polinomio dividendo inserito è:"; 

      for (i=agrad;i>=1;i--) 

         cout << a[i] << "x^" << i ; 

      cout << a[0] << endl; 

      cout << "Il polinomio divisore inserito è:"; 

      for (i=bgrad;i>=1;i--) 

         cout << b[i] << "x^" << i ; 

      cout << b[0] << endl; 

      cout << "Il risultato della divisione è: "; 

      for (i=qgrad;i>=1;i--) 

         cout << q[i] << "x^" << i ; 

      cout << q[0] << endl; 

      cout << "Il resto della divisione è: "; 

      for (i=rgrad;i>=1;i--) 

      {

         if (r[i]!=0)  cout << r[i] << "x^" << i ; 

      };

      cout << r[0] << endl; 

      cout << "Vuoi ricominciare? [s/n]" ; cin >> crepeat; 

   }; 

   return (0);  

};
```

eseguito con delphi e Visual C++ da gli stessi risultati, a parte la formattazione dell'output.

HTH, baba

----------

## silian87

grazie mille per la traduzione   :Laughing: 

----------

## alexbr

Grazie mille baba!!!  :Wink:   :Wink:   :Wink: 

Era un programma che avevo fatto l'anno scorso in delphi per la prof. di mate (che alla fine mi ha dato la sufficienza anche se ero un po' sotto  :Embarassed:  , vergognoso ma efficiente!  :Wink:  )

Il problema era portarlo per i mac dei miei cari amici(vedi sopra)... e magari per qualche altra piattaforma!

A desso che il risultato è stato ottenuto (non smetterò mai di ringraziarti babalinux!) sì, penso proprio che il programma si possa evolvere in qualcosa di più complesso!

Sto già creando le classi per i polinomi...

Se faccio qualcosa di buono vi dico, non si sa mai, a qualcuno potrebbe interessare  :Cool:  )

----------

