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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2015, 23:01   #1
Oxidous
Пользователь
 
Регистрация: 31.08.2007
Сообщений: 28
По умолчанию Простой калькулятор рациональных чисел на C++

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

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

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

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

Код:
#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; 
}
Oxidous вне форума Ответить с цитированием
Старый 24.09.2015, 02:37   #2
FoxyFire
Пользователь
 
Регистрация: 23.09.2015
Сообщений: 11
По умолчанию

Я тоже изучаю только второй месяц, поэтому если шо извиняй. И критике буду рад.
Первый вариант

Код:
#include <iostream>
using namespace std;
class raz
{
	int chis, znam;
public:
	raz()//Пустой конструктор
	{
		chis = 0;
		znam = 0;
	}
	raz(int a, int b)//Конструктор с параметрами
	{
		chis = a;
		znam = b;
	}
	raz plus(raz x)//Сложение
	{
		raz tmp;
		tmp.chis = this -> chis * x.znam + this -> znam * x.chis;
		tmp.znam = this -> znam * x.znam;
		return socr(tmp);
	}
	raz minus(raz x)//Разность
	{
		raz tmp;
		tmp.chis = this -> chis * x.znam - this -> znam * x.chis;
		tmp.znam = this -> znam * x.znam;
		return socr(tmp);
	}
	raz umn(raz x)//Произведение
	{
		raz tmp;
		tmp.chis = this -> chis * x.chis;
		tmp.znam = this -> znam * x.znam;
		return socr(tmp);
	}
	raz del(raz x)//Деление
	{
		raz tmp;
		tmp.chis = this -> chis * x.znam;
		tmp.znam = this -> znam * x.chis;
		return socr(tmp);
	}
	bool bol(raz x)//>
	{
		return this -> chis * x.znam > this -> znam * x.chis;
	}
	bool men(raz x)//<
	{
		return this -> chis * x.znam < this -> znam * x.chis;
	}
	bool rav(raz x)//==
	{
		return this -> chis * x.znam == this -> znam * x.chis;
	}
	raz socr(raz x)//Сокращение дроби
	{
		int zn = 1;
		if (x.chis < 0)
			zn = -1;
		for (int i = 2; i <= zn*x.chis; i++)
			if (!(x.chis%i) && !(x.znam%i))
			{
				x.chis /= i;
				x.znam /= i;
				return socr(x);
			}
		return x;
	}
	void show()
	{
		cout << chis <<"/" << znam;
	}
};
void main()
{
	raz a(1, 2), b(3,4), c;
	c = a.plus(b);
	c.show();
	cout << endl;
	c = a.minus(b);
	c.show();
	cout << endl;
	c = a.umn(b);
	c.show();
	cout << endl;
	c = a.del(b);
	c.show();
	cout << endl << (a.bol(b)) << (a.men(b)) << (a.rav(b));
	system("pause");
}
FoxyFire вне форума Ответить с цитированием
Старый 24.09.2015, 02:37   #3
FoxyFire
Пользователь
 
Регистрация: 23.09.2015
Сообщений: 11
По умолчанию

Второй вариант:

Код:
#include <iostream>
using namespace std;
class raz
{
	int chis, znam;
public:
	raz()//Пустой конструктор
	{
		chis = 0;
		znam = 0;
	}
	raz(int a, int b)//Конструктор с параметрами
	{
		chis = a;
		znam = b;
	}
	const raz & operator+(const raz & x)//Сложение
	{
		raz tmp;
		tmp.chis = this -> chis * x.znam + this -> znam * x.chis;
		tmp.znam = this -> znam * x.znam;
		return socr(tmp);
	}
	const raz & operator-(const raz & x)//Разность
	{
		raz tmp;
		tmp.chis = this -> chis * x.znam - this -> znam * x.chis;
		tmp.znam = this -> znam * x.znam;
		return socr(tmp);
	}
	const raz & operator*(const raz & x)//Произведение
	{
		raz tmp;
		tmp.chis = this -> chis * x.chis;
		tmp.znam = this -> znam * x.znam;
		return socr(tmp);
	}
	const raz & operator/(const raz & x)//Деление
	{
		raz tmp;
		tmp.chis = this -> chis * x.znam;
		tmp.znam = this -> znam * x.chis;
		return socr(tmp);
	}
	bool operator>(const raz & x)//>
	{
		return this -> chis * x.znam > this -> znam * x.chis;
	}
	bool operator<(const raz & x)//<
	{
		return this -> chis * x.znam < this -> znam * x.chis;
	}
	bool operator==(const raz & x)//==
	{
		return this -> chis * x.znam == this -> znam * x.chis;
	}
	raz socr(raz x)
	{
		int zn = 1;
		if (x.chis < 0)
			zn = -1;
		for (int i = 2; i <= zn*x.chis; i++)
			if (!(x.chis%i) && !(x.znam%i))
			{
				x.chis /= i;
				x.znam /= i;
				return socr(x);
			}
		return x;
	}
	void show()
	{
		cout << chis <<"/" << znam;
	}
};
void main()
{
	raz a(1, 2), b(3,4), c;
	c = a+b;
	c.show();
	cout << endl;
	c = a-b;
	c.show();
	cout << endl;
	c = a*b;
	c.show();
	cout << endl;
	c = a/b;
	c.show();
	cout << endl << (a>b) << (a<b) << (a==b);
	system("pause");
}
FoxyFire вне форума Ответить с цитированием
Старый 24.09.2015, 08:27   #4
Oxidous
Пользователь
 
Регистрация: 31.08.2007
Сообщений: 28
По умолчанию

Огромное спасибо, обязательно вечером потестирую.
Кстати,а ты на чём писал? Мой DEV C++ ругается,что main не int, а void. Ежели исправить,то компиляция проходит, а при отладке DEV C++ зависает и просто аварийно завершает свою работу ))
В Visual Studio всё прекрасно работает. Только вот нету ввода данных с клавиатуры.Хотелось бы, чтоб можно было вводить дроби (например 3/4 или 17/18), а затем производить с ними мат. действия и сравнение.

Последний раз редактировалось Oxidous; 24.09.2015 в 09:55.
Oxidous вне форума Ответить с цитированием
Старый 24.09.2015, 17:13   #5
FoxyFire
Пользователь
 
Регистрация: 23.09.2015
Сообщений: 11
По умолчанию

Писал на VS2010Express.
Для ввода с клавиатуры добавь метод:

Код:
void in()
	{
		cout << "Введите числитель: ";
		cin >> chis;
		cout << "Введите знаменатель: ";
		cin >> znam;
	}
А main переделай как тебе удобно, к примеру вот так:
Код:
void main()
{
	raz a, b, c;
	cout << "Enter a:\n";
	a.in();
	cout << "Enter b:\n";
	b.in();
	while (true)
	{
		cout << "Enter +,-,*,/,<,>,=, 0 - Exit: ";
		char select;
		select = getch();
		cout << endl;
		a.show();
		cout << " " << select << " ";
		b.show();
		cout << " = ";
		switch (select)
		{
		case '+': c = a.plus(b);
			break;
		case '-': c = a.minus(b);
			break;
		case '*': c = a.umn(b);
			break;
		case '/': c = a.del(b);
			break;
		case '<': cout << a.men(b) << endl;
			break;
		case '>': cout << a.bol(b) << endl;
			break;
		case '=': cout << a.rav(b) << endl;
			break;
		case '0': return;
		}
		if (select == '+' || select == '-' || select == '*' || select == '/')
		{
			c.show();
			cout << endl;
		}
		system("pause");
	}
}
FoxyFire вне форума Ответить с цитированием
Старый 25.09.2015, 09:04   #6
Oxidous
Пользователь
 
Регистрация: 31.08.2007
Сообщений: 28
По умолчанию

Ты просто ЧЕЛОВЕЧИЩЕ! Спасибо тебе огромное Я вот почему-то туплю,хотя умом и понимаю,что это простое задание
А ты бы не мог мне полный код вывести? С учётом void in() и последнего main. Что-то я собираю,но не компилится он в Visual Studio, ошибки выдаёт,хотя void in() добавил в public и void main() тоже добавил после основного кода...Совсем я туплю...
Oxidous вне форума Ответить с цитированием
Старый 10.10.2015, 22:55   #7
Oxidous
Пользователь
 
Регистрация: 31.08.2007
Сообщений: 28
По умолчанию

2 FoxyFire: Огромное тебе спасибо,действительно очень и очень помог. С вводом разобрался и программа действительно работает. Выполняет все нужные действия с рациональными числами Только вот сравнение выдаёт булевые ответы 0(false) и 1(true),то есть, в зависимости от результата того,что введём и сравним. А как можно было бы сделать сравнение,чтоб выдавало не всё 3 результата (больше,меньше,равно), а только единственный верный (true)? И чтоб вывод был,например,таким: ввожу первую дробь 2/3,а вторую 3/4. Выдаёт - 2/3 меньше 3/4.
Oxidous вне форума Ответить с цитированием
Старый 12.10.2015, 16:19   #8
Oxidous
Пользователь
 
Регистрация: 31.08.2007
Сообщений: 28
По умолчанию

Со всем разобрался и сделал как нужно. Ещё раз спасибо за помощь
Oxidous вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функции. Пусть s- множество всех рациональных чисел, представимых в виде несократимых дробей m/n veronika55214 Паскаль, Turbo Pascal, PascalABC.NET 0 17.12.2013 19:09
Простой калькулятор в Visual C++ Женька Good Помощь студентам 1 30.03.2012 22:40
простой калькулятор kostya-boyazhov Общие вопросы C/C++ 2 14.11.2011 10:59
Простой калькулятор Jurek Общие вопросы Delphi 5 12.10.2011 08:12
Сравнение 2-х рациональных чисел ManCOM Python 3 06.01.2011 13:10