• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ułamki - Klasy C++

Object Storage Arubacloud
0 głosów
341 wizyt
pytanie zadane 1 stycznia 2023 w C i C++ przez benny13 Obywatel (1,150 p.)

Cześć, do klasy Fraction dopisałem przeciążenia operatorów umożliwiające operacje na ułamkach (dodawanie, mnożenie, dzielenie, odejmowanie, rzutowanie na double, porównywanie), lecz niestety jeszcze do końca nie orientuję się w tym zagadnieniu i program nie działa. Czy mógłby ktoś rzucić okiem na kod (przeciążenie operatorów), aby znaleźć ewentualne błędy? Z góry dzięki!

#include <iostream>

class Fraction {
  int licznik;
  int mianownik;

  public:
    Fraction(int licz, int mian) {
      if (mian != 0) {
        licznik = licz;
        mianownik = mian;
        if (mianownik < 0) {
          licznik *= (-1);
          mianownik *= (-1);
        }
      } else {
        std::cout << "Mianownik nie moze byc rowny 0 !!";
        exit(0);
      }
    }

  Fraction(const Fraction & f1) {
    licznik = f1.licznik;
    mianownik = f1.mianownik;
  }

  int getLicznik() {
    return licznik;
  }

  int getMianownik() {
    return mianownik;
  }

  void setLicznik(int x) {
    licznik = x;

  }

  void setMianownik(int y) {
    if (y != 0) {
      mianownik = y;
    } else {
      std::cout << "0 nie moze byc w mianowniku!" << std::endl;
      exit(0);
    }
  }

  void simplify(int a, int b) {
    while (a != b)
      if (a > b) {
        a -= b;
      }
    else {
      b -= a;
    }
    licznik /= a;
    mianownik /= b;
  }

  void wypisz() {
    std::cout << "Podany ulamek to: " << licznik << "/" << mianownik << std::endl;
  }

  float toFloat() {
    float dziesietny;
    dziesietny = float(licznik) / float(mianownik);
    return dziesietny;
  }
  
//  Dodawanie
  Fraction operator+(Fraction fraction) {
	Fraction resultFraction;
	if (this->mianownik == fraction.getMianownik()) {
		resultFraction.setLicznik(this->licznik + fraction.getLicznik());
		resultFraction.setMianownik(this->mianownik);
	} else {
		resultFraction.setLicznik((this->licznik * fraction.getMianownik()) + (fraction.getLicznik() * this->mianownik));
		resultFraction.setMianownik(this->mianownik * fraction.getMianownik());
	}
	return resultFraction;
}

// Odejmowanie
	Fraction operator-(Fraction fraction) {
	Fraction resultFraction;

	if (this->mianownik == fraction.getMianownik()) {
		resultFraction.setLicznik(this->licznik - fraction.getLicznik());
		resultFraction.setMianownik(this->mianownik);
	} else {
		resultFraction.setLicznik((this->licznik * fraction.getMianownik()) - (fraction.getLicznik() * this->mianownik));
		resultFraction.setMianownik(this->mianownik * fraction.getMianownik());
	}

	return resultFraction;
}

// Mnozenie
Fraction operator*(Fraction fraction) {
	Fraction resultFraction;
	resultFraction.setLicznik(this->licznik * fraction.getLicznik());
	resultFraction.setMianownik(this->mianownik * fraction.getMianownik());
	return resultFraction;
}

// Dzielenie
Fraction operator/(Fraction fraction) {
	Fraction resultFraction;
	resultFraction.setMianownik(this->mianownik * fraction.getLicznik());
	resultFraction.setLicznik(this->licznik * fraction.getMianownik());
	return resultFraction;
}
	
	
//	Rzutowanie na double
	Fraction(int licznik,int mianownik)
{
	this.licznik = (double)licznik;
	this.mianownik = (double)mianownik;
	}
	
//	Porownywanie ulamkow
	bool Fraction operator==(Fraction fraction) {
	return (this->licznik * fraction.getMianownik()) == (fraction.getLicznik() * this->mianownik);
}

};

int main() {
  return 0;
}

 

2 odpowiedzi

+2 głosów
odpowiedź 1 stycznia 2023 przez j23 Mędrzec (194,920 p.)

i program nie działa.

Rozwiń to "nie działa".

  • Operatory, które nie zmieniają stanu obiektu this, powinny być const.
  • Obiekty przekazuj w parametrach przez const referencję. Nie ma potrzeby robić kopii obiektów, skoro chcesz je tylko odczytać.
komentarz 1 stycznia 2023 przez benny13 Obywatel (1,150 p.)
Tworzę obiekt i wtedy wtedy przy kompilacji wyskakują błędy.
komentarz 1 stycznia 2023 przez j23 Mędrzec (194,920 p.)
No to zacytuj te błędy.

Ale najpierw zastosuj się do tego, co napisałem w punktach.
+2 głosów
odpowiedź 1 stycznia 2023 przez Gynvael Coldwind Nałogowiec (27,530 p.)

(kopia odpowiedzi z duplikatu pytania, który to został zamknięty)

Przede wszystkim skompiluj sobie ten kod i rozwiązuj błędy jeden po drugim ZACZYNAJĄC OD GÓRY. Tj. po każdej poprawce skompiluj ponownie i dopiero wtedy rozwiązuj kolejny problem (kompilatory C++ mają trochę efekt kuli śnieżnej, gdzie jeden błąd potrafi spowodować milion błędów w kolejnych linia; a jak się go poprawi, to one magicznie znikają).

Tak na szybko to:

  • Brakuje mi tam jakiegos include<iostream>
  • Masz dwa razy konstruktor (na górze i na dole klasy)
  • Brakuje konstruktora który nie przyjmuje żadnych argumentów (zauważ, że masz w kodzie trochę miejsc gdzie tworzysz ułamek bez podania parametrów, np w metodach operator-, operator*, etc).

Po tych poprawkach przynajmniej się kompiluje - i jak do tego momentu dojdziesz, to musisz zacząć to porządnie testować :)

1
komentarz 1 stycznia 2023 przez Gynvael Coldwind Nałogowiec (27,530 p.)

Yup, pisalem o tym ;)

  • Masz dwa razy konstruktor (na górze i na dole klasy)
komentarz 1 stycznia 2023 przez TOWaD Mądrala (5,700 p.)
fakt pisałeś.
1
komentarz 2 stycznia 2023 przez benny13 Obywatel (1,150 p.)

@Gynvael Coldwind, Dziękuję!! :)

komentarz 2 stycznia 2023 przez benny13 Obywatel (1,150 p.)

@Gynvael Coldwind, A wie ktoś jak zrobić wypisywanie ułamka na konsole / do pliku za pomocą przeciążenia operatorów?

Podobne pytania

0 głosów
1 odpowiedź 292 wizyt
pytanie zadane 18 stycznia 2022 w C i C++ przez Fluxik Nowicjusz (240 p.)
0 głosów
0 odpowiedzi 275 wizyt
pytanie zadane 18 listopada 2020 w C i C++ przez Eriss69 Gaduła (4,470 p.)
0 głosów
1 odpowiedź 307 wizyt
pytanie zadane 19 października 2021 w C i C++ przez Vifuso Nowicjusz (170 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...