|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
20.06.2017, 18:57 | #1 |
Новичок
Джуниор
Регистрация: 20.06.2017
Сообщений: 3
|
Первый простой калькулятор.. и сразу две проблемы
В общем только начал изучать C++, решил немного на практике протестить то что уже узнал. Проблемы две: первая заключается в том что какую бы операцию я не выплнял в добавок к ней всегда отдельно выполняется еще и деление. стественно ошибка какая-то наиглупейшая, но я в упор не вижу. И вторая проблема: не получается воспользоваться функциями из math. Как правильно все-таки для них написать условие?
Код:
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ) Модератор Последний раз редактировалось Serge_Bliznykov; 21.06.2017 в 09:16. |
20.06.2017, 19:09 | #2 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Это че?
char b="+"||"-"||"*"||"/"||"sqrt"||"pow"; вобще результат всего этого будет равен 1 (хотя зависит от компилятора), но это будет какое-то число не ноль. Это вообще компилируется? if (b=='sqrt'){ if (b=='pow'){ ?? GCC на такое пошлет матом. В С/С++ строки выделяются двойными кавычками. В одинарных можно заключать 1 символ = 1 байт. Понятия "строка" в С как такового нет. Все что вы запишите в "ыввыфвфы" - это массив байт заданных, т.о. это выражение в целом есть указатель на массив байт, автоматически дополненый нулем в конце, в случае типа: const char* pointer = "abrvalg"; Походу у вас происходит срыв стека, когда вы вводите "sqrt", т.к. b может хранить только 1 символ, а ввели 4 + 1 (нуль) - это все - не определенное поведение, будет по разному глючить на разных компиляторах и ОС. Последний раз редактировалось alexzk; 20.06.2017 в 19:14. |
20.06.2017, 19:14 | #3 |
Новичок
Джуниор
Регистрация: 20.06.2017
Сообщений: 3
|
В том то и дело что все компилируется(dev cpp), получается что для корня и квадрата нужно по идее другой тип данных использовать?
|
20.06.2017, 19:15 | #4 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Походу у вас происходит срыв стека, когда вы вводите "sqrt", т.к. b может хранить только 1 символ, а ввели 4 + 1 (нуль) - это все - не определенное поведение, будет по разному глючить на разных компиляторах и ОС.
|
20.06.2017, 19:18 | #5 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
.....а если вы исправите скажем так
if (b=="sqrt"){ то это всегда будет не работать, т.к. строк НЕТ, это АДРЕСА массивов байт, а они однозначно разные. Для сравнения строк нужно использовать strcmp |
20.06.2017, 19:24 | #6 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
..существует стандартная библиотека, которая содержит класс строка std::string
При ее использовании, будет работать, как ожидалось, как в других языках, т.е. std::string b; и дальше поменять все одинарные на двойные. А насчет этого: char b="+"||"-"||"*"||"/"||"sqrt"||"pow"; что тут происходит: берутся адреса строк - точнее массивов байт, дополненых нулем (всех в кавычках) - это некие числа не ноль, над ними выполняется логическое ИЛИ (знак ||), что дает true, которое преобразовывается в char, что скорее всего даст 1. Последний раз редактировалось alexzk; 20.06.2017 в 19:29. |
20.06.2017, 19:32 | #7 | |
Новичок
Джуниор
Регистрация: 20.06.2017
Сообщений: 3
|
Цитата:
А как тогда корректнее ообозначить знаки действий? в принципе как не странно это работает(/*+-) единственное что при умножении например после результата умножения происходит отдельно еще и деление и так с любым действием, выглядит так: 100*2=200 100*2=50 деление выполняется нормально. |
|
20.06.2017, 21:20 | #8 |
Форумчанин
Регистрация: 12.04.2017
Сообщений: 889
|
Сначала исправьте, потом разбирайтесь. Срыв стека может проявлятся как угодно. А там вообще не ясно, как оно компилится.
|
21.06.2017, 09:09 | #9 | ||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,515
|
Цитата:
Код:
Цитата:
Код:
Код:
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 21.06.2017 в 09:17. |
||
21.06.2017, 09:34 | #10 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,493
|
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
первый простой сайт | halloland | HTML и CSS | 3 | 21.01.2014 15:10 |
Как открыть сразу две формы | mymedia | C++ Builder | 7 | 10.12.2011 22:18 |
Простой калькулятор | Jurek | Общие вопросы Delphi | 5 | 12.10.2011 08:12 |
Простой тест с выводом результата сразу после ответа на вопрос | demiancz | Общие вопросы Delphi | 2 | 24.06.2011 22:15 |
Появляется сразу две формы при старте... | TwiX | Общие вопросы Delphi | 4 | 13.02.2010 03:22 |