Advertisement
Guest User

Untitled

a guest
Jan 28th, 2015
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.36 KB | None | 0 0
  1.  
  2.  
  3.  
  4.     #define _CRT_SECURE_NO_WARNINGS
  5.     #include <stdio.h>
  6.     #include <stdlib.h>
  7.     #include <locale.h>
  8.  
  9.     //zmienne mają nazwy według schematu: nazwa zmiennej nazywa się tak jak funkcja, której wynik będzie zapisany pod tą zmienną z dodanym podkreślnikiem "_" na końcu zmiennej
  10.  
  11.     //Funkcja sprawdza czy znak o cyfra i zwraca 1 dla prawdy, -1 dla fałszu
  12.     int cyfra(char *str)
  13.     {
  14.         return  (str[0] >= '0' && str[0] <= '9') ? 1 : -1;
  15.     }
  16.  
  17.     //Funkcja zlicza cyfry i zwraca ich ilosc, jezeli nie wczytano zadnej cyfry zwraca -1
  18.     int cyfry(char *str)
  19.     {
  20.         int n;
  21.         for (n = 0; cyfra(str + n)>0; ++n);
  22.         return n>0 ? n : -1;
  23.     }
  24.  
  25.     //Funkcja sprawdza czy wystepuje czesc ulamkowa i zwraca ilosc cyfr zgodnych z gramatyk, jezeli nie wystepuje cz. ulamkowa zwraca -1
  26.     int cz_ulamkowa(char *str)
  27.     {
  28.         int cyfry_;
  29.         if (str[0] == '.')
  30.         {
  31.             cyfry_ = cyfry(str + 1);
  32.             return cyfry_ >= 0 ? cyfry_ + 1 : -1;// zakładam ze występowanie kropki to wystarczająco by uznać znak za zgodny z gramatyką, dlatego f. zwraca 1
  33.         }
  34.         return -1;
  35.     }
  36.  
  37.     //Funkcja sprawdza czy występuje znak "+" lub "-" i zwraca 1 w przypadku występowania któregoś, 0 jeśli żaden znak nie występuje
  38.     int znak_opc(char *str)
  39.     {
  40.         return(str[0] == '+' || str[0] == '-') ? 1 : 0;
  41.     }
  42.  
  43.     //Funkcja sprawdza występowanie potęgi o podstawie "e" lub "E" i zwraca ilość zgodnych znaków albo 0, gdy nie występuje "e" lub "E"
  44.     int wykladnik_opc(char *str)
  45.     {
  46.         int cyfry_;
  47.         int znak_opc_;
  48.         if (str[0] == 'e' || str[0] == 'E')
  49.         {
  50.             znak_opc_ = znak_opc(str + 1);
  51.             cyfry_ = cyfry(str + znak_opc_ + 1);
  52.             return cyfry_ > 0 ? cyfry_ + znak_opc_ + 1 : 0;
  53.         }
  54.         return 0;
  55.     }
  56.  
  57.     int litery(char *str)
  58.     {
  59.         int i = 0, temp = 0, temp2 = 0;
  60.  
  61.         while (str[i] != '\0')
  62.         {
  63.             if(str[i] == '$') break;
  64.             i++;
  65.         }
  66.         i = 0;
  67.         while (str[i] != '$')
  68.         {
  69.             i++;
  70.         }
  71.  
  72.         while (str[i] != '\0')
  73.         {
  74.             if (((int)str[i+1] >= 97) && ((int)str[i+1] <= 122)) temp2++;
  75.             i++;
  76.         }
  77.  
  78.         temp2++;
  79.         return temp2;
  80.     }
  81.  
  82.     //Funkcja sprawdza czy znaki są liczbą i zwraca liczbe zgodnych znaków lub -1 jeżeli żaden znak nie jest zgodny
  83.     int liczba(char *str)
  84.     {
  85.         int znak_opc_;
  86.         int cyfry_;
  87.         int cz_ulamkowa_;
  88.         int wykladnik_opc_;
  89.         znak_opc_ = znak_opc(str);
  90.         cyfry_ = cyfry(str + znak_opc_);
  91.         if (cyfry_ < 0)
  92.             cyfry_ = 0;
  93.         cz_ulamkowa_ = cz_ulamkowa(str + znak_opc_ + cyfry_);
  94.         if (cz_ulamkowa_ <0)
  95.             cz_ulamkowa_ = 0;
  96.  
  97.         if ((cyfry_ + cz_ulamkowa_) ==0)
  98.             return -1;
  99.         wykladnik_opc_ = wykladnik_opc(str + znak_opc_ + cyfry_ + cz_ulamkowa_);
  100.         //printf("zn_opc wynosi %d\nc wynosi %d\nulam wynosi %d\nwyk_opc wynosi %d\n", znak_opc_, cyfry_, cz_ulamkowa_, wykladnik_opc_); tylko dla sprawdzenia!
  101.  
  102.         return znak_opc_ + cyfry_ + cz_ulamkowa_ + wykladnik_opc_;
  103.  
  104.     }
  105.  
  106.     //Funkcja sprzawdza czy znak jest operacją i zwraca 1 jeśli prawda i 0 jeśli znak operacji nie występuje
  107.     int operacja(char *str)
  108.     {
  109.         return(str[0] == '+' || str[0] == '-' || str[0] == '/' || str[0] == '*') ? 1 : 0;
  110.     }
  111.  
  112.     int czynnik(char*); //Deklaruje funkcje przed jej użyciem w f. wyrazenie
  113.  
  114.     //Funkcja sprawdza ile znaków jest zgodnych z gramatyką poprzez wywoływanie innych funkcji. Zwraca -1 jeśli nie ma żadnego elementu zgodnego z gramatyką
  115.     int wyrazenie(char*str)
  116.     {
  117.         int wyrazenie_;
  118.         int czynnik_;
  119.         int operacja_;
  120.         int litery_;
  121.  
  122.         litery_ = litery(str);
  123.         czynnik_ = czynnik(str);
  124.  
  125.         if (czynnik_ > 0)
  126.         {
  127.             operacja_ = operacja(str + czynnik_);
  128.             if (operacja_ > 0)
  129.                 return ((wyrazenie_ = wyrazenie(str + czynnik_ + operacja_)) > 0) ? litery_ + czynnik_ + operacja_ + wyrazenie_: -1;
  130.             return czynnik_;
  131.         }
  132.         return -1;
  133.     }
  134.  
  135.     //Funkcja sprawdza czy czynnik jest liczbą czy wyrażeniem. Zwraca ilość znaków zgodnych z gramatyką (1 jeśli liczba, ilosc znaków zgodnych jeśli wyrażenie, -1 jeśi czynnik nie jest ani wyrażeniem ani liczbą)
  136.     int czynnik(char*str)
  137.     {
  138.         int liczba_;
  139.         int wyrazenie_;
  140.         liczba_ = liczba(str);
  141.         if (liczba_ >0)
  142.             return liczba_;
  143.         return ((str[0] == '(') && ((wyrazenie_ = (wyrazenie(str + 1))) > 0) && (str[0+wyrazenie_+1] == ')') ? wyrazenie_ + 2 : -1);//+2, ponieważ występują znaki "(" i ")"//sprawdzenie ")"
  144.     }
  145.  
  146.     //Funckcja pyta użytkownika o wyrażenie i poprzerz wywołanie f. wyrazenie zwraca liczbę znaków zgodnych z gramatyką
  147.     void main()
  148.     {
  149.         char buf[100];
  150.         setlocale(LC_ALL, "polish");
  151.         printf("Jeśli chcesz zakończyć wpisz 'k' i zatwierdź klawiszem enter\n");
  152.         while (1)
  153.         {
  154.             printf("Twoje wyrażenie matematyczne : \n");
  155.             scanf("%s", buf);
  156.             if (*buf == 'k')
  157.                 return;
  158.             printf("Ilość znaków zgodnych : %d\n", wyrazenie(buf));
  159.         }
  160.         return;
  161.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement