Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.12 KB | None | 0 0
  1. #include<iostream>
  2. #include<conio.h>
  3. #include<windows.h>
  4. using namespace std;
  5.  
  6. char numerals[36] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D',
  7. 'E','F','G','H','I','J','K','L','M','N','O','P','Q','R',
  8. 'S','T','U','V','W','X','Y','Z'};
  9. void gotoxy(int x, int y);
  10. int getNum(char c);
  11. char getChar(int n);
  12. void clear(char num1[50]);
  13. int getLength(char num[50]);
  14. bool isZero(char num[50]);
  15. void print(char num1[50]);
  16. bool isInSystem(char c,int syst);
  17. void cinlong(char mas[50]);
  18. void copyNum(char a[50],char b[50]);
  19. void mult(char num1[50],char num2[50],char res[50],int syst);
  20. void reverse(char arr[50], int start, int end) ;
  21. void getFirstNumeralsNumber(char num1[50],char num2[50],int k);
  22. int compareNumbers(char num1[50],char num2[50]);
  23. void sumNum(char num1[50],char num2[50],char res[50],int syst);
  24. void plusOne(char num1[50],int syst);
  25. void minusNum(char num1[50],char num2[50],char res[50],int syst);
  26. void catOne(char num[50],int n);
  27. void power(char num1[50],int k,char res[50],int syst);
  28. void toDecimal(char num1[50],char num2[50],int syst);
  29. bool isValidNum(char ch);
  30. void divNum(char num1[50],char num2[50],char resDiv[50],char ost[50],int syst);
  31. void decToN(char num1[50],char res[50],int n);
  32. int getCountNum(int a);
  33. int makeSpaces(int a);
  34. void printRes(char num1[50],char num2[50],char res[50],int syst,char op);
  35.  
  36. int main()
  37. {
  38. char num1[50],num2[50],res[50],
  39. buf[50],buf1[50],buf2[50],resBuf[50],count[50],
  40. prevResBuf[50],copyNum1[50],resDiv[50];
  41. int len1 = 0,
  42. len2 = 0,
  43. len3 = 0,
  44. len4 = 0;
  45.  
  46. int syst = 0;
  47. clear(res);
  48. cout << "num1: \n";
  49. cinlong(num1);
  50. cout << "num2: \n";
  51. cinlong(num2);
  52. cout << "syst: \n";
  53. cin >> syst;
  54.  
  55. while(1)
  56. {
  57. int item = 1;
  58. char ans = ' ';
  59. while((int)ans != 13)
  60. {
  61. system("cls");
  62. cout << "\t\t"<<"Menu"<<endl<<endl;
  63. cout << "num1:";
  64. print(num1);
  65. cout << endl;
  66. cout<<"num2:";
  67. print(num2);
  68. cout << endl;
  69. cout<<"syst:";
  70. cout << syst<<endl;
  71. cout<<endl;
  72. cout << "1 - plus";
  73. if(item == 1) cout<<"<-" <<endl; else cout << endl;
  74. cout << "2 - minus";
  75. if(item == 2) cout<<"<-" <<endl; else cout << endl;
  76. cout << "3 - multiplication";
  77. if(item == 3) cout<<"<-" <<endl; else cout << endl;
  78. cout << "4 - division";
  79. if(item == 4) cout<<"<-" <<endl; else cout << endl;
  80. cout << "5 - change first number";
  81. if(item == 5) cout<<"<-" <<endl; else cout << endl;
  82. cout << "6 - change number system";
  83. if(item == 6) cout<<"<-" <<endl; else cout << endl;
  84. cout << "7 - exit";
  85. if(item == 7) cout<<"<-" <<endl; else cout << endl;
  86. ans = getch();
  87. switch(ans)
  88. {
  89. case 72:
  90. {
  91. if(item == 1) item = 7; else item--;
  92. break;
  93. }
  94. case 80:
  95. {
  96. if(item == 7) item = 1; else item++;
  97. break;
  98. }
  99. }
  100. }
  101.  
  102.  
  103.  
  104. int mem = 0;
  105. int maxLen = 0;
  106. if(item == 1)
  107. {
  108. sumNum(num1,num2,res,syst);
  109. printRes(num1,num2,res,syst,'+');
  110.  
  111.  
  112.  
  113. system("pause>0");
  114. }
  115.  
  116. if(item == 2)
  117. {
  118. if(compareNumbers(num1,num2) >= 0)
  119. {
  120. minusNum(num1,num2,res,syst);
  121. printRes(num1,num2,res,syst,'-');
  122. }
  123. else
  124. {
  125.  
  126. cout << "first < second";
  127. }
  128.  
  129. system("pause>0");
  130. }
  131.  
  132. if(item == 3)
  133. {
  134.  
  135. mult(num1,num2,res,syst);
  136. printRes(num1,num2,res,syst,'*');
  137.  
  138. system("pause>0");
  139. }
  140.  
  141. if(item == 4)
  142. {
  143. char ost[50];
  144. divNum(num1,num2,res,ost,syst);
  145. printRes(num1,num2,res,syst,'\\');
  146.  
  147. system("pause>0");
  148. }
  149. if(item == 5)
  150. {
  151.  
  152.  
  153. system("cls");
  154.  
  155. print(num1);
  156. char ch = ' ';
  157. int len1 = getLength(num1);
  158. int curX = len1-1;
  159. gotoxy(curX,0);
  160. while((int)(ch = getch()) != 13)
  161. {
  162. if(ch == 75)
  163. {
  164. curX--;
  165. gotoxy(curX,0);
  166. }
  167. else if(ch == 77)
  168. {
  169. if(curX+1<=len1-1)
  170. {
  171. curX++;
  172. }
  173. gotoxy(curX,0);
  174. }
  175. else if(ch == 72)
  176. {
  177. if(num1[len1-1 - curX] < numerals[syst-1])
  178. {
  179. num1[len1-1 - curX] = getChar(getNum(num1[len1-1 - curX]) + 1);
  180. cout << num1[len1-1 - curX];
  181. }
  182.  
  183. //print(num1);
  184. gotoxy(curX,0);
  185. }
  186. else if(ch == 80)
  187. {
  188. if(num1[len1-1 - curX] > '0')
  189. num1[len1-1 - curX] = getChar(getNum(num1[len1-1 - curX]) - 1);
  190. cout << num1[len1-1 - curX];
  191. //print(num1);
  192. gotoxy(curX,0);
  193. }
  194. else if(isValidNum(ch))
  195. {
  196. if(ch != num1[len1 - 1 - curX])
  197. {
  198. num1[len1 - 1 - curX] = ch;
  199. cout << num1[len1 - 1 - curX];
  200. //print(num1);
  201. gotoxy(curX,0);
  202. }
  203. }
  204. else if ((ch >= 'A') && (ch <= numerals[syst-1]))
  205. {
  206. if(ch != num1[len1 - 1 - curX])
  207. {
  208. num1[len1 - 1 - curX] = ch;
  209. cout << num1[len1 - 1 - curX];
  210. gotoxy(curX,0);
  211. }
  212.  
  213. //print(num1);
  214.  
  215. }
  216. }
  217. gotoxy(0,1);
  218. }
  219. if(item == 6)
  220. {
  221. int t = 0;
  222. cout << "For num1: ";
  223. print(num1);
  224. cout << endl;
  225. cout << "For num2: ";
  226. print(num2);
  227. cout << endl;
  228. cout<<"Number System from "<<syst<<" to: ";
  229. cin>>t;
  230. toDecimal(num1,buf,syst);
  231. decToN(buf,res,t);
  232. cout << "num1: ";
  233. copyNum(num1,res);
  234. print(num1);
  235. cout << endl;
  236. toDecimal(num2,buf,syst);
  237. decToN(buf,res,t);
  238. copyNum(num2,res);
  239. cout << "num2: ";
  240. print(num2);
  241. cout << endl;
  242. syst = t;
  243. system("pause>0");
  244. }
  245. if(item == 7)
  246. {
  247. break;
  248. }
  249.  
  250. }
  251.  
  252.  
  253.  
  254.  
  255. return 0;
  256. }
  257.  
  258.  
  259.  
  260. int getNum(char c)
  261. {
  262. for(int i = 0;i<36;i++)
  263. {
  264. if(numerals[i] == c) return i;
  265. }
  266. }
  267. char getChar(int n)
  268. {
  269. return numerals[n];
  270. }
  271.  
  272. void clear(char num1[50])
  273. {
  274. for(int i = 0;i<50;i++)
  275. {
  276. num1[i] = '0';
  277. }
  278. }
  279.  
  280. int getLength(char num[50])
  281. {
  282. int i = 49;
  283. while(num[i--]=='0');
  284.  
  285. i++;
  286. return i+1;
  287. }
  288. bool isZero(char num[50])
  289. {
  290. for(int i = 49;i>=0;i--)
  291. {
  292. if(num[i] != '0') return false;
  293. }
  294. return true;
  295. }
  296.  
  297. void print(char num1[50])
  298. {
  299. if(isZero(num1)) cout << "0";
  300. else
  301. {
  302. int i = 49;
  303. while(num1[i--] == '0');
  304. i++;
  305. for(i;i>=0;i--)
  306. {
  307. cout << num1[i];
  308. }
  309. }
  310. }
  311.  
  312. bool isInSystem(char c,int syst)
  313. {
  314. for(int i = 0;i<syst;i++)
  315. {
  316. if(c == numerals[i]) return true;
  317. }
  318. return false;
  319. }
  320.  
  321. void cinlong(char mas[50])
  322. {
  323. string s;
  324. cin >> s;
  325. for(int i=0;i<50;++i)
  326. mas[i] = '0';
  327.  
  328. int len = s.length();//method class string
  329. for(int i=0;i<len;i++)
  330. mas[len - i - 1] = (s[i]);
  331. }
  332. void copyNum(char a[50],char b[50])
  333. {
  334. for(int i = 0;i<50;i++) a[i] = b[i];
  335. }
  336.  
  337.  
  338. void reverse(char arr[50], int start, int end)
  339. {
  340. char temp;
  341. while (start < end)
  342. {
  343. temp = arr[start];
  344. arr[start] = arr[end];
  345. arr[end] = temp;
  346. start++;
  347. end--;
  348. }
  349. }
  350.  
  351.  
  352.  
  353.  
  354. void mult(char num1[50],char num2[50],char res[50],int syst)
  355. {
  356. int resBuf[50] = {0};
  357. for (int i = 0; i < 50; i++)
  358. {
  359. for (int j = 0; j < 50; j++)
  360. {
  361. if(i+j<50)
  362. resBuf[i + j] += (getNum(num1[i])) * (getNum(num2[j]));
  363. }
  364. }
  365. for (int i = 0; i < 50-1; i++)
  366. {
  367. resBuf[i + 1] += (resBuf[i] / syst);
  368. resBuf[i]= resBuf[i] % syst;
  369. }
  370. for(int i = 0;i<50;i++) res[i] = getChar(resBuf[i]);
  371. }
  372.  
  373.  
  374. void getFirstNumeralsNumber(char num1[50],char num2[50],int k)
  375. {
  376. int i = 49;
  377. while(num1[i--]=='0');
  378.  
  379. i++;
  380. k--;
  381. clear(num2);
  382. for(int j = i;j>=i-k;j--)
  383. {
  384. num2[i-j] = num1[j];
  385. }
  386. reverse(num2,0,k);
  387. }
  388.  
  389. int compareNumbers(char num1[50],char num2[50])
  390. {
  391. if(getLength(num1) > getLength(num2)) return 1;
  392. else if(getLength(num2) > getLength(num1)) return -1;
  393. else
  394. {
  395. for(int i = getLength(num1);i>=0;i--)
  396. {
  397. if(num1[i] > num2[i]) return 1;
  398. else if(num2[i] > num1[i]) return -1;
  399. }
  400. return 0;
  401. }
  402. }
  403.  
  404. void sumNum(char num1[50],char num2[50],char res[50],int syst)
  405. {
  406. int mem = 0;
  407. int maxLen = max(getLength(num1),getLength(num2));
  408. for(int i = 0;i<=maxLen;i++)
  409. {
  410. res[i] = getChar((getNum(num1[i]) + getNum(num2[i]) + mem)%syst);
  411. //res[i] = (((num1[i]-'0') + (num2[i]-'0') + mem)%syst)+'0';
  412. mem = (getNum(num1[i]) + getNum(num2[i]) + mem)/syst;
  413. }
  414. }
  415.  
  416.  
  417. void plusOne(char num1[50],int syst)
  418. {
  419. char num2[50];
  420. clear(num2);
  421. num2[0] = '1';
  422. int mem = 0;
  423. int maxLen = max(getLength(num1),1);
  424. for(int i = 0;i<=maxLen;i++)
  425. {
  426. int save = (getNum(num1[i]) + getNum(num2[i]) + mem);
  427. num1[i] = getChar((getNum(num1[i]) + getNum(num2[i]) + mem)%syst);
  428. mem = save / syst;
  429. }
  430.  
  431. }
  432. void minusNum(char num1[50],char num2[50],char res[50],int syst)
  433. {
  434. char buf[50];
  435. clear(buf);
  436. copyNum(buf, num1);
  437. int curSum = 0;
  438. int maxLen = max(getLength(num1),getLength(num2));
  439. for(int i = 0;i<=maxLen;i++)
  440. {
  441. if((getNum(num1[i])) < (getNum(num2[i])))
  442. {
  443. int j = i+1;
  444. while(num1[j] == '0') {num1[j] = numerals[syst-1];j++;}
  445.  
  446. num1[j] = getChar((getNum(num1[j]))-1);
  447. curSum = (getNum(num1[i])) + syst;
  448. res[i] = getChar(curSum - (getNum(num2[i])));
  449. }
  450. else res[i] = getChar(getNum(num1[i]) - getNum(num2[i]));
  451. }
  452. copyNum(num1,buf);
  453. }
  454. void catOne(char num[50],int n)
  455. {
  456. int len = getLength(num);
  457. for(int i = len-1;i>=0;i--)
  458. num[i+1] = num[i];
  459. num[0] = getChar(n);
  460. }
  461.  
  462.  
  463. void power(char num1[50],int k,char res[50],int syst)
  464. {
  465. clear(res);
  466. res[0] = '1';
  467. for(int i = 0;i<k;i++)
  468. {
  469. mult(res,num1,res,syst);
  470. }
  471.  
  472. }
  473.  
  474. void toDecimal(char num1[50],char num2[50],int syst)
  475. {
  476. char res[50],resBuf[50],powerBuf[50],copyRes[50];
  477. clear(resBuf);
  478. clear(powerBuf);
  479. clear(res);
  480. char num[50];clear(num);
  481. char systNum[50];clear(systNum);
  482. systNum[0] = numerals[syst];
  483. for(int i = 0;i<getLength(num1);i++)
  484. {
  485. clear(resBuf);
  486. clear(powerBuf);
  487. num[0] = num1[i];
  488. power(systNum,i,powerBuf,10);
  489. mult(powerBuf,num,resBuf,10);
  490. copyNum(copyRes,res);
  491. sumNum(copyRes,resBuf,res,10);
  492. }
  493. copyNum(num2,res);
  494. }
  495.  
  496. bool isValidNum(char ch)
  497. {
  498. if((ch == '0') || (ch == '1') || (ch == '2') || (ch == '3') || (ch == '4') || (ch == '5') || (ch == '6')
  499. || (ch == '7') || (ch == '8') || (ch == '9'))
  500. return true;
  501. return false;
  502. }
  503.  
  504.  
  505. void divNum(char num1[50],char num2[50],char resDiv[50],char ost[50],int syst)
  506. {
  507. clear(ost);
  508. clear(resDiv);
  509. char copyNum1[50],buf[50],resBuf[50],
  510. prevResBuf[50],res[50],
  511. count[50];
  512. clear(res);
  513. if(compareNumbers(num1,num2)>0)
  514. {
  515. clear(resDiv);
  516. copyNum(copyNum1,num1);
  517. int len1 = getLength(num1);
  518. int k = 0;
  519. int len2 = getLength(num2);
  520. clear(buf);
  521.  
  522. //cout << "buf: ";
  523. //print(buf);
  524. int cnt = 0;
  525. while(compareNumbers(buf,num2) < 0)
  526. {
  527.  
  528. getFirstNumeralsNumber(num1,buf,getLength(num2)+cnt);
  529. cnt++;
  530.  
  531. }
  532. if (cnt>1) len1--;
  533. while(1)
  534. {
  535.  
  536. clear(resBuf);
  537. clear(prevResBuf);
  538. if(k != 0)
  539. {
  540. //cout << "k+len2 = "<<k+len2<<endl;
  541. //cout << "len1+1 = "<<len1+1<<endl;
  542. if(k+len2 == len1+1) break;
  543. copyNum(buf,res);
  544. catOne(buf,getNum(copyNum1[len1 - (len2+k)]));
  545. }
  546. // cout << "buf:\n";
  547. // print(buf);
  548. clear(count);
  549. clear(prevResBuf);
  550. int cnt = 0;
  551. do
  552. {
  553. cnt++;
  554. copyNum(prevResBuf,resBuf);
  555. plusOne(count,syst);
  556. //cout << "count:\n";
  557. //print(count);
  558.  
  559. mult(count,num2,resBuf,syst);
  560. //cout << "resBuf:\n";
  561. //print(resBuf);
  562. //cout << "buf:\n";
  563. //print(buf);
  564. //system("pause>0");
  565.  
  566. }while(compareNumbers(resBuf,buf) <= 0);
  567. catOne(resDiv,cnt-1);
  568.  
  569. clear(res);
  570. //cout << " ";
  571. //print(buf);
  572. //cout<<"-"<<endl;
  573. //cout << " ";
  574. //print(prevResBuf);
  575. //cout<<"-----"<<endl;
  576. //cout << " ";
  577. minusNum(buf,prevResBuf,res,syst);
  578. //cout << "res:\n";
  579. //print(res);
  580. //print(res);
  581. k++;
  582. //system("pause>0");
  583.  
  584.  
  585. }
  586. //print(resDiv);
  587. copyNum(ost,res);
  588. //cout << "ost: "<<ost[0]<<ost[1]<<endl;
  589. char c = getChar(getNum(ost[1])*10+getNum(ost[0]));
  590. clear(ost);
  591. ost[0] = c;
  592. //print(ost);
  593.  
  594. }
  595. else if(compareNumbers(num1,num2)==0)
  596. {
  597.  
  598. clear(resDiv);
  599. resDiv[0] = '1';
  600. //print(resDiv);
  601. clear(ost);
  602. }
  603. else {resDiv[0] = '0';copyNum(ost,num1);}
  604.  
  605. if(isZero(resDiv)) ;//cout << "0";
  606.  
  607. }
  608.  
  609. void decToN(char num1[50],char res[50],int n)
  610. {
  611. char num2[50],buf[50],resDiv[50];
  612. clear(num2);
  613. num2[0] = numerals[n];
  614.  
  615. clear(res);
  616. char ost[50];
  617. clear(ost);
  618. clear(buf);
  619. int k = 0;
  620. do
  621. {
  622. clear(ost);
  623. divNum(num1,num2,resDiv,ost,10);
  624. copyNum(num1,resDiv);
  625. int len = getLength(ost);
  626. if(len == 0) {buf[k] = '0';k++;}
  627. for(int i = len-1;i>=0;i--)
  628. {
  629. buf[k] = ost[i];
  630. k++;
  631. }
  632.  
  633. }while(compareNumbers(resDiv,res) != 0);
  634.  
  635. copyNum(res,buf);
  636.  
  637.  
  638. }
  639. int getCountNum(int a)
  640. {
  641. int cnt = 0;
  642. while(a > 0)
  643. {
  644. a /= 10;
  645. cnt++;
  646. }
  647. return cnt;
  648. }
  649.  
  650. int makeSpaces(int a)
  651. {
  652. for (int i = 0;i<a;i++)
  653. {
  654. cout << " ";
  655. }
  656. }
  657.  
  658.  
  659. void printRes(char num1[50],char num2[50],char res[50],int syst,char op)
  660. {
  661. char buf[50],buf1[50],buf2[50];
  662. cout << "("<<syst<<") ";
  663. print(num1);
  664. //--------------------------------------
  665. cout <<"\t\t\t("<<10<<") ";
  666. //-----------print num1 in decimal---------
  667. toDecimal(num1,buf,syst);
  668. print(buf);
  669. cout << endl;
  670. //-------------
  671.  
  672. makeSpaces(getCountNum(syst)+2);
  673. cout<<op<<"\t\t\t";
  674. makeSpaces(getCountNum(syst)+3+getCountNum(10)+2+getLength(num1));
  675. cout<<endl;
  676. makeSpaces(getCountNum(syst)+3+abs(getLength(num1)-getLength(num2)));
  677. print(num2);
  678.  
  679. cout<<"\t\t\t";
  680. toDecimal(num2,buf2,syst);
  681. makeSpaces(getCountNum(10)+3+abs(getLength(buf)-getLength(buf2)));
  682. print(buf2);
  683. cout << endl;
  684.  
  685. makeSpaces(getCountNum(syst)+3);
  686.  
  687. for(int i = 0;i<getLength(num1);i++)
  688. cout<<"-";
  689. cout<<"\t\t\t";
  690. makeSpaces(getCountNum(10)+3);
  691. for(int i = 0;i<getLength(buf);i++)
  692. cout<<"-";
  693. cout<<endl;
  694.  
  695.  
  696.  
  697. makeSpaces(getCountNum(10)+3+abs(getLength(num1)-getLength(num2)));
  698. print(res);
  699. if(getLength(res) < getLength(num2))
  700. {
  701. makeSpaces(getCountNum(10)+3);
  702. for(int i = 0;i<getLength(num1)-1;i++) cout << " ";
  703. }
  704. cout<<"\t\t\t";
  705.  
  706. makeSpaces(getCountNum(10)+3+abs(getLength(buf)-getLength(buf2)));
  707. toDecimal(res,buf,syst);
  708. print(buf);
  709. }
  710. void gotoxy(int x, int y)
  711. {
  712. static HANDLE h = NULL;
  713. if(!h)
  714. h = GetStdHandle(STD_OUTPUT_HANDLE);
  715. COORD c = { x, y };
  716. SetConsoleCursorPosition(h,c);
  717. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement