Я получаю правильный результат, но когда я отправляю свое решение в spoj, я я получаю ошибку времени выполнения как SIGABRT . Из-за проблемы с переполнением я использую stoll . Когда я пытался отладить свою программу, казалось, что все работает нормально.
Примечание-> Он также может содержать пробелы для улучшения читаемости.
Эта строка кажется мне подозрительной, потому что мои программы останавливаются (ошибка времени выполнения), когда я не предоставляю пробел во вводе (1 * 1 + 2 =) terminate вызывается после создания экземпляра ‘std :: invalid_argument’ what (): stoll Помогите пожалуйста, где я делаю не так?
#include #include #include using namespace std; int main() < int t; string str; cin >> t; while (t—) < ///using cin.ignore() as input as preceded by a single line cin.ignore(); getline(cin, str, ‘n’); stringstream split(str); ///now use getline with specified delimeter to split string stream string intermediate; int flag = 0; long long int ans=1; while (getline(split, intermediate, ‘ ‘)) < if (intermediate == «=») < cout if (intermediate == «*») < flag = 1; continue; >else if (intermediate == «/») < flag = 2; continue; >else if (intermediate == «+») < flag = 3; continue; >else if(intermediate == «-«) < flag = 4; continue; >if (flag == 1) < ans *= stoll(intermediate); >else if (flag == 2) < ans /= stoll(intermediate); >else if (flag == 3) < ans += stoll(intermediate); >else if (flag == 4) < ans -= stoll(intermediate); >else if (flag == 0) < ans = stoll(intermediate); >> > >
akii121 12 Фев 2019 в 23:11
Обратите внимание, что эта реализация не соблюдает порядок операций.
François Andrieux
12 Фев 2019 в 23:11
Из примера, когда 1 + 1 * 2 = имеет правильный вывод 4 , я предполагаю, что это то, что здесь нужно.
12 Фев 2019 в 23:15
Оператор, который в этом случае решается первым
12 Фев 2019 в 23:20
Разве ты уже не знаешь, в чем проблема? Вход может содержать пробелы, но ваш код предполагает, что токены всегда разделены пробелом.
463035818_is_not_a_number
12 Фев 2019 в 23:21
Я настоятельно рекомендую переместить cin.ignore(); в лучшее место. Желательно ПОСЛЕ операции, которая оставила символ в потоке. Размещение ignore перед операцией на тот случай, если предыдущая операция оставила символ в потоке, вас ждут сюрпризы.
user4581301
12 Фев 2019 в 23:24
2 ответа
Используя именно тот ввод, который вы опубликовали выше:
4 1 + 1 * 2 = 29 / 5 = 103 * 103 * 5 = 50 * 40 * 250 + 791 =
Я могу воспроизвести вашу ошибку:
terminate вызывается после создания экземпляра ‘std :: invalid_argument’
what (): stoll
Прервано
Готов поспорить, вы удалили символы новой строки в образце ввода, чтобы упростить ситуацию — в любом случае это то, как это выглядит в вашем коде. Вы выполняете getline и тянете ровно столько строк, сколько указано в первом вводе. Это означает, что вы потянете пустую строку ( intermediate будет пустой строкой) и попытаетесь ее обработать.
А что происходит, когда вы пытаетесь позвонить stoll(«») ? Ошибка у вас!
Вы можете попробовать проверить, появляется ли пустая строка, а затем продолжить, например:
getline(cin, str, ‘n’); if(str.empty()) < t++; //we didn’t actually do anything, so increment t continue; >stringstream split(str); .
Или вы можете использовать тот факт, что оператор >> уже останавливается, когда он попадает в пробел (и съедает все пробелы, которые он может, чтобы перейти к следующему съедобному символу). Таким образом, вместо того, чтобы читать строку за раз, вы можете продолжать чтение, пока не найдете символ = .
Источник: question-it.com
Обработка ошибок времени выполнения
Отладка программ является обязательным этапом работы над любым проектом. Суть отладки программ заключается в проверке работы проекта и исправлении ошибок в проекте при разработке приложения.
В процессе отладки проекта возможны три вида ошибок:
— ошибки компиляции (синтаксические), возникающие при неправильном использовании синтаксиса инструкций, свойств и методов объектов. Эти ошибки выявляются на уровне компиляции и легко исправляются;
— ошибки выполнения, возникающие при выполнении программы. Причиной таких ошибок может быть отсутствие данных, неправильные данные, неготовность устройства и так далее. Для устранения возникновения этих ошибок целесообразно использовать имеющиеся в Visual Basic средства обработки ошибок;
— логические ошибки, являющиеся причиной неправильной работы программы. Для обнаружения таких ошибок предназначены средства отладки. Средства отладки позволяют обнаружить логические ошибки и ошибки периода выполнения, а также наблюдать за выполнением программы.
Средства обнаружения и предупреждения возникновения синтаксических ошибок
Редактор кода представляет собой инструмент для создания и отладки приложения.
Выявление синтаксических ошибок осуществляется редактором кода сразу же, как только курсор покидает строку с ошибкой. Текст строки, содержащей синтаксическую ошибку, выделяется красным цветом и Visual Basic выдает сообщение с пояснением ошибки.
Редактор кода содержит набор средств позволяющих не только обнаружить синтаксические ошибки, но и предотвратить их возникновение.
К таким средствам относятся:
ü Auto Syntax Check — автоматическая проверка синтаксиса;
ü Auto Quick Info — контекстная подсказка. Это средство представляет собой небольшое окно, в котором автоматически отображается полный синтаксис вводимого оператора;
ü Auto List Members — автоматическое отображение списка имен, свойств и методов объектов. Содержимое списка зависит от типа объекта. Выбор элемента в списке выполняется мышью, или клавишами управления курсором. Если дважды щелкнуть по выбранному элементу, или нажать клавишу TAB, то выбранный элемент вставляется в текущую строку и курсор остается в той же строке. Если выбрать элемент и нажать Enter, то выбранный элемент вставляется в строку и курсор переходит на следующую строку;
ü цветовое выделение элементов кода для визуального контроля при наборе текста процедур. В окне команды ToolsOptions на вкладке Editor Format Visual Basic позволяет задать параметры шрифта и цвета для таких элементов текста, как:
— текст окна кода (Normal Text),
— выделенный текст (Selection Text),
— текст ошибочной строки (Syntax Error Text),
— текст в точке выполнения (Execution Point Text),
— текст в точке останова (Breakpoint Text),
— комментарий (Comment Text),
— ключевое слово Basic (Keyword Text),
— имена процедур и переменных (Identifier Text),
— текст строки с закладкой (Bookmark Text) и текст обратного вызова (Call Return Text);
ü функция дополнения слова. Если введено несколько начальных символов свойства, метода или элемента структуры, достаточных для их однозначной идентификации, то нажатием кнопки (Complete Word) панели инструментов Edit или клавиш Ctrl+Space Visual Basic может автоматически дополнить недостающие символы;
Подключение или отключение средств Auto Syntax Check, Auto Quick Info и Auto List Members выполняется в окне команды ToolsOptions на вкладке Editor.
Редактор кода может работать в двух режимах: режиме просмотра всего текста приложения и режиме просмотра процедур по отдельности. Кнопки включения режимов Full Module View (полный просмотр процедур) и Procedure View (просмотр процедур)находятся в левом нижнем угле окна редактора кода.
Обработка ошибок времени выполнения
При обнаружении ошибки времени выполнения Visual Basic выводит сообщение об ошибке и приостанавливает выполнение программы. Однако Visual Basic предоставляет пользователю средства, с помощью которых он может поручить программе выполнить перехват ошибки и определить дальнейшие действия. Обработка ошибок — это задание реакции на ошибки, которые возникают во время выполнения программы.
Обработка ошибок производится в три этапа:
ü Подготовка перехвата. Выполняется с помощью оператора On Error. Оператор On Error активизирует режим обработки ошибок. Это означает, что при возникновении ошибки выполнения программа не прерывается и стандартное сообщение об ошибке не выводится. Оператор On Error осуществляет передачу управления на подпрограмму обработки ошибок, которая может выдавать сообщение и продолжать работу программы. Возможны три варианта синтаксиса оператора:
On Error GoTo метка — | передача управления на подпрограмму, идентифицирующуюся меткой; |
On Error Resume Next — | ошибка игнорируется и управление передается следующему оператору за тем, при выполнении которого возникла ошибка; |
On Error GoTo 0 — | отключает предусмотренную пользователем процедуру обработки ошибок и включает стандартный механизм. |
Для перехвата вхех возможных ошибок оператор On Error должен находится в начале процедуры.
ü Проверка и устранение ошибки. Это этап обработки ошибки, на котором возникшая ошибка анализируется, и выполняются соответствующие действия. Установить тип оьибки можно с помощью объекта Err. Свойства объекта Err позволяют получить следующую информацию о последней ошибке выполнения: свойство Number — номер возникшей ошибки;
свойство Source — имя проекта, в котором возникла ошибка;
свойство Description — строка с описанием ошибки;
свойство HelpFile — полное имя файла справки.
После того как обнаруженная ошибка обработана, в процедуре нужно предусмотреть очистку свойств объекта Err. Очищает значения вхех свойств объекта Err метод Clear.
Вхе оьибки выполнения можно разделить на две группы: ожидабмые, обработка которых может быть предусмотрена заранее при разработке программы и неожиданные. Если ожидабмые ошибки известны заранее, то целесообразно создать единый для вхех процедур модуля обработчик ошибок в виде процедуры. Параметром такой процедуры должен быть код ошибки.
ü Продолжение выполнения программы. Выполняется с помощью оператора Resume. Оператор Resume передает управление из обработчика ошибок в программу. Возможны следующие варианты синтаксиса оператора:
Источник: poisk-ru.ru
Ошибки времени выполнения
Во время работы приложения могут возникать ошибки, которые называются ошибками времени выполнения (run time errors) или исключениями (exceptions). В большинстве случаев причинами исключений являются неверные исходные данные.
Например, если во время работы программы вычисления силы тока в поле Напряжение ввести ю.5, т. е. разделить целую и дробную часть точкой, то в результате щелчка на кнопке Вычислить на экране появится окно с сообщением об ошибке (рис. 2.34).
Рис. 2.34. Пример окна с сообщением об ошибке времени выполнения (программа запущена из Windows)
Причина возникновения ошибки в следующем. В тексте программы дробная часть числа от целой отделяется точкой. При вводе данных в поле редактирования пользователь может отделить дробную часть числа от целой точкой или запятой. Какой из этих двух символов является правильным, зависит от настройки Windows.
Если в настройке Windows указано, что разделитель целой и дробной частей числа — запятая (для России это стандартная установка), а пользователь использовал точку (ввел в поле Напряжение (Edit1) строку 10.5), то при выполнении инструкции
u = StrToFloat(Editl->Text);
возникнет исключение, т. к. при указанной настройке Windows содержимое поля редактирования и, следовательно, аргумент функции StrToFloat не является изображением дробного числа.
Если программа запущена из среды разработки, то при возникновении исключения выполнение программы приостанавливается и на экране появляется окно с сообщением об ошибке и ее типе. В качестве примера на рис. 2.35 приведено окно сообщения о возникновении исключения, причина которого заключается в том, что строка, введенная пользователем в поле редактирования, не является дробным числом.
Рис. 2.35. Пример сообщения о возникновении исключения (программа запущена из C++ Builder)
После возникновения исключения и щелчка на кнопке ОК в диалоговом окне Debugger Exception Notification (рис. 2.35) выполнение программы можно прервать или, несмотря на возникшую ошибку, продолжить. Чтобы прервать выполнение программы, надо в меню Run выбрать команду Program Reset, чтобы продолжить — команду Step Over.
Обработку исключений берет на себя автоматически добавляемый в выполняемую программу код, который обеспечивает, в том числе, и вывод информационного сообщения. Вместе с тем C++ Builder дает возможность программе самой выполнить обработку исключения.
Инструкция обработки исключения выглядит так:
// здесь инструкции, выполнение которых может вызвать исключение
catch ( Тип
Автоматическая синхронизация времени при запуске компьютера, ноутбука
Ошибочный образ не предназначен для выполнения
Основной характеристикой исключения является его тип. В табл. 2.12 перечислены наиболее часто возникающие исключения и указаны причины, которые могут привести к их возникновению.
Таблица 2.12. Типичные исключения
В программе вычисления силы тока исключения могут возникнуть при выполнении преобразования строк, введенных в поля редактирования, в числа и при вычислении величины тока. Исключение EConvertError возникнет, если пользователь неправильно введет числа в поля редактирования: например, разделит целую и дробную части точкой. Исключение EZeroDivide возникнет, если пользователь задаст величину сопротивления равной нулю. В листинге 2.3 приведена функция обработки события Onclick на командной кнопке Вычислить. В функцию включены инструкции обработки исключений.
Листинг 2.3. Обработка исключений
void __fastcall TForml::ButtonlClick(TObject *Sender)
float u; // напряжение
float r; // сопротивление
float i; // ток
// получить данные из полей ввода
// возможно исключение — ошибка преобразования строки в число
u = StrToFloat(Editl->Text); г = StrToFloat(Edit2->Text);
catch (EConvertError При вводе дробных чисел используйте запятую.»);
return;
// вычислить ток
// возможно исключение — деление на ноль
i = u/r;
catch (EZeroDivide Величина сопротивления не должна быть равна нулю»);
Edit2->SetFocus(); // курсор а поле Сопротивление
return; >
// вывести результат в поле метки
Label4->Caption = «Ток : » + FloatToStrF(i,ffGeneral,7,3); >
В приведенной функции для вывода сообщений в случае возникновения исключений использована функция ShowMessage, которая выводит на экран окно с текстом и командной кнопкой ОК. Инструкция вызова функции ShowMessage выглядит так: ShowMessage(Сообщение) ;
Где сообщение — строковая константа (текст, который надо вывести). На рис. 2.36 приведен вид окна сообщения, полученного в результате выполнения инструкции: ShowMessage(«Величина сопротивления не должна быть равна нулю.»);
Рис. 2.36. Сообщение, выведенное функцией ShowMessage
Следует обратить внимание на то, что в заголовке окна сообщения, выводимого функцией ShowMessage, указывается название приложения. Название приложения задается на вкладке Application окна Project Options. Если название приложения не задано, то в заголовке будет имя исполняемого файла.
Для вывода сообщений можно использовать функцию MessageDig. Функция MessageDig позволяет поместить в окно с сообщением один из стандартных значков, например «Внимание», задать количество и тип командных кнопок и определить, какую из кнопок нажал пользователь. На рис. 2.37 приведено окно, выведенное в результате выполнения инструкции
MessageDig(«Файл c:Xtemp\test.txt будет удален.»,
mtWarning, TMsgDlgButtons() « mbOK « mbCancel, 0);
Рис. 2.37. Пример окна сообщения
Значение функции MessageDig — число, проверив значение которого можно определить, выбором какой командной кнопки был завершен диалог. В общем виде обращение к функции MessageDig выглядит так:
Выбор:= MessageDig(Сообщение, Тип, Кнопки, КонтекстСправки)
- сообщение — текст сообщения;
- Тип — тип сообщения. Сообщение может быть информационным, предупреждающим или сообщением о критической ошибке. Каждому типу сообщения соответствует определенный значок. Тип сообщения задается именованной константой (табл. 2.13);
- кнопки — кнопки, отображаемые в окне сообщения. Задаются операцией включения в множество элементов — констант (табл. 2.14).
- контекстСправки — параметр, который определяет раздел справочной информации, который появится на экране, если пользователь нажмет клавишу . Если вывод справочной информации не предусмотрен, то значение параметра должно быть равно нулю.
Таблица 2.13. Константы, определяющие тип сообщения
Таблица 2.14. Константы, определяющие кнопки в окне сообщения
Кроме приведенных констант можно использовать константы mbOkCancel, mbYesNoCancel и mbAbortRetryignore. Эти константы определяют наиболее часто используемые в диалоговых окнах комбинации командных кнопок.
Значение, возвращаемое функцией MessageDig (табл. 2.15), позволяет определить, какая из командных кнопок была нажата пользователем.
Таблица 2.15. Значения функции MessageDlg
Fore kc .ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий
Источник: www.ci-builder.ru