Advertisement
Guest User

Untitled

a guest
Nov 11th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.62 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5. #define NUM_MAX 10
  6. #define EIL_MAX 20
  7. #define INPUT_LIMIT 3
  8. #define IN 1
  9. #define OUT 0
  10. /*
  11.  
  12. v10 versija
  13.  
  14. funkcijos:
  15.  
  16. 1. skaitymas - nuskaito eilute ir tikrina ar ivestis tinkama veiksmams;
  17. 2. skaidymas - gauta veiksmu eilute, pagal salygas, skaido i kintamuosius ir operatorius;
  18. 3. matematika - atlieka matematinius veiksmus su suskaidytais kintamaisiais.
  19.  
  20. Naujoves v8:
  21. Panaikina tarpus skaitymas funkcijoje
  22.  
  23. Naujoves v9: veiksmai su skliausteliais - jei skliaustelis pradzioje;
  24.  
  25. Naujoves v10: veiksmai su skliausteliais - jei skliaustelis ne pradzioje;
  26.  
  27. Tikslas v11:
  28. -atlikti veiksma kai nera daugybos zeklo pries skliaustus t.y pvz 3*3*3(12+5), o ne 3*3*3*(12+5)
  29. -jeigu ivedame eiilute daugiau nei 20 zenklu - stabdyti.
  30. -kodel nepaima veiksmo (1*5)*(2*3*(2*3))+9. Suskaiciuoja ir nepaima 9 kaip number2 ???????????????????
  31. */
  32.  
  33. char * skaitymas();
  34. char * skaidymas (char * veiksmu_eilute);
  35. void matematika(char veiksmas, char * number1, char * number2, int * ptr);
  36.  
  37. int main()
  38. {
  39.     char * start = NULL;
  40.     int input_count = 0;
  41.     while (start == NULL)
  42.     {
  43.         start = skaidymas(skaitymas());
  44.         input_count++;
  45.         if (input_count == INPUT_LIMIT && start == NULL)
  46.             return 0;
  47.         if (start == NULL)
  48.             printf("\nLIKO BANDYMU: %d\n", INPUT_LIMIT - input_count);
  49.     }
  50.     printf("----------------------\nRezultatas: %s\n", start);
  51.     return 0;
  52. }
  53.  
  54. char * skaitymas ()
  55. {
  56.     int i = 0;
  57.     char * veiksmu_eilute = NULL;
  58.     veiksmu_eilute = (char *) malloc(EIL_MAX*sizeof(char));
  59.     fgets(veiksmu_eilute, EIL_MAX, stdin);
  60.  
  61.     //strlen(veiksmu_eilute)-1 - nes fgets paima ir \n ENTER chara. Su -1 mes pries ji perkeliam nuli;
  62.     veiksmu_eilute[strlen(veiksmu_eilute)-1] = '\0';
  63.     int not_space = 0;
  64.     while (veiksmu_eilute[i] != '\0')
  65.     {
  66.         if (!isdigit(veiksmu_eilute[i]) && veiksmu_eilute[i] != 32 && veiksmu_eilute[i] != 43 && veiksmu_eilute[i] != 45 & veiksmu_eilute[i] != 47 &&
  67.         veiksmu_eilute[i] != 42 && veiksmu_eilute[i] != 40 && veiksmu_eilute[i] != 41)
  68.         {
  69.             printf("\nKLAIDA: Bloga ivestis\nGalimi skaitmenys 0-9 ir operatoriai: + - * / ( )\n");
  70.             return NULL;
  71.         }
  72.         // jeigu praleistas char yra ne tarpas, ji dedame indexe 'not_space'
  73.         else if  (veiksmu_eilute[i] != ' ')
  74.             veiksmu_eilute[not_space++] = veiksmu_eilute[i];
  75.         i++;
  76.     }
  77.     veiksmu_eilute[not_space] = '\0';
  78.  
  79.     return veiksmu_eilute;
  80. }
  81.  
  82. char * skaidymas (char * veiksmu_eilute)
  83. {
  84.     if (veiksmu_eilute == NULL)
  85.         return NULL;
  86.     char *number1 = NULL;
  87.     number1 = (char *) malloc(NUM_MAX*sizeof(char));
  88. //  char number2[NUM_MAX];
  89.  
  90.     // perdarau i pointeri, kadangi vykdant rekursija reik grazint i number2;
  91.     char * number2 = NULL;
  92.     number2 = (char *) malloc(NUM_MAX*sizeof(char));
  93.  
  94.  
  95.     char skliaustas[NUM_MAX];
  96.     memset(number1, 0, sizeof(number1));
  97.     memset(number2, 0, sizeof(number2));
  98.     int counter_a = 0;
  99.     int counter_b = 0;
  100.     int counter_c = 0;
  101.     int counter_d = 0;
  102.     int * counter_b_ptr = NULL;
  103.     counter_b_ptr = &counter_b;
  104.     char veiksmas = 0;
  105.  
  106.     for (counter_a = 0; counter_a < strlen(veiksmu_eilute); counter_a++)
  107.     {
  108.         //jeigu skliaustinis veiksmas yra pradzioje veiksmu_eilute
  109.         if (veiksmu_eilute[counter_a] == '(' && number1[0] == '\0' && veiksmas == 0)
  110.         {
  111.             while(veiksmu_eilute[counter_a] != ')')
  112.             {
  113.                 // jeigu nebus stringe ), gausime segmenta. Kad to nebutu, jeigu atsimusam i \0 iseinam is loopo
  114.                 if (veiksmu_eilute[counter_a] == '\0')
  115.                     break;
  116.                 skliaustas[counter_d++] = veiksmu_eilute[++counter_a];
  117.             }
  118.         skliaustas[counter_d-1] = '\0';
  119.         number1=skaidymas(skliaustas);
  120.         counter_b = strlen(number1);
  121.         //Isvalome skliausta ir counter_d;
  122.         counter_d = 0;
  123.         memset(skliaustas, 0, sizeof(skliaustas));
  124.  
  125.             // jeigu nebuvo uzdaromo skliausto ')' iki galo veiksmu_eilutes, - graziname number1
  126.             if (veiksmu_eilute[counter_a] == '\0')
  127.                 return number1;
  128.         }
  129.         if (number1[0] != 0 && veiksmas != 0 && veiksmu_eilute[counter_a] == '(')
  130.         {
  131.             while(veiksmu_eilute[counter_a] != ')')
  132.             {
  133.                 if(veiksmu_eilute[counter_a] == '\0')
  134.                     break;
  135.                 skliaustas[counter_d++] = veiksmu_eilute[++counter_a];
  136.             }
  137.         skliaustas[counter_d-1] = '\0';
  138.         number2=skaidymas(skliaustas);
  139.         counter_c = strlen(number2);
  140.         counter_d = 0;
  141.         memset(skliaustas, 0, sizeof(skliaustas));
  142.         }
  143.  
  144.         // number1 ir number2 uzpildyti, todel atlieku matematini veiksma
  145.         if(!isdigit(veiksmu_eilute[counter_a]) && veiksmas != 0 && number1[0] != '\0' && number2[0] != '\0')
  146.         {
  147.             number1[counter_b] = '\0';
  148.             number2[counter_c] = '\0';
  149.             matematika(veiksmas, number1, number2, counter_b_ptr);
  150.             // vietoje number2[0] = 0 naudoju memset, kadangi pilnai neisvalo
  151.             memset(number2, 0, sizeof(number2));
  152.             // veiksmas ne 0 (veiksmas=0), o naujas zenklas, kadangi ji skanuojam ateiciai;
  153.  
  154.             // jeigu turime zenkla ne ) - priskiriame ji veiksmui.
  155.             if (veiksmu_eilute[counter_a] != ')')
  156.             {
  157.  
  158.                 veiksmas = veiksmu_eilute[counter_a];
  159.  
  160.             }
  161.             // jeigu turime ) - dedame veiksma 0, kadangi jis netinka - ieskom kito zenklo. Kad ieskot kito zenklo, reik ji nunulint;
  162.             else
  163.                 veiksmas = 0;
  164.  
  165.             counter_c = 0;
  166.         }
  167.         else if(isdigit(veiksmu_eilute[counter_a]) && veiksmas == 0)
  168.         {
  169.             number1[counter_b] = veiksmu_eilute[counter_a];
  170.             counter_b++;
  171.         }
  172.         else if(!isdigit(veiksmu_eilute[counter_a]) && veiksmas == 0 && veiksmu_eilute[counter_a] != ')')
  173.         {
  174.             veiksmas = veiksmu_eilute[counter_a];
  175.         }
  176.         else if(isdigit(veiksmu_eilute[counter_a]) && veiksmas != 0)
  177.         {
  178.             number2[counter_c] = veiksmu_eilute[counter_a];
  179.             counter_c++;
  180.         }
  181.         //jeigu visa veiksmu_eilute yra veiksmas skliaustuose, pvz, (2*2)
  182.         else if (veiksmu_eilute[counter_a] == ')' && veiksmu_eilute[counter_a+1] == '\0')
  183.             return number1;
  184.     }
  185.         matematika(veiksmas, number1, number2, counter_b_ptr);
  186.     return number1;
  187. }
  188.  
  189. void matematika(char veiksmas, char * number1, char * number2, int * ptr)
  190. {
  191. //  printf("Tikriname # %c # %s # %s\n", veiksmas, number1, number2);
  192.     // paskutinis veiksmas gali gautis, jog number2 yra tuscias, todel tokiu atveju graziname number1.
  193.     if (number2[0] == '\0')
  194.         return;
  195.  
  196.     int atsakymas = 0;
  197.     switch (veiksmas)
  198.     {
  199.         case '+':
  200.         atsakymas = atoi(number1) + atoi(number2);
  201.         break;
  202.         case '-':
  203.         atsakymas = atoi(number1) - atoi(number2);
  204.         break;
  205.         case '*':
  206.         atsakymas = atoi(number1) * atoi(number2);
  207.         break;
  208.         // pataisyti su %, kad normaliai dalintu;
  209.         case '/':
  210.         atsakymas = atoi(number1) / atoi(number2);
  211.         break;
  212.     }
  213.     // isvalome number1 elementus
  214.     memset(number1, 0, sizeof(number1));
  215.     sprintf(number1, "%d", atsakymas);
  216.     // Po veiksmu reikalinga atnaujinti counter_b pozicija, kad zinoti, kur terminaitinti 'number_1' stringa;
  217.     *ptr = strlen(number1);
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement