Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
4
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
891
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
946
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
936
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1723
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4380
0
Помогите пожалуйста решить задачи
24th November, 23:53
6084
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4308
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2598
0
Решение задачи Электронная таблица с Меньшиков
Без пояснения   Просмотров: 1029
Напишите программу, выполняющую функции очень простой электронной таблицы. Она работает с таблицей из 9 строк от 1 до 9 и 26 столбцов от A до Z. Клетки таблицы обозначаются именами, составленными из кодов столбца и строки, например, B1, S8.
Каждая клетка содержит выражение. Выражения используют целые константы, ссылки на клетки, скобки, бинарные операторы +, -, * и / (целочисленное деление). Например, 567, E8/2, (3+B3)*(C4-1) являются правильными выражениями. Все операторы целочисленные. Деление на ноль даёт в результате ноль.
Если значение ячейки, на которую ссылается некоторое выражение, не определено, оно считается равным нулю. Ситуация, когда две или более ячейки зависят друг от друга, является отдельным случаем - циклической ссылкой.
Ограничения: длина выражения в одной ячейке до 255 символов, все аргументы и результаты меньше 1 000 000.
Каждая клетка содержит выражение. Выражения используют целые константы, ссылки на клетки, скобки, бинарные операторы +, -, * и / (целочисленное деление). Например, 567, E8/2, (3+B3)*(C4-1) являются правильными выражениями. Все операторы целочисленные. Деление на ноль даёт в результате ноль.
Если значение ячейки, на которую ссылается некоторое выражение, не определено, оно считается равным нулю. Ситуация, когда две или более ячейки зависят друг от друга, является отдельным случаем - циклической ссылкой.
Ограничения: длина выражения в одной ячейке до 255 символов, все аргументы и результаты меньше 1 000 000.
Код
#include #include #include #include #include #include #include using namespace std; const int size = 26 * 9; const int MAX_SIZE = 255 + 10; enum TYPE {WHITE, GRAY, BLACK}; int n; vector exp(size); vector value(size); vector > adj(size); vector used(size, WHITE); stack opers; stack numbers; void trim(string &str) { while (str[0] == ' ') str.erase(0,1); while (str[str.size()-1]==' ') str.erase(str.size()-1,1); } int code(const char *pos) { return (*pos - 'A') * 9 + *(pos+1) - '1'; } int code(const string &s) { return code(s.c_str()); } bool isLetter(char c) { return 'A' <= c && c<= 'Z'; } bool isDigit(char c) { return '0'<= c && c <= '9'; } void fillAdj(int index, string s) { for (int i = 0; i &G, bool &isCircle) { used[pos] = GRAY; for (set ::iterator it=adj[pos].begin(); it != adj[pos].end(); it++) { if (isCircle) return; if (used[*it] == GRAY) { isCircle = true; break; } else if (used[*it] == WHITE){ dfs(*it,G,isCircle); } } G.push_back(pos); used[pos] = BLACK; } bool topological_sort(vector &G) { bool isCircle = false; dfs(0,G,isCircle); return isCircle; } inline bool isEnd(const char * pos) { return *pos == 0; } void SkipSep(char* &pos) { while (!isEnd(pos) && *pos == ' ') pos++; } bool isOper(const char* pos) { return !isEnd(pos) && ( *pos == '+' || *pos == '-' || *pos == '*' || *pos == '/' ); } int prior (const char pos) { if (pos == '+' || pos == '-') return 1; else return 2; } void ReadCell(char* &pos, int &number) { int cell = code(pos); pos+=2; number = value[cell]; } void ReadNumber (char* &pos, int &number) { number = 0; while (!isEnd(pos) && isDigit(*pos)) { number = number * 10 + (*pos - '0'); pos++; } } void calcExp(char* &pos, int &res); void ReadNextValue(char* &pos, int &number) { if (*pos == '(') { pos++; calcExp(pos,number); pos++; } else { if (isLetter(*pos)) ReadCell(pos, number); if (isDigit(*pos)) ReadNumber(pos, number); } } int calc(int f, int s, char oper) { switch(oper) { case '+': return f + s; case '-': return f - s; case '*': return f * s; case '/': if (s == 0) return 0; else return f/s; } } void calcExp(char* &pos, int &res) { stack locNumbers; stack locOper; do { SkipSep(pos); if (isOper(pos)) { char curOper = *pos++; while (!locOper.empty() && prior(locOper.top()) > prior(curOper)) { int s = locNumbers.top(); locNumbers.pop(); int f = locNumbers.top(); locNumbers.pop(); int locRes = calc(f,s,locOper.top()); locOper.pop(); locNumbers.push(locRes); } locOper.push(curOper); } else { int number = 0; ReadNextValue(pos, number); locNumbers.push(number); } SkipSep(pos); } while (!isEnd(pos) && *pos != ')'); while (!locOper.empty()) { int s = locNumbers.top(); locNumbers.pop(); int f = locNumbers.top(); locNumbers.pop(); int locRes = calc(f,s,locOper.top()); locOper.pop(); locNumbers.push(locRes); } res = locNumbers.top(); } void solve() { vector G; if (topological_sort(G)) { cout<<(int)1e6; } else { if (G.empty()) G.push_back(0); for (int i=0;i
 
 
 
 
 
Автор: Администратор
Автор: Администратор
Комментарии
info@mycod.net  
Карта сайта  
Правообладателям
Заявка на расчет
×
или напишите нам прямо сейчас: