Advertisement
Guest User

Untitled

a guest
Nov 1st, 2014
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.70 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. //#include "riesenie4.h"
  8. #ifndef _RIESENIE_H_
  9.     #define _RIESENIE_H_
  10.  
  11. //1. uloha
  12. class CISLO {
  13.     int hodnota;
  14. public:
  15.     void vlozCislo(int cislo);
  16.     bool vlozDesiatkoveCislo(const string cislo);
  17.     string vratDesiatkoveCislo();
  18.     int vratHodnotu();
  19. };
  20. //2. uloha
  21. class CISLO_V_SUSTAVE : public CISLO {
  22.     int sustava;
  23. public:
  24.     bool vlozSustavu(int sustava0);
  25.     int vratSustavu();
  26.     bool vlozCisloVSustave(const string cislo);
  27.     string vratCisloVSustave();
  28. };
  29. //3. uloha
  30. class KALKULACKA {
  31.  protected:
  32.     CISLO_V_SUSTAVE vysledok;
  33.  public:
  34.     string vypocitaj(int op1, char operator0, int op2);
  35.     int vratVysledok();
  36. };
  37. //4. uloha
  38. class KALKULACKA_V_SUSTAVE : public KALKULACKA {
  39.     int sustava;
  40. public:
  41.     bool vlozSustavu(int sustava0);
  42.     int vratSustavu();
  43.     string vypocitajVSustave(const string op1, char operator0, const string op2);
  44. //5. uloha
  45.     string vypocitajVyraz(const string vyrazVSustave);
  46. };
  47.  
  48. #endif
  49.  
  50. int DUMMY_INT = -999;
  51. bool DUMMY_BOOL = false;
  52. string DUMMY_STRING = "";
  53. /*
  54. */
  55. int ZLE_CISLO = -9999;
  56.  
  57. //Prevzate zdrojaky z 3.cvicenia
  58. int pocetVyskytovZnaku(const string vstup, char znak) {
  59.   return DUMMY_INT;
  60. }
  61. int kontrolaZnakov(const string zdroj, const string zoznamZnakov) {
  62.   return DUMMY_INT;
  63. }
  64. bool kontrolaSpravnostiCisla(const string cislo0, int sustava) {
  65.   return DUMMY_BOOL;
  66. }
  67.  
  68. int umocnenie(int a, int b) {
  69.     int ret = 1;
  70.     for (int i = 1; i <= b; i++) {
  71.         ret = ret*a;
  72.     }
  73.     return ret;
  74. }
  75.  
  76. int konverziaDoDesiatkovej(const string cislo, int sustava) {
  77.     int ret = 0;
  78.     bool minus = false;
  79.     if (sustava == 15) {return -9999;}
  80.     if (cislo.size() == 0) {return ZLE_CISLO;}
  81.     for (unsigned int i = 0; i < cislo.size(); i++){
  82.         if (cislo[i] == '-') {minus = true;}
  83.         else {
  84.             if (cislo[i]-'0'>=sustava)
  85.             {
  86.                 return ZLE_CISLO;
  87.             }
  88.             ret += (cislo[i]-'0')*(umocnenie(sustava, cislo.size()-1-i));
  89.         }
  90.     }
  91.     if (minus == true) {ret = ret*(-1);}
  92.     return ret;
  93. }
  94. string cisloNaString(int c) {
  95.     if (c == 0) {
  96.         return "0";
  97.     }
  98.     int cislo = c;
  99.     bool znamienko = false;
  100.     if (c < 0) {
  101.         znamienko = true;
  102.         cislo *= -1;
  103.     }
  104.     string otocenyVysledok = "";
  105.     while (cislo > 0) {
  106.         otocenyVysledok += (cislo % 10) + '0';
  107.         cislo /= 10;
  108.     }
  109.     string vysledok = znamienko ? "-" : "";
  110.     for (int i = otocenyVysledok.size() - 1; i > -1; i--) {
  111.         vysledok += otocenyVysledok[i];
  112.     }
  113.     return vysledok;
  114. }
  115. string konverziaDesiatkovehoCislaDoSustavy(int c, int sustava) {
  116.     if (c == 0) {
  117.         return "0";
  118.     }
  119.     if (sustava < 2 || sustava > 10) {
  120.         return "ZLA_SUSTAVA";
  121.     }
  122.     int cislo = c;
  123.     bool znamienko = false;
  124.     if (c < 0) {
  125.         znamienko = true;
  126.         cislo *= -1;
  127.     }
  128.     string otocenyVysledok = "";
  129.     while (cislo > 0) {
  130.         otocenyVysledok += (cislo % sustava) + '0';
  131.         cislo /= sustava;
  132.     }
  133.     string vysledok = znamienko ? "-" : "";
  134.     for (int i = otocenyVysledok.size() - 1; i > -1; i--) {
  135.         vysledok += otocenyVysledok[i];
  136.     }
  137.     return vysledok;
  138. }
  139. //**********************************************************************************
  140. //1. uloha
  141. void CISLO::vlozCislo(int cislo) {
  142.     hodnota = cislo;
  143. }
  144. bool CISLO::vlozDesiatkoveCislo(string cislo) {
  145.     int c2 = 0;
  146.     int moc = 0;
  147.     bool minus = true;
  148.     int velkost = cislo.size();
  149.     if ((cislo[0] != '-') && (cislo[0] - '0' < 0) || (cislo[0] - '0' > 9)) {
  150.         return false;}
  151.     else {
  152.         if (cislo[0] != '-') {
  153.             c2 = cislo[0] - '0';
  154.             minus = false;
  155.         }
  156.     }
  157.     if (minus == true) {velkost--;}
  158.     for (unsigned int i = 1; i<cislo.size(); i++) {
  159.         if ((cislo[i] - '0' < 0) || (cislo[i] - '0' > 9)) {
  160.             return false;}
  161.         else {
  162.             moc = 1;
  163.             for (unsigned int j = velkost - 1 ; j>=i; j--) {
  164.                 moc *= 10;
  165.             }
  166.             c2 += (cislo[i] - '0')*moc;
  167.         }
  168.     }
  169.     if (minus = true) {c2 *= -1;}
  170.     hodnota = c2;
  171.     return true;
  172. }
  173.  
  174. string CISLO::vratDesiatkoveCislo() {
  175.     if (hodnota == 0) {
  176.         return "0";
  177.     }
  178.     int cislo1 = hodnota;
  179.     bool znamienko = false;
  180.     if (hodnota < 0) {
  181.         znamienko = true;
  182.         cislo1 *= -1;
  183.     }
  184.     string otocenyVysledok = "";
  185.     while (cislo1 > 0) {
  186.         otocenyVysledok += (cislo1 % 10) + '0';
  187.         cislo1 /= 10;
  188.     }
  189.     string vysledok = znamienko ? "-" : "";
  190.     for (int i = otocenyVysledok.size() - 1; i > -1; i--) {
  191.         vysledok += otocenyVysledok[i];
  192.     }
  193.     return vysledok;
  194. }
  195. int CISLO::vratHodnotu() {
  196.     return hodnota;
  197. }
  198. //2. uloha
  199. bool CISLO_V_SUSTAVE::vlozSustavu(int sustava0) {
  200.     //DUMMY_BOOL = false;
  201.     if (sustava0 < 2 || sustava0 > 10) {
  202.         return false;
  203.     }
  204.     sustava = sustava0;
  205.     DUMMY_BOOL = true;
  206.     return DUMMY_BOOL;
  207. }
  208. int CISLO_V_SUSTAVE::vratSustavu() {
  209.     DUMMY_INT = sustava;
  210.     return DUMMY_INT;
  211. }
  212. bool CISLO_V_SUSTAVE::vlozCisloVSustave(string cislo0) {
  213.     int pomCislo;
  214.     for (unsigned int i = 0; i < cislo0.size(); i++) {
  215.         int ityClen = cislo0[i] - '0';
  216.         if ((ityClen < 0) || (ityClen > vratSustavu())) {
  217.             return false;
  218.         }
  219.     }
  220.     pomCislo = konverziaDoDesiatkovej(cislo0, vratSustavu());
  221.     CISLO::vlozCislo(pomCislo);
  222.     DUMMY_BOOL = true;
  223.     return DUMMY_BOOL;
  224. }
  225. string CISLO_V_SUSTAVE::vratCisloVSustave() {
  226.     DUMMY_STRING = konverziaDesiatkovehoCislaDoSustavy(CISLO::vratHodnotu(), CISLO_V_SUSTAVE::vratSustavu());
  227.     return DUMMY_STRING;
  228. }
  229. //3. uloha
  230. string KALKULACKA::vypocitaj(int op1, char operator0, int op2) {
  231.     int vysledok;
  232.     //Ak operator0 nie je jeden z povolenych operatorov +-*/, vrat "NEZNAMY OPERATOR".
  233.     //Inak vypocitaj jednoduchy aritmeticky vyraz a vysledok
  234.     //vloz do clenskej premennej vysledok.
  235.     //Tento vysledok vrat ako string. Pozor na delenie nulou.
  236.     if (operator0 != '+' && int(operator0) != '-' && int(operator0) != '*' && int(operator0) != '/'){
  237.         return "NEZNAMY OPERATOR";
  238.     }
  239.     if (int(operator0) == '+'){
  240.         vysledok = op1 + op2;
  241.         return cisloNaString(vysledok);
  242.     }
  243.     if (int(operator0) == '-'){
  244.         vysledok = op1 - op2;
  245.         return cisloNaString(vysledok);
  246.     }
  247.     if (int(operator0) == '*'){
  248.         vysledok = op1 * op2;
  249.         return cisloNaString(vysledok);
  250.     }
  251.     if (int(operator0) == '/' && op1 != 0 && op2 != 0){
  252.         vysledok = op1 / op2;
  253.         return cisloNaString(vysledok);
  254.     }
  255.     else{
  256.         return "DELENIE NULOU";
  257.     }
  258.  
  259. }
  260. int KALKULACKA::vratVysledok() {
  261.     return DUMMY_INT;
  262. }
  263. //4. uloha
  264. bool KALKULACKA_V_SUSTAVE::vlozSustavu(int sustava0) {
  265.     //Ak vstupna sustava nie je povolena, vrat false.
  266.     //Inak ju vloz do clenskej premennej sustava a vrat true.
  267.     if(sustava0 < 2 || sustava0 > 10){
  268.         return false;
  269.     }
  270.     else{
  271.         sustava = sustava0;
  272.         return true;
  273.     }
  274. }
  275. int KALKULACKA_V_SUSTAVE::vratSustavu() {
  276.     //Vrat clensku premennu sustava.
  277.     return sustava;
  278. }
  279. string KALKULACKA_V_SUSTAVE::vypocitajVSustave(const string op1, char operator0, const string op2) {
  280.     int cislo1, cislo2, vysledok;
  281.     //Skonvertuj oba operandy v zadanej sustave do celych cisel.
  282.     //Ak je niektore cislo nespravne v danej sustave, vrat "ZLE_CISLO".
  283.     //Ak operator0 nie je jeden z povolenych operatorov +-*/, vrat "NEZNAMY OPERATOR".
  284.     //Inak vypocitaj jednoduchy aritmeticky vyraz a vysledok
  285.     //vloz do clenskej premennej vysledok.
  286.     //Tento vysledok vrat ako string. Pozor na delenie nulou.
  287.  
  288.     for (unsigned int i = 0; i < op1.size(); i++) {
  289.         int ityClen = op1[i] - '0';
  290.         if ((ityClen < 0) || (ityClen >= sustava)) {
  291.             return "ZLE_CISLO";
  292.             break;
  293.         }
  294.     }
  295.  
  296.     for (unsigned int i = 0; i < op2.size(); i++) {
  297.         int ityClen = op2[i] - '0';
  298.         if ((ityClen < 0) || (ityClen >= sustava)) {
  299.             return "ZLE_CISLO";
  300.             break;
  301.         }
  302.     }
  303.  
  304.     cislo1=konverziaDoDesiatkovej(op1, sustava);
  305.     cislo2=konverziaDoDesiatkovej(op2, sustava);
  306.  
  307.     if (operator0 != '+' && int(operator0) != '-' && int(operator0) != '*' && int(operator0) != '/'){
  308.         return "NEZNAMY OPERATOR";
  309.     }
  310.     if (int(operator0) == '+'){
  311.         vysledok = cislo1 + cislo2;
  312.         return konverziaDesiatkovehoCislaDoSustavy(vysledok, sustava);
  313.     }
  314.     if (int(operator0) == '-'){
  315.         vysledok = cislo1 - cislo2;
  316.         return konverziaDesiatkovehoCislaDoSustavy(vysledok, sustava);
  317.     }
  318.     if (int(operator0) == '*'){
  319.         vysledok = cislo1 * cislo2;
  320.         return konverziaDesiatkovehoCislaDoSustavy(vysledok, sustava);
  321.     }
  322.     if (int(operator0) == '/' && cislo1 != 0 && cislo2 != 0){
  323.         vysledok = cislo1 / cislo2;
  324.         return konverziaDesiatkovehoCislaDoSustavy(vysledok, sustava);
  325.     }
  326.     else{
  327.         return "DELENIE NULOU";
  328.     }
  329. }
  330. //5. uloha
  331. string KALKULACKA_V_SUSTAVE::vypocitajVyraz(const string vyraz) {
  332.     //Metoda najprv rozparsuje vstupny vyraz na <operand><operator><operand>.
  333.     //Ak nie je vyraz spravny v zadanej sustave, vrat "ZLY VYRAZ".
  334.     //Skonvertuj oba operandy v zadanej sustave do celych cisel.
  335.     //Ak je niektore cislo nespravne v danej sustave, vrat "ZLE_CISLO".
  336.     //Ak operator0 nie je jeden z povolenych operatorov +-*/, vrat "NEZNAMY OPERATOR".
  337.     //Inak vypocitaj jednoduchy aritmeticky vyraz a vysledok
  338.     //vloz do clenskej premennej vysledok.
  339.     //Tento vysledok vrat ako string. Pozor na delenie nulou.
  340.     return DUMMY_STRING;
  341. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement