Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<stack>
- #include <fstream>
- #include <string>
- #include <cstring>
- using namespace std;
- stack<int>numbers;
- stack<char>functions;
- /*Задача 1.
- Нека е дадена следната дефиниция на израз:
- израз = неотрицателно цяло число | f(израз) | g(израз) | m(израз,израз), където:
- ● f(x) = (x * x) mod 100, където mod 100 връща остатъка при деление на 100
- ● g(x) = (x mod 5) ! , т.е. факториелът на остатъка на деленето на х на 5
- ● m(x,y) = min(x,y)
- Например, f(m(25, g(14))) е валиден израз от горния тип и се оценява до 76, защото:
- f(m(25,g(14))) =
- f( min( 25, (14 mod 5)!) =
- f (min (25, 24)) =
- (24 * 24) mod 100 = 76
- Даден е текстови файл с последователен достъп, в който са записани на отделен ред цяло
- положително число N и след него пак на отделни редове N на брой изрази от горния вид.
- Съдържанието на един примерен файл би бил:
- 3
- f(15)
- m(f(15),24)
- f(m(25, g(14)))
- Да се напише програма, която прочита информацията от един такъв файл и извежда на
- стандартния изход на отделен ред всеки израз от файла и съответната му крайна оценка (без
- междинни стъпки).
- Забележка:
- - Програмата трябва да работи за произволен израз от горния вид.
- - При реализацията можете да използвате избрана от вас работеща реализация на
- структурата или структурите, които ще използвате, включително и тези предоставяни от STL.
- Реализациите няма да се оценяват, а само тяхното използване при решаването на задачата*/
- int strNumber(string str, int& pos) {
- int n = 0;
- while (str[pos] >= '0' && str[pos] <= '9') {
- n = n * 10 + str[pos] - '0';
- pos++;
- }
- pos--;
- return n;
- }
- int fact(int x) {
- if (x == 1)
- return 1;
- return x * fact(x - 1);
- }
- //f(x) = (x * x) mod 100
- int f(int x) {
- return ((x * x) % 100);
- }
- //g(x) = (x mod 5)!
- int g(int x) {
- return fact((x % 5));
- }
- //m(x,y) = min(x,y)
- int m(int x, int y) {
- if (x > y)
- return y;
- else return x;
- }
- void calculateFunction() {
- int x, y;
- char c;
- c = functions.top();
- functions.pop();
- x = numbers.top();
- numbers.pop();
- if (c == 'f') numbers.push(f(x));
- else if (c == 'g')numbers.push(g(x));
- else {
- y = numbers.top();
- numbers.pop();
- numbers.push(m(x, y));
- }
- }
- int calculateExpresion(string str) {
- for (int i = 0; i < str.size(); i++) {
- if (str[i] >= '0' && str[i] <= '9') {
- numbers.push(strNumber(str, i));
- }
- else if (str[i] == ')')calculateFunction();
- else if (str[i] == 'f' || str[i] == 'g' || str[i] == 'm')functions.push(str[i]);
- }
- return numbers.top();
- }
- int main()
- {
- fstream expFile;
- expFile.open("exp.txt");
- string temp;
- getline(expFile, temp);
- string temp2;
- getline(expFile, temp2);
- expFile << 25<<endl;
- expFile.close();
- /*
- for (int i = 0; i < (strNumber(temp,5)); i++)
- {
- string temp2;
- getline(expFile, temp2);
- expFile << cin.getline(calculateExpresion(temp2), 4);
- temp2 = NULL;
- }
- /*string str;
- getline(cin, str);
- for ( int i = 0; i < str.size(); i++) {
- if (str[i] >= '0' && str[i] <= '9') {
- numbers.push(strNumber(str, i));
- }
- else if (str[i] == ')')calculateFunction();
- else if (str[i] == 'f' || str[i] == 'g' || str[i] == 'm')functions.push(str[i]);
- }
- cout << numbers.top();
- */
- // cout<<calculateExpresion("f(m(25, g(14)))");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement