Advertisement
Guest User

Untitled

a guest
Aug 31st, 2015
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.53 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5.  
  6. #define Arrondir(fVal)(fVal >=0) ? (int)(fVal + 0.5) : (int)(fVal- 0.5)
  7.  
  8. #define ECART_MAX 1
  9. #define ECART(fVal, fVal1) abs((*(int *)&fVal) - (*(int *)&fVal1))
  10.  
  11. #define TestInf(fVal) (fVal == HUGE_VAL || fVal == -HUGE_VAL)
  12.  
  13. #define TestNaN(fVal) (fVal != fVal)
  14.  
  15. union uValeur{
  16. int iVal;
  17. unsigned int uiVal;
  18. float fVal;
  19. };
  20.  
  21. struct sNb{
  22. union uValeur uVar;
  23. char bType;
  24. struct sNb *suivant;
  25. };
  26.  
  27. int traiterOperateur(char);
  28. unsigned int atoui(char *acVal);
  29. int empiler(union uValeur, char bType);
  30. void afficherPile();
  31. int checkNombre(char *chaine);
  32. int atonb(char *chaine);
  33. int checkPoint(char *chaine);
  34. struct sNb *depiler();
  35. char trouveTypeResultat(char type1, char type2);
  36. int traiterOperateur(char operateur);
  37.  
  38. struct sNb *tete;
  39.  
  40. int main(){
  41. /*
  42. char choix[50];
  43. fflush(stdin);
  44. gets(choix);
  45.  
  46. printf("%u\n", atoui(choix));
  47.  
  48. system("pause");
  49. */
  50.  
  51. tete = NULL;
  52. char choix[50] = "hello";
  53.  
  54. while(strcmp("q", choix) != 0){
  55.  
  56. printf("Entrez un operateur (+, -, *, /, = ou a), d, q ou un nombre: ");
  57. fflush(stdin);
  58. gets(choix);
  59. printf("\n");
  60.  
  61. if (checkNombre(choix) != 0){
  62.  
  63. if (atonb(choix) == 0){
  64. printf("Nombre non ajouter\n");
  65. }
  66.  
  67. }
  68.  
  69. else{
  70. traiterOperateur(choix[0]);
  71.  
  72. }
  73.  
  74. afficherPile();
  75. }
  76.  
  77.  
  78. system("pause");
  79.  
  80. }
  81.  
  82. unsigned int atoui(char *acVal){
  83. // EBX VAL
  84. // EAX COMPTEUR
  85. // EDX 10^x
  86. int i;
  87. unsigned int val = 0;
  88.  
  89. _asm{
  90. mov EAX, 0
  91. mov EBX, val
  92. mov EDX, 1
  93.  
  94. boucle1:
  95. cmp acVal[EAX], 0
  96. je end1
  97. inc EAX
  98. jmp boucle1
  99. end1:
  100.  
  101. mov i, eax
  102.  
  103. sub eax, 1
  104.  
  105. boucle:
  106. cmp EAX, 0
  107. jle end
  108.  
  109.  
  110.  
  111. movsx ECX, acVal[EAX]
  112. sub ECX, 48
  113. imul ECX, EDX
  114.  
  115. imul EDX, 10
  116.  
  117.  
  118. add EBX, ECX
  119. dec EAX
  120. mov ECX, 0
  121. jmp boucle
  122.  
  123. end:
  124.  
  125. mov val, EBX
  126. }
  127. return val;
  128. }
  129.  
  130. int empiler(union uValeur nouvelleValeur, char bType){
  131.  
  132. struct sNb *nouveau = malloc(sizeof(struct sNb));
  133.  
  134. if(nouveau == NULL)
  135. return 0;
  136.  
  137. nouveau->uVar = nouvelleValeur;
  138. nouveau->bType = bType;
  139. nouveau->suivant = tete;
  140. tete = nouveau;
  141.  
  142. return 1;
  143.  
  144. }
  145.  
  146.  
  147.  
  148. int atonb(char *chaine){
  149.  
  150. union uValeur nouveau;
  151.  
  152. if (atof(chaine) == 0 && chaine[0] != '0')
  153. return 0;
  154. if (checkPoint(chaine) == 1){
  155. nouveau.fVal = (float)atof(chaine);
  156.  
  157. if (TestInf(nouveau.fVal)){
  158. printf("Erreur nombre infini\n");
  159. return 0;
  160. }
  161.  
  162. if (empiler(nouveau, 1) != 1)
  163. return 0;
  164.  
  165. return 1;
  166. }
  167. if (chaine[0] == '+' || chaine[0] == '-'){
  168. nouveau.iVal = atoi(chaine);
  169.  
  170. if (empiler(nouveau, 2) != 1)
  171. return 0;
  172.  
  173. return 1;
  174. }
  175. else{
  176. nouveau.uiVal = atoi(chaine);
  177.  
  178. if (empiler(nouveau, 3) != 1)
  179. return 0;
  180.  
  181. return 1;
  182. }
  183. }
  184.  
  185. void afficherPile(){
  186.  
  187. struct sNb *next = tete;
  188.  
  189. while (next != NULL){
  190.  
  191. switch (next->bType){
  192. case 1:
  193. printf("<F> %f\n", next->uVar.fVal);
  194. break;
  195. case 2:
  196. printf("<I> %d\n", next->uVar.iVal);
  197. break;
  198. case 3:
  199. printf("<UI> %u\n", next->uVar.uiVal);
  200. break;
  201. default:
  202. printf("DEBUG: Afficher pile: switch\n");
  203. }
  204.  
  205.  
  206. next = next->suivant;
  207. }
  208.  
  209. }
  210.  
  211. int checkNombre(char *chaine){
  212.  
  213. if ((chaine[0] >= 48 && chaine[0] <= 57) || (chaine[0] == '-' || chaine[0] == '+') && (chaine[1] >= 48 && chaine[1] <= 57))
  214. return 1;
  215. else
  216. return 0;
  217.  
  218. }
  219.  
  220. int checkPoint(char *chaine){
  221.  
  222. int i = 0;
  223.  
  224. while (chaine[i] != '\0' && i < 20){
  225. if (chaine[i] == '.')
  226. return 1;
  227. i++;
  228. }
  229. return 0;
  230.  
  231. }
  232.  
  233. struct sNb *depiler(){
  234.  
  235. struct sNb *tmp;
  236.  
  237. tmp = tete;
  238. tete = tmp->suivant;
  239.  
  240. return tmp;
  241.  
  242. }
  243.  
  244. char trouveTypeResultat(char type1, char type2){
  245.  
  246. if (type1 <= type2)
  247. return type1;
  248. else
  249. return type2;
  250.  
  251. }
  252.  
  253. int traiterOperateur(char operateur){
  254.  
  255. struct sNb *operante1, *operante2;
  256. union uValeur resultat;
  257.  
  258. switch (operateur){
  259. case 'a':
  260. if (tete == NULL){
  261. printf("Operation impossible, pile vide.\n");
  262. return 0;
  263. }
  264. operante1 = depiler();
  265. resultat.iVal = Arrondir(operante1->uVar.fVal);
  266. empiler(resultat, 2);
  267. free(operante1);
  268. return 1;
  269. break;
  270. case 'd':
  271. if (tete == NULL){
  272. printf("Operation impossible, pile vide.\n");
  273. return 0;
  274. }
  275. operante1 = depiler();
  276. free(operante1);
  277. return 1;
  278. break;
  279. }
  280.  
  281. if (tete == NULL || tete->suivant == NULL){
  282. printf("Pas assez d'operante pour appliquer l'operation.\n");
  283. return 0;
  284. }
  285.  
  286. if (operateur == '='){
  287. if (ECART(tete->uVar.fVal, tete->suivant->uVar.fVal) <= ECART_MAX){
  288. printf("Valeurs sont egales\n");
  289. return 1;
  290. }
  291. }
  292.  
  293.  
  294.  
  295. char typeResultat;
  296.  
  297. operante1 = depiler();
  298. operante2 = depiler();
  299. typeResultat = trouveTypeResultat(operante1->bType, operante2->bType);
  300.  
  301.  
  302.  
  303. resultat.fVal = 0;
  304.  
  305. switch (operante1->bType){
  306. case 1:
  307. resultat.fVal += operante1->uVar.fVal;
  308. break;
  309.  
  310. case 2:
  311. resultat.fVal += operante1->uVar.iVal;
  312. break;
  313.  
  314. case 3:
  315. resultat.fVal += operante1->uVar.uiVal;
  316. break;
  317.  
  318. default:
  319. printf("oops\n");
  320. }
  321.  
  322. switch (operante2->bType){
  323. case 1:
  324. switch (operateur){
  325. case '+':
  326. resultat.fVal += operante2->uVar.fVal;
  327. break;
  328. case '-':
  329. resultat.fVal -= operante2->uVar.fVal;
  330. break;
  331. case '*':
  332. resultat.fVal *= operante2->uVar.fVal;
  333. break;
  334. case '/':
  335. resultat.fVal /= operante2->uVar.fVal;
  336. break;
  337. }
  338. break;
  339.  
  340. case 2:
  341. switch (operateur){
  342. case '+':
  343. resultat.fVal += operante2->uVar.iVal;
  344. break;
  345. case '-':
  346. resultat.fVal -= operante2->uVar.iVal;
  347. break;
  348. case '*':
  349. resultat.fVal *= operante2->uVar.iVal;
  350. break;
  351. case '/':
  352. resultat.fVal /= operante2->uVar.iVal;
  353. break;
  354. }
  355. break;
  356.  
  357. case 3:
  358. switch (operateur){
  359. case '+':
  360. resultat.fVal += operante2->uVar.uiVal;
  361. break;
  362. case '-':
  363. resultat.fVal -= operante2->uVar.uiVal;
  364. break;
  365. case '*':
  366. resultat.fVal *= operante2->uVar.uiVal;
  367. break;
  368. case '/':
  369. resultat.fVal /= operante2->uVar.uiVal;
  370. break;
  371. }
  372. break;
  373.  
  374. default:
  375. printf("oops\n");
  376. }
  377.  
  378. switch (typeResultat){
  379.  
  380. case 1:
  381. if (TestNaN(resultat.fVal)){
  382. printf("Operation interdite\n");
  383. }
  384. else{
  385. empiler(resultat, typeResultat);
  386. }
  387. break;
  388. case 2:
  389. resultat.iVal = (int)resultat.fVal;
  390. empiler(resultat, typeResultat);
  391. break;
  392. case 3:
  393. resultat.uiVal = (unsigned int)resultat.fVal;
  394. empiler(resultat, typeResultat);
  395. break;
  396. default:
  397. printf("mouai\n");
  398.  
  399. }
  400. free(operante1);
  401. free(operante2);
  402. return 1;
  403. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement