Slt tlm,
Comme j´ai déjà créer la première version de Calculator, je vais le transformé en projet. Je vais essayer de faire une calculette meilleur que les autres. Bon, je sais, ça va être difficile. Mais je suis motivé a 100% et je vais essayer. Pour l´instant mon programme n´est pas très bon. Vous pouvez le télécharger sur:
http://www.ifrance.com/A-F-Agency/download/calculator.zip
Donc, je cherche quelqu´un qui veuillent bien m´aider car comme vous pourrez le constatez, mon programme est encore nul.
Bon, je me suis gouré sur l´URL:
http://www.ifrance.com/A-A-F-Agency/download/Calculator
Fait une calculette pseudo infinie !
C´est a dire au lieu de stocker tes opérandes sur des int ou des long, voir des __int64 sous visual, fait toi une classe " nombre" dans laquelle tu stocke tes nombres sous forme de char* ( ou autre zone de mémoire dynamique), et surcharge tous les opérateurs !
comme ça, tu pourras faire des multiplications de nombres a plein de chiffres !
dsl, je débute et je sais po faire!
JeanYvesYves:
Sans vouloir te démolir, il fait du C, donc byebye classe et opérateurs...
Et de toute façon, s´il ferait du C++, il y aurait déjà pensé, non? Je crois que faire de la POO implique que l´on voit la conception d´un programme sous l´angle de la POO, à mon avis...
Kelios
---------
Bon, j´aurais du mettre tout ça en un seul post, mais bon...
Frappe moi pas, mais j´ai désassemblé ton programme(Oui, je sais, c´est très vilain) car tu ne semblait pas avoir mis de sources:
Alors j´ai quelques conseils à te donner pour ton programme: je tiens à te dire que, étant déssassemblé, je n´ai pas accès à tout, mais bon:
1° LACHE LES PRINTFs POUR LE MESSAGE DU DÉBUT!
Pourquoi ne pas les rassembler tous sous un seul printf? Au lieu de:(j´ai coupé les messages!)
printf("Pour le moment mon programme est en Ang");
printf("ATTENTION: NE METTEZ PAS DE VIRGULES SV");
printf("Remarquez un petit avantages, vous ne p");
printf("Ecrivez -bye- ( sans les tirets) pour qu");
printf("------------On commence la partie addit");
Met tout tes messages sous un seul printf, mais pour pas te perdre, fait comme ça:
char msgEntree[] = {
" Pour le moment mon programme est en Anglais et vous ne pouvez faire que \n",
" 100 additions, 100 soustractions, 100 multiplication et 100 divisions avec. Les 50 premieres operations sont les additions, les 50 suivantes sont les \n"
/*Ect...*/
}
printf(msgEntree);
Tu verra, c´est plus clair!
2°
HAAAA! C´est ça ta technique pour faire 50 opérations? Mettre:
int number1=0, number2=0, result=0;
printf("Enter first integer");
scanf("%d", &1);
printf("Enter second interger");
scanf("%d", &2);
result= number1 + number2;
printf("Sum is %d\n", result);
printf("Enter first integer");
scanf("%d", &1);
printf("Enter second interger");
scanf("%d", &2);
result= number1 + number2;
printf("Sum is %d\n", result);
printf("Enter first integer");
scanf("%d", &1);
printf("Enter second interger");
scanf("%d", &2);
result= number1 + number2;
printf("Sum is %d\n", result);
À la place, met un for!!!!!!!!!!!!!!!!
for(int i=0; i<50; i++)/*50 fois*/
{
printf("Enter first integer");
scanf("%d", &1);
printf("Enter second interger");
scanf("%d", &2);
result= number1 + number2;
printf("Sum is %d\n", result);
}
Voilà, ça va être 1000x plus lisible, et ton programme ne fera plus 51,5 ko! ( en passant, tu te rend tu compte? Ça, c´est un programme d´environ 20 000 opérations Assembleur!)
Kelios
---------
Troisième message de suite, j,ai fait une erreur là:
"
char msgEntree[] = {
" Pour le moment mon programme est en Anglais et vous ne pouvez faire que \n",
" 100 additions, 100 soustractions, 100 multiplication et 100 divisions avec. Les 50 premieres operations sont les additions, les 50 suivantes sont les \n"
/*Ect...*/
}
"
C´est en fait:
char msgEntree[] = {
" Pour le moment mon programme est en Anglais et vous ne pouvez faire que \n",
" 100 additions, 100 soustractions, 100 multiplication et 100 divisions avec. Les 50 premieres operations sont les additions, les 50 suivantes sont les \n"
/*Ect...*/
};
J´avais oublié le ;
Erreur d´innatention! Désolé...
ok thank
sa marche po!!
Faire une calculette en C, je trouve pas ça très marrant.
Il serait plus intéressant à mon sens de la faire en assembleur, là y aurait du challenge !
Je veux bien t´aider.
D´abord ton programme n´est pas nul. Faut pas devaloriser ce que tu as fais.
JeanYves a raison, faut que tu fasses tes calculs sur des chaines de caracteres, c´est une tres bonne idée.
Personnelement je me permet de te souffler une autre idée. If faut decoupler tres fortement la partie Input/Ouput des données et la partie calcul.
Dans un premier temps tu fais des fonctions.
1/ InputData(Operation)
Dans operation tu trouve Operande et operateur.
2/ Resultat = CalculResultat(Operation)
3/ OutputData ( Operation,Resultat)
Dans un second temps :
On note que dans InputData() tu fais des entrées ET des Sorties. Tu decouples aussi ces entrées et ces sorties.Par exemple tu te fais les fonctions qui refont appel a printf() et scanf(). Ceci est d´abord tres educatif, et de plus dans l´avenir tu pourras plus aisement faire " bouger" tes entrés et tes sorties ( cela pourrait s´averrer tres interressant le jour venu . ..).
0xFFFF : Ceci est pour calculator les premiers pas. De plus une calculette peux tres vite se transformer en quelque chose de bien plus gros ( interpreteur par exemple )
Bon, maintenant, tu peux me traduire ça en francais?
OK. Pardon. J´va traduire en C.
L´idée c´est de faire des petites fonctions.
Ton programme " grossierement" demande des chiffres et une operation, pis apres il fait un calcul, pis apres montre les resultats.
Voila ce qu´il faut decoupler.
Partons du source reconstitué par < Kelios>
Phase 1 : Je vais prendre des chiffre et l´operation. Attention premier jet
int InputData(int *Number1, int *Number2, int *Operation)
{
---printf("Enter first integer");
---scanf("%d", number1);
---printf("Enter second interger");
---scanf("%d", number2);
---printf("Enter operation ( 0 for Add, 1 for sub etc)");
---scanf("%d", operation);
---return 0;
}
Phase 2 : je fais le calcul
int Calculate(int Number1, int Number2, unsigned char Operation, int *RetVal)
{
---int ReturnCode= 0;
---switch(Operation)
---{
---case ´+´:
------*RetVal = Number1 + Number2 ;
------break;
---case ´-´:
------*RetVal = Number1 - Number2 ;
------break;
---case ´*´:
------*RetVal = Number1 * Number2;
------break;
---case ´/´:
------*RetVal = Number1 / Number2;
------break;
---case ´%´: // je te rajoute celui la !
------*RetVal = Number1 % Number2;
------break;
---default:
------/* Notons que la fontion InputData() est
------mise en default, mais comme l´informatique
------n´est pas une science exact */
------ return 1;
---}
---return 0;
}
bien sur ici je note de suite une amelioration a faire => evite l´operation non definie, c´est dans une 2eme jet que l´on s´en occupera...
Phase 3: J´affiche le calcul
int OutputData( int Resultat, int Operande1, int Operande2, unsigned char Operation)
{
---printf("Le resultat de %d %c %d = %d",Operande1,Operation,Operande2,Resultat);
return 0;
}
Maintenant je fais mon petit main histoire d´apeller les fonction
void main(void)
// ou int main ( int)
// ou int main ( int, char**)
// ou main()
{
int Operande1, Operande2, Resultat;
unsigned char Operation;
---InputData(&1, &2, &);
---Calculate(Operande1,Operande2,Operation,&
at);
---OutputData(Resultat, Operande1, Operande2, Operation)
}
Il va te devenir simple de faire des petites chose de la sorte dans ton main()
main()
{
---int CptOp;
---// copie colle la declaration des variable
---//
---//
---for(CptOp = 0; CptOp < 50 ; CptOp ++)
---{
-------// copie colle l´appel aux fonctions
-------InputData(<Place ici les variable>);
-------etc...
---}
}
Idees pour toi :
1/D´abord on peut pointer du doigt la fonction InputData() et s´arranger pour l´ameliorer pour que les operation soit bien sur connue par ton programme.
2/ Demander a ton utilisateur apres un calcul s´il veut continuer ou s´arreter. C´est pratique non ? Je te laisse reflechir dessus un peu
3/ Voir si tu ne peut au lieu d´utiliser une liste de parametre ( operande1, operande2, etc ) tenter de manipuler quelque chose de plus " empaquete" quelque chose qui contient a la fois operande1, operande2, operation etc... Ca ca doit etre dans un de tes bouquins, recherche les struct ( structures )
A au fait, les --- ou -------- en debut de ligne c´est juste de l´indentation ( mise en page ) ne les copies pas ! Je dois utiliser le - pasque l´espace est " compressé" par JV.
Bien, ça serait mieux d´avoir tes sources, mais je vais tenter de comprendre un max de ton code:
j´ai décidé donc de mettre tout ce que j´ai trouvé de ton programme, afin que l´on puisse comprendre un max, et ainsi t´aider un max:
Selon ce que j´ai trouvé:
Un start qui semble normal: il appelle ensuite
004011E6 call sub_401180
Ce sub semble être le ´main´ du crt0.c
L´intérret vient ici:
004011A9 call __p__environ
004011AE push dword ptr [eax]
004011B0 push dword_40E004
004011B6 push dword_40E000
004011BC call CalculatorMain
J´ai renommé la fonction sub_40185C en CalculatorMain pour faire plus simple.
Il y a la un main avec trois(?!) arguments.
dword_40E000 et 04 sont les arguments de la ligne de commande, respectivement argc et argv. Mais je n,ai jamais vu un main avec trois arguments: m´enfin bon, passons, de toute façon ça m´étonnerait que son programme soit aussi complexe...
Le main:
----L´entrée de la fonction----
0040185C push ebp
0040185D mov ebp, esp
0040185F sub esp, 18h
00401862 call sub_40D4F0
Rien qui ne semble intéressant sinon ptêt ce sub_40D4F0...
---Le main de Calculator---
00401867 add esp, 0FFFFFFF4h
0040186A push offset a______________ ;
0040186F call printf
et tout et tout, pour le message d´entrée de programme...
---Le calcul---
004018C4 add esp, 10h
004018C7 add esp, 0FFFFFFF4h
004018CA push offset aEnterFirstInte ; " Enter first integer\n"
004018CF call printf
004018D4 add esp, 10h
004018D7 add esp, 0FFFFFFF8h
004018DA lea eax, [ebp+var_4]
004018DD push eax
004018DE push offset aD ; " %d"
004018E3 call scanf
004018E8 add esp, 10h
004018EB add esp, 0FFFFFFF4h
004018EE push offset aEnterSecondInt ; " Enter second interger\n"
004018F3 call printf
004018F8 add esp, 10h
004018FB add esp, 0FFFFFFF8h
004018FE lea eax, [ebp+var_8]
00401901 push eax
00401902 push offset aD ; " %d"
00401907 call scanf
0040190C add esp, 10h
0040190F mov eax, [ebp+var_4]
00401912 mov edx, [ebp+var_8]
00401915 lea ecx, [edx+eax]
00401918 mov [ebp+var_C], ecx
0040191B add esp, 0FFFFFFF8h
0040191E mov eax, [ebp+var_C]
00401921 push eax
00401922 push offset aSumIsD ; " Sum is %d\n"
00401927 call printf
et ainsi de suite pour TOUS les calculs...
Voilà, si ça peut être utile à quelqu´un...
Kelios
---------
Dsl, mais je pige pas l´hexadecimal. Par contre, je trouve que ton explication n´est pas tres clair Passage. Mais bon, je vais vous mettre mon code:
main ( )
int integer1, integer2, sum;
{
---printf("Enter first integer");
---scanf("%d", integer1);
---printf("Enter second interger");
---scanf("%d", integer2);
---printf("Sum is " %d";
---scanf("%d", operation);
---return 0;
}
Voila.
ok.
Le but de mon explication raté etait de te faire faire des fonctions. Passons au language " grand debutant", ne le prends pas mal, c´est plus une claque pour moi ( incapable de bien expliquer ) que pour toi.
Un fonction est une partie de code bien isolé que tu peux invoquer.
Example 1:
int Toto()
{
return 3;
}
main()
{
int a;
int b;
a= Toto();
b = a + Toto();
}
A chaque fois que j´ecris Toto(), cela se traduis par l´execution de la fonction Toto().
Dans l´exemple la fonction Toto() renvoie 3 ( super hein ? ) mais une fonction peut avoir besoin de parametre d´entrées.
Exemple 2:
int Addition( int operande1, int operande2)
{
---return ( operande1 + operande2);
}
main()
{
---int Resultat;
---Resultat = Addition( 3 , 7 ) ;
---Resultat = Addition( Resultat, Resultat);
---Resultat = Addition( Resultat, -1);
}
Notons au passage que nous ne sommes pas obligé d´exploiter la valeur de retour.
Example 4:
int AfficheNombre(int Nombre)
{
---printf("%d", Nombre);
}
main()
{
---AfficheNombre(7);
---AfficheNombre(15);
}
Bon tout cela c´est pas mal. Mais une fontion qui ne renvoie qu´un seul resultat c´est pas terrible. Ca serait pas mal de pourvoir lui faire modifier des parametre passé ( ce qui est entre les parentheses a l´appel de la fonction ) . Pour ceci on utilise ce que l´on nomme un pointeur ( regarde le bouquin , mais si tu veux plus d´explication n´hesite pas ) .
Exemple
int CalculSome(int Op1, int Op2)
{
return Op1+Op2;
}
int CalculDifference(int Op1, int Op2)
{
return Op1-Op2;
}
int CalculSommeEtDifference(int Op1, int Op2, int *ResAddition, int *ResSoustraction)
{
---*ResAddition = CalculSome(Op1,Op2);
---*ResSoustraction = CalculDifference(Op&,Op2);
---return 0;
}
main()
{
---int ResAddtion, RestSoustraction;
---CalculSommeEtDifference(1,2,&,&
straction);
}
Note la declaration CalculSommeEtDifference() qui prends en parametre
--- int < Op1>
--- int < Op2>
--- int * < ResAddition> < = C´est un pointeur
--- int * < ResSoustraction> < = Second pointeur
Note egalement l´appel a la fonction et les & que je glisse devant les noms des variables afin de " dire" explicitement au compilateur que ce n´est pas < Variable> que je souhaite donner en parametre mais l´adresse de < Variable>
Reprenons ton code.
include < stdio.h>
main()
{
int integer1, integer2, sum;
//
// je rajoute ceci :
// Ceci me permet alors de demander a l´utilisateur l´operation qu´il souhaite faire
//
---unsigned char Operation;
---int Resultat;
// fin du rajout
//
// Phase 1 : Je fais rentrer les données de l´utilisateur
//
---printf("Enter first integer");
---scanf("%d", &1);
// Note ici que je suis forcé de passé l´adresse de la variable puisque scanf va modifier integer1 ! !
---printf("Enter second interger");
---scanf("%d", &2);
// remarque idem
// Voila que je rajoute un peu de code
// histoire de prendre l´operation que
// souhaite l´utilisateur
---printf("Enter operation ( ´+´ or ´-´");
---scanf("%c",&);
//
// Fin de la phase 1
//
//
// Phase 2 : je fais le calcul
//
---switch(Operation) // Cf instruction switch
---{
------case ´+´:
----------Resultat = integer1+integer2;
----------break;
------case ´-´:
----------Resultat = integer1- integer2;
----------break;
------default:
----------Resultat = 0;
----------break;
---}
//
// Fin de la phase 2
//
//
// Phase 3 j´affiche les resultats
//
---printf("%d %c %d = %d", interger1, Operation, interger2, Resulat);
}
Ca va ?
Alors maintenant tu essaye cela. Tu t´amuses avec, rajoute des operations, verifie que l´operation est bonne, fait boucler le truc 5 fois etc...
Pis apres tu tente de prendre la phase 3 et d´en faire une fonction.
Pis apres tu tentes de prendre les phases 2 et 1 et d´en faire 2 fonctions.
Ok cool, la g compris. Mais par contre, quesque ton code à d´érreurs sur dev C++
ton code marche qua moitié pour l´instant, mais j´y traivaille!!!!!!!!
" Dsl, mais je pige pas l´hexadecimal"
Nan, c´était pas de l´hexa , mais de l´assembleur: et de toute façon, c´était plutôt pour Passage, pour qu´il aie une idée de ce que tu avais écrit, et ainsi mieux t´aider...
Mais comme je l´ai dit, le mieux serait que tu montre ta source, à moins que tu ne veuille, comme un pro, ne pas montrer ta source, et que l´on continue d´essayer de te guider dans une noirceur évidente. J´ai essayé de mettre un peu de lumière dans la pièce, de façon à ce que l´on puisse mieux voir ce que l´on est supposé améliorer...
Kelios
---------