Przeciążanie operatorów, dla obiektu ułamki.

0

Cześć,

Na zaliczeniu z ćwiczeń miałem zadanie w którym miałem napisać klasę na podstawie której tworzę obiekty (ułamki), klasa zawiera dwie zmienne typu int licznik i mianownik oczywiście też metodę pobierającą dane. Kolejnym etapem było przeciążenie operatorów tak by można było dodać dwa ułamki, odjąć i pomnożyć - z tym ostatnim nie miałem problemu bo to jest mnożenie liczniklicznik, mianownikmianownik. A że trapi mnie to proszę o helpa, bo to już całkowicie nie bedzie wtedy problemu z tematem Przeciążania dla mnie :) od razu zaznaczę że metoda przeciążająca operator dodawania ma opierać się na regule dodawania ułamków zwykłych czyli a/b*c/d = (ad+bc)/bd.

Chodzi żeby :

Ulamek U1(3,4);
Ulamek U2(5,6)
Ulamek U3 = U2 + U1; // przez przeciążanie operatora + to ma dać wynik 38/24 (Przykładowo). 

Kombinowałem ale nie wychodzi.

Z góry dzięki za pomoc. (Oczywiście ćwiczenia zaliczyłem bo zrobiłem zadanie prócz dodawania i odejmowania i jeszcze inne jedno)

2

Nie do końca rozumiem w czym problem. Wykonujesz mnożenie - dokładnie to co podałeś w poście - i masz. Swoją drogą, nie skracasz ułamka?

0

Mnożenie jest banalne chodzi o dodanie ale tak by przeciążanie zwracało już kompletną wartość wzoru -> a/b*c/d = (ad+bc)/bd.

Dla * to zrobiłem coś takiego:

Ulamek Ulamek::operator*( const Ulamek & u )
{
   Ulamek u3(1,1);
   u3.licznik=this->licznik*u.licznik
   u3.mianownik=this->mianownik*u.mianownik
   return u3;
}

a dla dodawania w tym przypadku ?

2

Dodawanie też jest banalne, szczególnie bez skracania.

Mnożenie:
\frac{a}{b} \cdot \frac{c}{d} = \frac{a \cdot c}{b \cdot d}

Dodawanie:
\frac{a}{b} + \frac{c}{d} = \frac{a \cdot d + c \cdot b}{b \cdot d}

Nie rozumiem czego można tutaj nie rozumieć. Przecież wiesz jak się w C++ mnoży i dodaje liczby, prawda?

0

Jakiego skracania ? Ja chcę by ktoś pokazał mi jak zrobić przeciążanie operatora+ tak by wpisując w main tylko i wyłącznie dodawanie obiektów Ulamek U3 = U2 + U1 przekazał mi wynik odpowiedni z wzorem który przedstawiłem/ś. Tak jak to przedstawiłem z mnożeniem powyżej. Mi nie wychodzi kombinowałem to się zwróciłem tutaj.

3
Ulamek Ulamek::operator+( const Ulamek & u )
{
   Ulamek u3(1,1);
   u3.licznik=licznik * u.mianownik + u.licznik * mianownik;
   u3.mianownik=mianownik * u.mianownik;
   return u3;
}
0

Z tego co pamiętam pisałem tak robiłem i nie działało ale skoro tak twierdzisz to przygotuje kod i spróbuje.

0

Łeeee no działa :P Uj... wie dlaczego mi tam nie szło a program działał :P Ważne że wiem że nie jestem jakiś obłąkany i głupi i rzeczywiście to rozumiem. Dziękuje bardzo za pomoc :)

main.cpp

#include <iostream>
#include "ulamek.h"

using namespace std;

void main() {
	Ulamek U1(3,4);
	cout << U1 << endl;
	Ulamek U2(5,6);
	cout << U2 << endl;
	Ulamek U3 = U2 + U1;
	cout << U3 << endl;
}

ulamek.cpp

#pragma once
#include "ulamek.h"

Ulamek::Ulamek(int licznik, int mianownik)
{
	if (licznik > 0) {
		this->licznik = licznik;
		this->mianownik = mianownik;
	}else
		throw new std::domain_error("licznik mniejszy od 0");
}

Ulamek::~Ulamek()
{
}

const int Ulamek::getLicznik()
{
	return this->licznik;
}

const int Ulamek::getMianownik()
{
	return this->mianownik;
}

std::ostream & operator<<(
	std::ostream & output, Ulamek & values)
{
	return output <<
		values.licznik <<
		"/" <<
		values.mianownik;
}

const Ulamek& Ulamek::operator+(const Ulamek& b) {
	Ulamek zwracana(1, 1);
	zwracana.licznik = licznik * b.mianownik + mianownik * b.licznik;
	zwracana.mianownik = mianownik * b.mianownik;
	return zwracana;
}

ulamek.h

#pragma once

#include <iostream>

class Ulamek
{
public:
	int licznik;
	int mianownik;
	Ulamek(int licznik, int mianownik);
	~Ulamek();

	const int getLicznik();

	const int getMianownik();

	const Ulamek& operator+ (const Ulamek& b);

	friend std::ostream& operator<< (
		std::ostream& output, Ulamek& values);
};

Przy okazji wrzucam kodzik a nóż kiedyś ktoś zrozumie na jego podstawie albo się przyda. Szczerze mówiąc ten przykład z ułamkami najbardziej mi pomógł.

1 użytkowników online, w tym zalogowanych: 0, gości: 1