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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2017, 15:22   #1
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию Типа калькулятор

Здравствуйте!
Подскажите пожалуйста, почему у меня калькулятор выдаёт итоговый результат равный "1" при таких вот данных
числитель первой дроби = 2
знаменатель первой дроби = 3
числитель второй дроби = 2
знаменатель второй дроби = 3
знак между дробями "+"
Проводил отладку смотрел по действиям, но черт возьми в последний момент s=1!!!!
Код:
#include<iostream>
#include<conio.h>
using namespace std;
struct drob
{
	int chis, znam;
};
drob plus (drob, drob);
drob minus(drob, drob);
drob umnozh(drob, drob);
drob del (drob, drob);
int main()
{
	setlocale(LC_ALL,"rus");
	drob d1,d2,d3;
	char ch;
	float s=0;
	cout<<"Программа-калькулятор для двух дробей.\nВведите значение числителя первой дроби: ";
	cin>>d1.chis;
	cout<<"\nВведите значение знаменателя первой дроби: ";
	cin>>d1.znam;
	while(d1.znam==0)
	{
		cout<<"\nЗначение знаменателя не должно быть равно нулю.\nПопробуйте снова:";
		cin>>d1.znam;
	}
	cout<<"\nВведите значение числителя второй дроби: ";
	cin>>d2.chis;
	cout<<"\nВведите значение знаменателя второй дроби: ";
	cin>>d2.znam;
	while(d2.znam==0)
	{
		cout<<"\nЗначение знаменателя не должно быть равно нулю.\nПопробуйте снова:";
		cin>>d2.znam;
	}
	cout<<"\nВыберите действие, которое вы хотите произвести между дробями:\n +, -, *, /.\n";
	cin>>ch;
	switch(ch)
	{
	case '+': d3=plus(d1,d2);
		break;
	case '-': d3=minus(d1,d2);
		break;
	case'*': d3=umnozh(d1,d2);
		break;
	case'/': d3=del(d1,d2);
		break;
	}
	cout<<"Результат вычисления двух дробей равен "<<d3.chis<<"/"<<d3.znam;
	s=d3.chis/d3.znam;
	cout<<"\nИтоговый результат:"<<s;
	getch();
	return 0;
}
drob plus (drob d1, drob d2)
{
	drob d3;
	d3.chis=d1.chis*d2.znam+d2.chis*d1.znam;
	d3.znam=d1.znam*d2.znam;
	return d3;
}
drob minus (drob d1, drob d2)
{
	drob d3;
	d3.chis=d1.chis*d2.znam-d2.chis*d1.znam;
	d3.znam=d1.znam*d2.znam;
	return d3;
}
drob umnozh (drob d1, drob d2)
{
	drob d3;
	d3.chis=d1.chis*d2.chis;
	d3.znam=d1.znam*d2.znam;
	return d3;
}
drob del (drob d1, drob d2)
{
	drob d3;
	d3.chis=d1.chis*d2.znam;
	d3.znam=d1.znam*d2.chis;
	return d3;
}

Последний раз редактировалось Аватар; 30.04.2017 в 16:25.
KAMLS вне форума Ответить с цитированием
Старый 30.04.2017, 15:34   #2
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

Округляется результат. Замените тип данных числителя и знаменателя в структуре на double и вводите
2.0,
3.0

Последний раз редактировалось Haric_110; 30.04.2017 в 15:37.
Haric_110 вне форума Ответить с цитированием
Старый 30.04.2017, 15:35   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Потому что при деление целого на целое получается целое. Приводите хотя бы одно из них к вещественному.
p51x вне форума Ответить с цитированием
Старый 30.04.2017, 16:05   #4
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Но ведь s у меня вещественное, там операция присвоения происходит.. Как так то?..
KAMLS вне форума Ответить с цитированием
Старый 30.04.2017, 16:13   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Сначала произойдет деление целого на целое, а потом целый результат приведется к вещественному.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 30.04.2017, 16:22   #6
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Ясно. Спасибо, сделал. float применил, всё работает как надо. (кстати, вводил простые цифры, не 2.0 и 3.0)

Последний раз редактировалось KAMLS; 30.04.2017 в 16:26. Причина: уточнение
KAMLS вне форума Ответить с цитированием
Старый 30.04.2017, 16:47   #7
Haric_110
Форумчанин
 
Регистрация: 03.03.2013
Сообщений: 102
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Ясно. Спасибо, сделал. float применил, всё работает как надо. (кстати, вводил простые цифры, не 2.0 и 3.0)
Ну, если тип переменной задан, то можно вводить простые, да. Но в выражениях, содержащих отношение необходимо, чтобы хотя бы одно из операндов (чисел) отношения было в формате double (1.0) или float (1f). Это на будущее)

Последний раз редактировалось Haric_110; 30.04.2017 в 16:49.
Haric_110 вне форума Ответить с цитированием
Старый 30.04.2017, 16:57   #8
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Цитата:
Сообщение от Haric_110 Посмотреть сообщение
Ну, если тип переменной задан, то можно вводить простые, да. Но в выражениях, содержащих отношение необходимо, чтобы хотя бы одно из операндов (чисел) отношения было в формате double (1.0) или float (1f). Это на будущее)
Спасибо, я действительно, только учусь))
KAMLS вне форума Ответить с цитированием
Старый 30.04.2017, 17:05   #9
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Круты чуваки, всегда приятно видеть реальную помощь и не хотение халявы)
alexzk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать из числа типа real число типа integer? gylayko Помощь студентам 6 15.09.2012 11:41
Возможно ли в массив типа char записать первым элементом значение переменной типа float? Green Gin Общие вопросы C/C++ 2 05.12.2011 01:50
Каким образом сохранить цвет. Типа в переменную типа TColor ? serres C++ Builder 5 07.12.2010 16:19
Запись числа типа инт в ячейку двумерного массива типа char AxenicX Помощь студентам 1 25.09.2009 00:35