Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- using namespace std;
- bool check(string s){
- int last_pos = 0;
- while (last_pos != -1){
- int pos = s.find("+", last_pos);
- string a = s.substr(last_pos, pos-last_pos-1);
- for (int i = 0; i < a.size(); i++)
- if (not isdigit(a[i]) and a[i] != ' '){
- return false;
- }
- if (pos == -1)
- last_pos = -1;
- else
- last_pos = pos + 1;
- }
- return true;
- }
- int main(){
- string s;
- getline(cin, s);
- bool check_result = check(s);
- if (not check_result)
- cout << "Некорректная строка!" << endl;
- else {
- int sum = 0;
- int last_pos = 0;
- while (last_pos != -1){
- int pos = s.find("+", last_pos);
- int a = stoi(s.substr(last_pos, pos-last_pos-1));
- sum += a;
- if (pos == -1)
- last_pos = -1;
- else
- last_pos = pos + 1;
- }
- cout << "Сумма: " << sum << endl;
- }
- return 0;
- }
- #include <iostream>
- #include <string>
- using namespace std;
- bool check(string s){ // Функция для проверки строки. Делаем её типа bool, чтобы она возвращала только true, если строка норм, или false, если не норм
- int last_pos = 0; // Переменная, в которую мы записываем индекс последнего разделителя нашей строки. Строку мы будем делить по плюсам,
- // ведь у нас в корректной строке числа разделены пробелами и плюсами, а функции stoi на пробелы похуй. Но потом я в эту переменную
- // буду записывать индекс разделителя + 1 для удобства (индекс первого элемента после разделителя)
- while (last_pos != -1){ // пока last_pos не равно -1, т.к. метод find даёт -1, если ничего не находит, а не найдёт он, если мы уже дошли до последнего
- // числа и разделителя после него нет.
- int pos = s.find("+", last_pos); // Записываем в переменную позицию разделителя. В find я пихнул last_pos, который указывавет на то, с какой
- // позиции нам начинать поиск. Это надо для того, чтобы он не находил нам каждый раз первый +. Мы указываем
- // позицию первого символа после последнего найденного плюча как начало, и метод будет искать первый + после него
- string a = s.substr(last_pos, pos-last_pos-1); // Берём из s подстроку, начало которой - last_pos (берём с первого элемента после разделителя),
- // а количество символов pos - last_pos - 1 (-1 для того, чтобы не брать найденный +, ибо в pos его позиция)
- // Если второй аргумент функции отрицательный (а это случается, если pos == -1, т.е., разделителей больше
- // нет), то возвращается подстрока от last_pos до конца строки
- for (int i = 0; i < a.size(); i++) // Идём в цикле по полученной строке
- if (not isdigit(a[i]) and a[i] != ' '){ // Смотрим по каждому символу. Если он не является цифрой (с помощью isdigit) и не пробел, то тут не число, бан
- return false; // Поэтому возвращаем false, и функция прекратится
- }
- // Далее, если pos == -1, то у нас в строке больше нет разделителей, значит мы дошли до последнего элемента, и last_pos надо сделать -1, чтобы цикл больше
- // не запускался
- if (pos == -1)
- last_pos = -1;
- else // Если pos не -1, то значит ещё есть число, которое мы не обработали, и делаем last_pos = pos + 1 для удобства
- last_pos = pos + 1;
- }
- return true; // Если в цикле ни разу не нашлось неподходящих символов и он не вернул false, то запускается эта часть кода, которая возвращает true.
- }
- int main(){
- string s;
- getline(cin, s);
- bool check_result = check(s); // Записываем результат нашей функции проверки
- if (not check_result)
- cout << "Некорректная строка!" << endl;
- else {
- // Здесь поступаем аналогично, только вместо проверки каждого символа подстроки a на корректность просто преобразуем её в int и прибавляем к sum
- int sum = 0;
- int last_pos = 0;
- while (last_pos != -1){
- int pos = s.find("+", last_pos);
- int a = stoi(s.substr(last_pos, pos-last_pos-1));
- sum += a;
- if (pos == -1)
- last_pos = -1;
- else
- last_pos = pos + 1;
- }
- cout << "Сумма: " << sum << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement