Top.Mail.Ru
Ответы

Что можно добавить к этой постановке задачи на C++?учитывая мою задачу

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
 // ConsoleApplication3.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;

class Natural_Fraction
{
private:
	int nomenator; // числитель
	int denominator;// знаменатель

public:
	Natural_Fraction(string num) //Конструктор класса, принимающий на вход строчку вила '1/2'
	{
		string _nomenator = "";
		string _denomenator = "";
		int i = 0;
		while (num[i] != '/')
		{
			_nomenator += num[i]; // собираем числитель
			i++;
		}

		i++;

		for (i; i < num.length(); i++)
		{
			_denomenator += num[i];
		}

		nomenator = atoi(_nomenator.c_str());//atoi-приведение типов. Строковый тип присваиваем переменной типа int
		denominator = atoi(_denomenator.c_str());

	}

	Natural_Fraction(int _nomenator, int _denominator) // Конструктор класса, принимающий на вход числитель и знаменатель в виде чисел
	{
		nomenator = _nomenator;
		denominator = _denominator;
	}
	Natural_Fraction(int number)//Конструктор класса, принимающий на вход целое число и переводящий его в дробь
	{
		nomenator = number;
		denominator = 1;
	}

	void Print()
	{
		cout << nomenator<<"/"<<denominator;
	}

	
	int NOD() //наибольший общий делитель
	{
		int a = abs(nomenator);//abs-модуль числа
		int b = abs(denominator);
		while (a > 0 && b > 0)

			if (a > b)
				a %= b;

			else
				b %= a;

		return a + b;
	}
	
	void Plus(Natural_Fraction nf)
	{
		int new_denom = nf.denominator * denominator;
		nomenator = nomenator * nf.denominator;
		nf.nomenator = nf.nomenator * denominator;
		nomenator = nomenator + nf.nomenator;
		denominator = new_denom;
		CutDown();//максимально сокращаем дробь
	}

	void Minus(Natural_Fraction nf)
	{
		int new_denom = nf.denominator * denominator;
		nomenator = nomenator * nf.denominator;
		nf.nomenator = nf.nomenator * denominator;
		nomenator = nomenator - nf.nomenator;
		denominator = new_denom;
		CutDown();//максимально сокращаем дробь
	}

	void Multiply(Natural_Fraction nf)
	{
		int new_denom = nf.denominator * denominator;
		nomenator = nomenator * nf.nomenator;
		denominator = new_denom;
		CutDown();
	}

	void Division(Natural_Fraction nf)
	{
		nomenator = nomenator * nf.denominator;
		denominator =denominator*nf.nomenator;
		CutDown();
	}
	void CutDown()//сокращает дробь по НОД
	{
		int z = NOD();
		nomenator = nomenator / z;
		denominator = denominator / z;
	}
};
int main()
{
	setlocale(LC_ALL, "Russian"); // Переводит вывод консоли на русский язык
	Natural_Fraction nf("1/2");
	Natural_Fraction nf2("1/3");
	Natural_Fraction nf3(5);
	cout << "Первая дробь ";
	nf.Print();
	cout << endl << "Вторая дробь ";
	nf2.Print();
	cout << endl << "Целое число в виде дроби ";
	nf3.Print();

	nf.Plus(nf2);
	cout <<endl<< "Первая + Вторая= ";
	nf.Print();

	nf.Plus(nf3);
	cout << endl << "Первая + Целое число= ";
	nf.Print();

	nf.Multiply(nf2);
	cout << endl << "Первая * Вторая = ";
	nf.Print();
}; 
Дополнен

я там основное указал, ну мне еще чуть-чуть воды можете добавить

По дате
По рейтингу
Аватар пользователя
Новичок

CutDown() надо вызывать и в конструкторах - мало ли, какие числа будут переданы.

В CutDown() надо добавить проверку знаков:

123456789
 void CutDown() {
  if (denominator < 0) {
    nomenator = -nomenator;
    denominator = -denominator;
  }
  int z = NOD(); 
  nomenator = nomenator / z; 
  denominator = denominator / z; 
} 

Это числитель может быть отрицательным, а знаменатель всегда должен быть положителен.

Аватар пользователя
Ученик

я с другого аккаунта пишу, на это пофиг, можете добавить пару предложений вот сюда к этой постановке задаче, пожалуйста помогите

Аватар пользователя
Ученик

Андрей ну пожалуйста, предложения добавьте что видите в этом коде какие действия, или последовательность какую-то кратко, мне больше не к кому обратиться. Пишу со второго акканта т.к там много отвечал и лимит

Аватар пользователя
Ученик

или помогите описать все функции в коде, входные/выходные параметры, поддерживаемые для объектов операции(+-×/), нахождение нод

Аватар пользователя
Искусственный интеллект

1. Не nomenator, а numerator

2. Вот здесь https://pastebin.com/93pAQ1zt есть решение, в котором данные хранятся в std::pair, но вы можете заменить все .first на .numerator, а все .second на .denominator, переопределить конструкторы с параметрами в соответствие с заданием, добавить, при необходимости, заголовочный файл <cmath> и вам будет счастье.

Аватар пользователя
Ученик

а к этой постаноке задачи, можете пару предложений добавить, какие действия в коде или последовательность кратко, или это но это сложно наверное

описать все функции в коде, входные/выходные параметры, поддерживаемые для объектов операции(+-×/), нахождение нод

Аватар пользователя
Искусственный интеллект

Сакральный смысл образования кроется в том, что если вы учитесь писать код, то вам должны дать техническое задание. Если вы учитесь составлять техническое задание, то кто-то другой должен написать по нему код. Только так можно определить качество выполнения работ. Если вы сами себе пишите и то и другое, не понимая, зачем оно вам, то вы в обоих случаях напишите всякую ерунду. Что, собственно, у вас и вышло. Так как поставлен вопрос, вам с ним никто помогать не будет. Потому что, если вы не можете объяснить, что вы делаете, вы не понимаете что вы делаете. А вопросы просты. Кому и зачем нужна эта рациональная дробь? Сможете ответить на эти вопросы. Поймёте, как она должна работать, чтобы приносить пользу.



Видео по теме