Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2017, 18:57   #1
BurningHex
Новичок
Джуниор
 
Регистрация: 20.06.2017
Сообщений: 3
По умолчанию Первый простой калькулятор.. и сразу две проблемы

В общем только начал изучать C++, решил немного на практике протестить то что уже узнал. Проблемы две: первая заключается в том что какую бы операцию я не выплнял в добавок к ней всегда отдельно выполняется еще и деление. стественно ошибка какая-то наиглупейшая, но я в упор не вижу. И вторая проблема: не получается воспользоваться функциями из math. Как правильно все-таки для них написать условие?

Код:
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
	float y,z,res;
	char b="+"||"-"||"*"||"/"||"sqrt"||"pow"; 
	cin >> y;
	cin >> b;
	cin >> z;
	if (b=='/');{
		res=y/z;
		cout << y <<b << z <<"="<<res <<endl;
	}
	if (b=='*'){
		res=y*z;
		cout << y <<b << z <<"="<<res <<endl;
	}
	if (b=='+'){
		res=y+z;
		cout << y <<b << z <<"="<<res<< endl;
	}
	if (b=='-'){
		res=y-z;
		cout << y <<b << z <<"="<<res<< endl;
	}
	if (b=='sqrt'){
		res=sqrt(y);
		cout << b << y <<"="<<res<< endl;
	}
	if (b=='pow'){
		res=pow(y,z);
		cout << b<<y<<z<<"="<<res<<endl;
	}

}
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 21.06.2017 в 09:16.
BurningHex вне форума Ответить с цитированием
Старый 20.06.2017, 19:09   #2
alexzk
Форумчанин
 
Регистрация: 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.
alexzk вне форума Ответить с цитированием
Старый 20.06.2017, 19:14   #3
BurningHex
Новичок
Джуниор
 
Регистрация: 20.06.2017
Сообщений: 3
По умолчанию

В том то и дело что все компилируется(dev cpp), получается что для корня и квадрата нужно по идее другой тип данных использовать?
BurningHex вне форума Ответить с цитированием
Старый 20.06.2017, 19:15   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от BurningHex Посмотреть сообщение
В том то и дело что все компилируется(dev cpp), получается что для корня и квадрата нужно по идее другой тип данных использовать?
Походу у вас происходит срыв стека, когда вы вводите "sqrt", т.к. b может хранить только 1 символ, а ввели 4 + 1 (нуль) - это все - не определенное поведение, будет по разному глючить на разных компиляторах и ОС.
alexzk вне форума Ответить с цитированием
Старый 20.06.2017, 19:18   #5
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

.....а если вы исправите скажем так

if (b=="sqrt"){

то это всегда будет не работать, т.к. строк НЕТ, это АДРЕСА массивов байт, а они однозначно разные. Для сравнения строк нужно использовать strcmp
alexzk вне форума Ответить с цитированием
Старый 20.06.2017, 19:24   #6
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

..существует стандартная библиотека, которая содержит класс строка std::string
При ее использовании, будет работать, как ожидалось, как в других языках, т.е.

std::string b;

и дальше поменять все одинарные на двойные.

А насчет этого:
char b="+"||"-"||"*"||"/"||"sqrt"||"pow";

что тут происходит: берутся адреса строк - точнее массивов байт, дополненых нулем (всех в кавычках) - это некие числа не ноль, над ними выполняется логическое ИЛИ (знак ||), что дает true, которое преобразовывается в char, что скорее всего даст 1.

Последний раз редактировалось alexzk; 20.06.2017 в 19:29.
alexzk вне форума Ответить с цитированием
Старый 20.06.2017, 19:32   #7
BurningHex
Новичок
Джуниор
 
Регистрация: 20.06.2017
Сообщений: 3
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
..существует стандартная библиотека, которая содержит класс строка std::string
При ее использовании, будет работать, как ожидалось, как в других языках, т.е.

std::string b;

и дальше поменять все одинарные на двойные.

А насчет этого:
char b="+"||"-"||"*"||"/"||"sqrt"||"pow";

что тут происходит: берутся адреса строк - точнее массивов байт, дополненых нулем (всех в кавычках) - это некие числа не ноль, над ними выполняется логическое ИЛИ, что дает true, которое преобразовывается в char, что скорее всего даст 1.
Спасибо попробую с помощью std::string.
А как тогда корректнее ообозначить знаки действий? в принципе как не странно это работает(/*+-) единственное что при умножении например после результата умножения происходит отдельно еще и деление и так с любым действием, выглядит так:
100*2=200
100*2=50
деление выполняется нормально.
BurningHex вне форума Ответить с цитированием
Старый 20.06.2017, 21:20   #8
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Сначала исправьте, потом разбирайтесь. Срыв стека может проявлятся как угодно. А там вообще не ясно, как оно компилится.
alexzk вне форума Ответить с цитированием
Старый 21.06.2017, 09:09   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
первая заключается в том что какую бы операцию я не выплнял в добавок к ней всегда отдельно выполняется еще и деление
Код:
if (b=='/');{
Цитата:
стественно ошибка какая-то наиглупейшая, но я в упор не вижу
чтобы увидеть отделяйте условия пробелами или новой строкой
Код:
if (b=='/'); {
Код:
if (b=='/');
{
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.06.2017 в 09:17.
evg_m на форуме Ответить с цитированием
Старый 21.06.2017, 09:34   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
чтобы увидеть отделяйте условия пробелами или новой строкой
...и включите все предупреждения компилятора.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
первый простой сайт 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