Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <stdlib.h>
- #include <locale.h>
- //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
- //Funkcja sprawdza czy znak o cyfra i zwraca 1 dla prawdy, -1 dla fałszu
- int cyfra(char *str)
- {
- return (str[0] >= '0' && str[0] <= '9') ? 1 : -1;
- }
- //Funkcja zlicza cyfry i zwraca ich ilosc, jezeli nie wczytano zadnej cyfry zwraca -1
- int cyfry(char *str)
- {
- int n;
- for (n = 0; cyfra(str + n)>0; ++n);
- return n>0 ? n : -1;
- }
- //Funkcja sprawdza czy wystepuje czesc ulamkowa i zwraca ilosc cyfr zgodnych z gramatyk, jezeli nie wystepuje cz. ulamkowa zwraca -1
- int cz_ulamkowa(char *str)
- {
- int cyfry_;
- if (str[0] == '.')
- {
- cyfry_ = cyfry(str + 1);
- 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
- }
- return -1;
- }
- //Funkcja sprawdza czy występuje znak "+" lub "-" i zwraca 1 w przypadku występowania któregoś, 0 jeśli żaden znak nie występuje
- int znak_opc(char *str)
- {
- return(str[0] == '+' || str[0] == '-') ? 1 : 0;
- }
- //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"
- int wykladnik_opc(char *str)
- {
- int cyfry_;
- int znak_opc_;
- if (str[0] == 'e' || str[0] == 'E')
- {
- znak_opc_ = znak_opc(str + 1);
- cyfry_ = cyfry(str + znak_opc_ + 1);
- return cyfry_ > 0 ? cyfry_ + znak_opc_ + 1 : 0;
- }
- return 0;
- }
- int litery(char *str)
- {
- int i = 0, temp = 0, temp2 = 0;
- while (str[i] != '\0')
- {
- if(str[i] == '$') break;
- i++;
- }
- i = 0;
- while (str[i] != '$')
- {
- i++;
- }
- while (str[i] != '\0')
- {
- if (((int)str[i+1] >= 97) && ((int)str[i+1] <= 122)) temp2++;
- i++;
- }
- temp2++;
- return temp2;
- }
- //Funkcja sprawdza czy znaki są liczbą i zwraca liczbe zgodnych znaków lub -1 jeżeli żaden znak nie jest zgodny
- int liczba(char *str)
- {
- int znak_opc_;
- int cyfry_;
- int cz_ulamkowa_;
- int wykladnik_opc_;
- znak_opc_ = znak_opc(str);
- cyfry_ = cyfry(str + znak_opc_);
- if (cyfry_ < 0)
- cyfry_ = 0;
- cz_ulamkowa_ = cz_ulamkowa(str + znak_opc_ + cyfry_);
- if (cz_ulamkowa_ <0)
- cz_ulamkowa_ = 0;
- if ((cyfry_ + cz_ulamkowa_) ==0)
- return -1;
- wykladnik_opc_ = wykladnik_opc(str + znak_opc_ + cyfry_ + cz_ulamkowa_);
- //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!
- return znak_opc_ + cyfry_ + cz_ulamkowa_ + wykladnik_opc_;
- }
- //Funkcja sprzawdza czy znak jest operacją i zwraca 1 jeśli prawda i 0 jeśli znak operacji nie występuje
- int operacja(char *str)
- {
- return(str[0] == '+' || str[0] == '-' || str[0] == '/' || str[0] == '*') ? 1 : 0;
- }
- int czynnik(char*); //Deklaruje funkcje przed jej użyciem w f. wyrazenie
- //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ą
- int wyrazenie(char*str)
- {
- int wyrazenie_;
- int czynnik_;
- int operacja_;
- int litery_;
- litery_ = litery(str);
- czynnik_ = czynnik(str);
- if (czynnik_ > 0)
- {
- operacja_ = operacja(str + czynnik_);
- if (operacja_ > 0)
- return ((wyrazenie_ = wyrazenie(str + czynnik_ + operacja_)) > 0) ? litery_ + czynnik_ + operacja_ + wyrazenie_: -1;
- return czynnik_;
- }
- return -1;
- }
- //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ą)
- int czynnik(char*str)
- {
- int liczba_;
- int wyrazenie_;
- liczba_ = liczba(str);
- if (liczba_ >0)
- return liczba_;
- return ((str[0] == '(') && ((wyrazenie_ = (wyrazenie(str + 1))) > 0) && (str[0+wyrazenie_+1] == ')') ? wyrazenie_ + 2 : -1);//+2, ponieważ występują znaki "(" i ")"//sprawdzenie ")"
- }
- //Funckcja pyta użytkownika o wyrażenie i poprzerz wywołanie f. wyrazenie zwraca liczbę znaków zgodnych z gramatyką
- void main()
- {
- char buf[100];
- setlocale(LC_ALL, "polish");
- printf("Jeśli chcesz zakończyć wpisz 'k' i zatwierdź klawiszem enter\n");
- while (1)
- {
- printf("Twoje wyrażenie matematyczne : \n");
- scanf("%s", buf);
- if (*buf == 'k')
- return;
- printf("Ilość znaków zgodnych : %d\n", wyrazenie(buf));
- }
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement