Задача.
Определить общее количество операций сложения (+), вычитания (—) и умножения (*) в заданном арифметическом выражении.
Входные данные
В единственной строке задано арифметическое выражение, не содержащее скобок и пробелов. Количество символов в выражении не превышает 250.
Выходные данные
Единственное число — количество указанных операций.
Тесты:
входящая строка | результат первой программы | результат второй программы | результат третей программы |
-5+20-a+2*c | 4 | 4 | 4 |
20+40-a | 2 | 2 | 2 |
-2+2+2+2-a*4*6-2*5- | 8 | 8 | 8 |
2+6*6 | 2 | 2 | 2 |
Код программы:
Первый способ. Потоковая обработка символов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include using namespace std; bool f (char x) { return ((x<='9') || (x>='a' && x<='z') || (x>='A' && x<='Z')); //Проверяем является ли символ частью числа или переменной. } int main() { char a,b,c; int n=0; a=getchar(); b=getchar(); while (EOF!=(c=getchar())) { if (f(a)&&f(c)&&(b=='*' || b=='-' || b=='+')) { n++; } a=b; b=c; } cout<<n; return 0; } |
Второй способ. c-string.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include <iostream> #include <cstring> using namespace std; bool f (char x) { return ((x<='9') || (x>='a' && x<='z') || (x>='A' && x<='Z')); //Проверяем является ли символ частью числа или переменной. } int main() { short int k = 0; char s[250]; while (cin>>s[k]) { k++; } char * c = strpbrk (s+1, "+-*"); short int n = 0; while (c!=NULL) { if (f(s[c-1 - s]) && f(s[c+1-s])&&(c-s!=k-1)) { n++; } s[c-s] = ' '; c = strpbrk (s+1, "+-*"); } cout<<n; return 0; } |
Третий способ. Класс string.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#include <iostream> #include <string> using namespace std; bool f (char x) { return ((x<='9') || (x>='a' && x<='z') || (x>='A' && x<='Z')); //Проверяем является ли символ частью числа или переменной. } int NOP (string s, char c) //функция, читающая, сколько раз символ c встречается в строке s { int n=0; if (s.find_first_of(c) == s.find_last_of(c)) // проверяем, больше ли вхождений символа с в троку, чем 1 { if (s.find_first_of(c)<s.size() && s.find_first_of(c)>0) return 1; else return 0; } size_t i=s.find_first_of(c); //находим первое вхождение символа с и проверяем, не в наале ли он строки. Это делается отдельно, чтобы не выходить за пределы строки. if (i!=0) if (f(s[i-1])&&f(s[i+1])) n++; s.at(i) = '_'; size_t q=s.find_last_of(c); //Аналогично, находим последнее вхождение символа с if (q == s.size()-1) if (f(s[i-1])&&f(s[i+1])) n--; while (i<q) { i=s.find_first_of(c); s.at(i) = '_'; if (f(s[i-1])&&f(s[i+1])) n++; } return n; } int main() { string s; getline(cin,s); cout<<NOP(s,'+')+NOP(s,'-')+NOP(s,'*'); return 0; } |
Решение.
Чтобы подсчитать количество операций, указанных в условии, необходимо подсчитать символы которые соответствуют этим операциям и находятся между переменными или числами. проверять только предыдущий и следующий символ на то, является ли он буквой (значит, он является частью переменной или переменная) или цифрой (значит, он является частью числа или числом). В первой программе это осуществляется потоковой обработкой символов с запоминанием последующего и предыдущего, во второй — созданием массива символов c-string и использованием функции strpbrk, в третей — созданием объекта класса string и использованием функций find_first_of, find_last_of.
Задача взята с сайта e-olymp.com
Ссылки на зачитанные решения:
Ссылки на код на ideone:
Принято оба варианта.