Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.97 KB | None | 0 0
  1. int validate_expression(const char *expr)
  2. {
  3. if(expr==NULL)
  4. {
  5. return -1;
  6. }
  7. int x=strlen(expr);
  8. const char* operators = "+-/*";
  9. if( isdigit(*(expr+x-1))==0 || isdigit(*(expr))==0)
  10. {
  11. return 0;
  12. }
  13. int i;
  14. for(i=0;i<x;i++)
  15. {
  16. if(isdigit(*(expr+i))==0)
  17. {
  18. const char* next_operator = strchr(operators,*(expr+i));
  19. if(next_operator==NULL || (i + 1 < x && strchr(operators,*(expr+i+1)) != NULL))//3+3\n
  20. return 0;
  21. }
  22. }
  23.  
  24. return 1;
  25.  
  26. }
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <math.h>
  30. #include <string.h>
  31. #include <ctype.h>
  32. int add(const char* number1, const char* number2, char** result);
  33. int validate(const char *number)
  34. {
  35. if(number==NULL)
  36. {
  37. return 2;
  38. }
  39. int len =strlen(number);
  40. if(len==0)
  41. {
  42. return 1;
  43. }
  44. int i;
  45. if(len>1 && *(number)=='0')
  46. {
  47. return 1;
  48. }
  49. for(i=0;i<len;i++)
  50. {
  51. if(i==0)
  52. {
  53. if((*number+i)=='-' && isdigit(*(number+i+1)))
  54. continue;
  55. }
  56. if(!isdigit(*(number+i)))
  57. {
  58. return 1;
  59.  
  60. }
  61. }
  62. return 0;
  63.  
  64. }
  65.  
  66. int compare(const char* number1, const char* number2)
  67. {
  68. int i, c1, c2, size1, size2, maxSize;
  69.  
  70. if(number1 == NULL || number2 == NULL)
  71. return 2;
  72. if(validate(number1) == 1 || validate(number2) == 1)
  73. return 3;
  74. if(*number1 != '-' && *number2 == '-')
  75. return 1;
  76. if(*number1 == '-' && *number2 != '-')
  77. return -1;
  78.  
  79. size1 = strlen(number1);
  80. size2 = strlen(number2);
  81. maxSize = size1;
  82. if(size2 > maxSize)
  83. maxSize = size2;
  84.  
  85. for(i=maxSize; i>0; i--)
  86. {
  87. c1 = 0;
  88. if(size1-i >= 0)
  89. c1 = *(number1+size1-i) - '0';
  90. if(c1 + '0' == '-')
  91. c1 = 0;
  92.  
  93. c2 = 0;
  94. if(size2-i >= 0)
  95. c2 = *(number2+size2-i) - '0';
  96. if(c2 + '0' == '-')
  97. c2 = 0;
  98.  
  99. if(c1 > c2 && *number1 != '-')
  100. return 1;
  101. if(c1 > c2 && *number1 == '-')
  102. return -1;
  103. if(c1 < c2 && *number1 != '-')
  104. return -1;
  105. if(c1 < c2 && *number1 == '-')
  106. return 1;
  107. }
  108.  
  109. return 0;
  110. }
  111.  
  112.  
  113. int subtract(const char* number1, const char* number2, char** result)
  114. {
  115. int size1, size2, maxSize, sizeRes, i, i2, toSub, res;
  116. int c1, c2;
  117. int x;
  118.  
  119. if(number1 == NULL || number2 == NULL || result == NULL)
  120. return 1;
  121. if(validate(number1) == 1 || validate(number2) == 1)
  122. return 2;
  123.  
  124. if( *number1 != '-' && *number2 == '-' )
  125. {
  126. return add(number1, number2 + 1, result);
  127. }
  128. if( *number1 == '-' && *number2 != '-' )
  129. {
  130. res = add(number1 + 1, number2, result);
  131. size1 = strlen(*result);
  132. for(i=size1+1; i>0; i--)
  133. *(*(result)+i) = *(*(result)+i-1);
  134. *(*(result)) = '-';
  135. return res;
  136. }
  137. if( compare(number1, number2) == -1 && *number1!='-' && *number2!='-' )
  138. {
  139. res = subtract(number2, number1, result);
  140. size1 = strlen(*result);
  141.  
  142. for(i=size1+1; i>0; i--)
  143. *(*(result)+i) = *(*(result)+i-1);
  144. *(*(result)) = '-';
  145.  
  146. return res;
  147. }
  148. if( (compare(number1, number2) == 1 && *number1=='-' && *number2=='-') )
  149. {
  150. res = subtract(number2, number1, result);
  151. size1 = strlen(*result);
  152.  
  153. for(i=0; i<size1; i++)
  154. *(*(result)+i) = *(*(result)+i+1);
  155.  
  156. return res;
  157. }
  158.  
  159.  
  160. size1 = strlen(number1);
  161. size2 = strlen(number2);
  162. maxSize = size1;
  163. if(size2 > maxSize)
  164. maxSize = size2;
  165. *result = (char*)malloc( sizeof(char)*(maxSize+3) );
  166. if(*result == NULL)
  167. return 3;
  168.  
  169. toSub = 0;
  170. sizeRes = 1;
  171. *(*result) = '\0';
  172. for(i=1; i<=size1 || i<=size2; i++)
  173. {
  174. c1 = 0;
  175. if(size1 - i >= 0)
  176. c1 = *(number1 + size1 - i) - '0' - toSub;
  177. if(c1 + '0' == '-')
  178. c1 = 0;
  179. toSub = 0;
  180. c2 = 0;
  181. if(size2 - i >= 0)
  182. c2 = *(number2 + size2 - i) - '0';
  183. if(c2 + '0' == '-')
  184. c2 = 0;
  185.  
  186. if(c2 > c1)
  187. toSub++;
  188.  
  189. res = c1 - c2 + toSub*10;
  190. for(i2=sizeRes; i2>0; i2--)
  191. *((*result)+i2) = *((*result)+i2-1);
  192. sizeRes++;
  193. *(*result) = res + '0';
  194. }
  195. x=strlen(*result);
  196. for(sizeRes=0; *((*result)+sizeRes) == '0'; sizeRes++){}
  197. if(sizeRes == x)
  198. sizeRes--;
  199. if(sizeRes > 0)
  200. {
  201. for(i=0; *((*result)+i+sizeRes) != '\0'; i++)
  202. *((*result)+i) = *((*result)+i+sizeRes);
  203. *((*result)+i) = '\0';
  204. }
  205.  
  206. if(*number1 == '-' && *number2 == '-' && *(*result)!='0')
  207. {
  208. for(i=size1+1; i>0; i--)
  209. *(*(result)+i) = *(*(result)+i-1);
  210. *(*(result)) = '-';
  211. }
  212.  
  213. return 0;
  214. }
  215.  
  216. int add(const char* number1, const char* number2, char** result)
  217. {
  218. int x;
  219. int size1, size2, maxSize, sizeRes, i, i2, toAdd, res;
  220. char c1, c2;
  221. if(number1 == NULL || number2 == NULL || result == NULL)
  222. return 1;
  223. if(validate(number1) == 1 || validate(number2) == 1)
  224. return 2;
  225.  
  226. if(*number1!='-' && *number2=='-')
  227. {
  228. return subtract(number1, number2+1, result);
  229. }
  230. if(*number1=='-' && *number2!='-')
  231. {
  232. return subtract(number2, number1+1, result);
  233. }
  234.  
  235. size1 = strlen(number1);
  236. size2 = strlen(number2);
  237. maxSize = size1;
  238. if(size2 > maxSize)
  239. maxSize = size2;
  240. *result = (char*)malloc( sizeof(char)*(maxSize+3) );
  241. if(*result == NULL)
  242. return 3;
  243.  
  244. toAdd = 0;
  245. sizeRes = 1;
  246. *(*result) = '\0';
  247. for(i=1; i<=size1+1 || i<=size2+1; i++)
  248. {
  249. c1 = '0';
  250. if(size1 - i >= 0)
  251. c1 = *(number1 + size1 - i);
  252. if(c1 == '-')
  253. c1 = '0';
  254. c2 = '0';
  255. if(size2 - i >= 0)
  256. c2 = *(number2 + size2 - i);
  257. if(c2 == '-')
  258. c2 = '0';
  259.  
  260. res = (c1-'0') + (c2-'0') + toAdd;
  261. toAdd = res / 10;
  262. res = res % 10;
  263.  
  264. for(i2=sizeRes; i2>0; i2--)
  265. *((*result)+i2) = *((*result)+i2-1);
  266. sizeRes++;
  267. *(*result) = res + '0';
  268. }
  269.  
  270. x=strlen(*result);
  271.  
  272. for(sizeRes=0; *((*result)+sizeRes) == '0'; sizeRes++){}
  273. if(sizeRes == x)
  274. sizeRes--;
  275. if(sizeRes > 0)
  276. {
  277. for(i=0; *((*result)+i+sizeRes) != '\0'; i++)
  278. *((*result)+i) = *((*result)+i+sizeRes);
  279. *((*result)+i) = '\0';
  280. }
  281. sizeRes=strlen(*result);
  282. if(*number1 == '-' && *number2 == '-' && *(*result)!='0')
  283. {
  284. for(i=sizeRes+1; i>0; i--)
  285. *(*(result)+i) = *(*(result)+i-1);
  286. *(*(result)) = '-';
  287. }
  288.  
  289. return 0;
  290. }
  291.  
  292. int main()
  293. {
  294. char *n1, *n2, *res1, *res2;
  295. char ch;
  296. res1 = NULL;
  297. res2 = NULL;
  298. n1 = (char*)malloc(sizeof(char)*201);
  299. n2 = (char*)malloc(sizeof(char)*201);
  300.  
  301. if(n1 == NULL || n2 == NULL)
  302. {
  303. printf("Failed to allocate memory");
  304. if(n1!=NULL)
  305. {
  306. free(n1);
  307. }
  308. if(n2!=NULL)
  309. {
  310. free(n2);
  311. }
  312. return 2;
  313. }
  314. printf("number1: \n ");
  315. scanf("%200s", n1);
  316. ch = '\0';
  317. while(ch != '\n')
  318. ch = (char)fgetc(stdin);
  319. printf("number2: \n ");
  320. scanf("%200s", n2);
  321.  
  322.  
  323. if(validate(n1) == 1 || validate(n2) == 1)
  324. {
  325. printf("Error");
  326.  
  327. free(n1);
  328. free(n2);
  329. return 1;
  330. }
  331.  
  332. if( add(n1, n2, &res1) == 3 || subtract(n1, n2, &res2) == 3 )
  333. {
  334.  
  335. free(n1);
  336. free(n2);
  337. if(res1!=NULL)
  338. {
  339. free(res1);
  340. }
  341. if(res2!=NULL)
  342. {
  343. free(res2);
  344. }
  345.  
  346. printf("Failed to allocate memory");
  347. return 2;
  348. }
  349.  
  350. printf(res1);
  351. printf("\n");
  352. printf(res2);
  353.  
  354. free(res1);
  355. free(res2);
  356. free(n1);
  357. free(n2);
  358. return 0;
  359. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement