Простой калькулятор рациональных чисел на C++

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Oxidous
Сообщения: 15
Зарегистрирован: 24 сен 2015, 13:53

Всем доброго времени суток,
Только начал изучать C++ и задали вот такое задание:

Напишите программу, которая позволяет совершать математические действия (сложение, вычитание, умножение, деление, сравнение) с рациональными числами.
Создайте класс для рациональных чисел.Данные класса - рациональные числа ( числитель и знаменатель). В классе должны быть такие методы: сложение, вычитание, умножение, деление, сравнение (больше, меньше, равно), отрицательное (умножение на -1). Данные методы должны возвращать рациональные числа.
Операция сложения a + b при помощи этого класса будет выглядеть так: a.sloz(b);
Так же в классе обязательно должны быть методы: ввод и вывод.

В общем, нужно написать программу, вида:
Ввожу первое рационально число (допустим, 3/4)
Ввожу второе рациональное число(допустим 16/33)
Выводится результат сложения, вычитания, умножения, деления, сравнения и умножения на -1 введённых рациональных чисел.

С целыми числами никаких проблем нет абсолютно, довольно быстро написал консольную программу,но нужно,чтоб было с рациональными числами. Потому очень прошу помочь.

Вот то,что я написал с целыми числами:

Код: Выделить всё

#include<iostream>
using namespace std;

class MyCalc
{
	private: 
	int a;
	int b;
	
	public: 
	
	void vvod_vivod() 
	{
		cout << "Введите первое число: ";
		cin >> a;
		cout << " " << endl; 
		cout << "Введите второе число: ";
		cin >> b;
		cout << " " << endl;
	}
	void sloz()
	{
		cout << "Сложение " << "(" << a << " + " << b << ")" << " = " << a + b << endl;
	}
	void vicit()
	{
		cout << "Вычитание " << "(" << a << " - " << b << ")" << " = " << a - b << endl;
	}
	void umnoz()
	{
		cout << "Умножение " << "(" << a << " * " << b << ")" << " = " << a * b << endl;
	}
	void delen()
	{
		cout << "Деление " << "(" << a << " / " << b << ")" << " = " << a / b << endl;
	}
	void sravn()
	{
		if (a==b) cout << a << " равно "<< b << endl;  
                if (a<b)   cout << a << " меньше "<< b << endl;  
                if (a>b)   cout << a << " больше "<< b << endl; 
	}
	void otric()
	{
		cout << "Отрицательно: " << "((" << a << " * " << b << ")" << " * -1)"<< " = " << (a * b) * -1 << endl;
	}
};

int main()
{
	setlocale(0, ""); 
	
	cout << "Калькулятор целых чисел.\n" << endl;
	
	MyCalc c1; 
	
	c1.vvod_vivod();
	c1.sloz();
	c1.vicit();
	c1.umnoz();
	c1.delen();
	c1.sravn();
	c1.otric();
	cout << " " << endl;
  
	system("pause"); 
	return 0; 
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ну, вообще-то, это совсем не то, что требовалось по заданию. В задании требуется создать класс для описания числа (сейчас не важно рационального или целого), а не для описания "калькулятора" чисел. Центральная сущность выбрана неверно. Это видно хотя бы потому, что вызов метода sloz из твоей программы и из примера, данного в задании, отличаются сигнатурой.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Да и вообще операции ввода/вывода в классах - это минимум дурной тон. Класс должен заниматься только тем, для чего предназначен. В данном случае - изменять значения своих полей через вызовы методов. Остальная нагрузка ложится на вызывающий код.
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Din666
Сообщения: 52
Зарегистрирован: 17 июл 2015, 13:25
Откуда: Moscow
Контактная информация:

вот не перестаю удивляться, и где же учат делать system("pause")? Ведь этот аццкий вызов загружает командный интерпретатор через форк(экзек), блокирует сигналы, делает много всего прочего не нужного в такой маленькой программе, и уже только потом в нем(интерпретаторе) выполняет команду.!!! ))
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Поддерживаю. Меня самого такой вызов в демонстрационных программах всегда ввергал в ужас. Достаточно ведь сделать getch(). Нет же, вместо этого создадим отдельный процесс, а в нём вызовем pause.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Oxidous
Сообщения: 15
Зарегистрирован: 24 сен 2015, 13:53

Всем доброго времени суток :)
Уже во всём разобрался и всё сделал. И спасибо за замечания, заменил на getche(); :)
Ответить