View previous topic :: View next topic |
Author |
Message |
alexbr Apprentice
Joined: 06 Sep 2003 Posts: 221 Location: Treviso - Italy
|
Posted: Wed Oct 29, 2003 2:13 pm Post subject: [OT] Da Delphi a C++ |
|
|
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 è:
Code: | 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++ è:
Code: | #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!
Mi scuso in anticipo se questo può sembrare spamming, ma in realtà è disperazione! _________________ Lizzie Borden with an axe
gave her father forty wakes
when she saw what she had done
she gave her mother forty one |
|
Back to top |
|
|
silian87 Advocate
Joined: 06 Oct 2003 Posts: 2318 Location: Treviso, Italy
|
Posted: Wed Oct 29, 2003 5:17 pm Post subject: |
|
|
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 . 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 ). _________________ Musica che ascolto: http://www.last.fm/user/silian87/
Silian87 FAQs: http://marentax.homelinux.org/~silian87/silian87-faq.txt
GTalk: silian87@gmail.com |
|
Back to top |
|
|
alexbr Apprentice
Joined: 06 Sep 2003 Posts: 221 Location: Treviso - Italy
|
Posted: Wed Oct 29, 2003 5:51 pm Post subject: |
|
|
[parlo a silian on]silian, la c*****a l'hai detta . 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! _________________ Lizzie Borden with an axe
gave her father forty wakes
when she saw what she had done
she gave her mother forty one |
|
Back to top |
|
|
silian87 Advocate
Joined: 06 Oct 2003 Posts: 2318 Location: Treviso, Italy
|
|
Back to top |
|
|
alexbr Apprentice
Joined: 06 Sep 2003 Posts: 221 Location: Treviso - Italy
|
Posted: Wed Oct 29, 2003 6:42 pm Post subject: |
|
|
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! _________________ Lizzie Borden with an axe
gave her father forty wakes
when she saw what she had done
she gave her mother forty one |
|
Back to top |
|
|
fedeliallalinea Administrator
Joined: 08 Mar 2003 Posts: 31383 Location: here
|
Posted: Thu Oct 30, 2003 9:52 am Post subject: |
|
|
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. _________________ Questions are guaranteed in life; Answers aren't. |
|
Back to top |
|
|
babalinux Tux's lil' helper
Joined: 20 Aug 2003 Posts: 117
|
Posted: Thu Oct 30, 2003 10:23 am Post subject: |
|
|
non ho letto bene il codice... non ho molto tempo per farlo.
Ho notato pero' a primo acchitto un paio di discrepanze:
1) Code: | for (i=agrad+1;i--;i>=0) |
il costrutto "for" non e' corretto:
for (<val. iniziale>; <condizione>; <inc/dec>)
2)
Code: |
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.:
Code: | type
TPolinomio = class
private
coefficienti: array of integer; |
etc.
o
Code: | 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:
Code: | 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 _________________ "...Funny things you learn from your mama, like the way to throw your head back when your swallowing pills..." |
|
Back to top |
|
|
alexbr Apprentice
Joined: 06 Sep 2003 Posts: 221 Location: Treviso - Italy
|
Posted: Thu Oct 30, 2003 1:58 pm Post subject: |
|
|
Scusate per la sfuriata... non ho saputo trattenermi...
Abbiamo charito tutto in privato, spero vi faccia piacere.
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 Code: | 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? _________________ Lizzie Borden with an axe
gave her father forty wakes
when she saw what she had done
she gave her mother forty one |
|
Back to top |
|
|
fedeliallalinea Administrator
Joined: 08 Mar 2003 Posts: 31383 Location: here
|
Posted: Thu Oct 30, 2003 2:12 pm Post subject: |
|
|
alexbr wrote: | ps. Troppo forte il logo dei GECHI, vero fedeliallaliena? |
Stupendo... _________________ Questions are guaranteed in life; Answers aren't. |
|
Back to top |
|
|
alexbr Apprentice
Joined: 06 Sep 2003 Posts: 221 Location: Treviso - Italy
|
Posted: Thu Oct 30, 2003 3:21 pm Post subject: |
|
|
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 )
Ma quello piu' grosso e che non riesco a capire è:
quando dichiaro si blocca di brutto!
Ecco il nuovo codice:
Code: | #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;
} |
_________________ Lizzie Borden with an axe
gave her father forty wakes
when she saw what she had done
she gave her mother forty one |
|
Back to top |
|
|
silian87 Advocate
Joined: 06 Oct 2003 Posts: 2318 Location: Treviso, Italy
|
|
Back to top |
|
|
babalinux Tux's lil' helper
Joined: 20 Aug 2003 Posts: 117
|
Posted: Fri Oct 31, 2003 10:31 am Post subject: |
|
|
ok, ecco la bovina traduzione del codice Pascal...
Code: | #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 _________________ "...Funny things you learn from your mama, like the way to throw your head back when your swallowing pills..." |
|
Back to top |
|
|
silian87 Advocate
Joined: 06 Oct 2003 Posts: 2318 Location: Treviso, Italy
|
|
Back to top |
|
|
alexbr Apprentice
Joined: 06 Sep 2003 Posts: 221 Location: Treviso - Italy
|
Posted: Fri Oct 31, 2003 1:13 pm Post subject: |
|
|
Grazie mille baba!!!
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 , vergognoso ma efficiente! )
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 ) _________________ Lizzie Borden with an axe
gave her father forty wakes
when she saw what she had done
she gave her mother forty one |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|