Klasy, konstruktory i prosty programik w C++

0

Witam, mam do napisania program w C++
Oto treść zadania:
[code]
Stwórz klasę definiującą ułamek. Wszystkie jej zmienne mają być typu private.

 Zdefiniuj konstruktory i destruktor dla stworzonej klasy.

 Wczytuj i zapisuj tablice ułamków z / do pliku zewnętrznego oraz wyświetlaj jej zawartość na
ekranie. Dane w pliku powinny być w formie
licznik / mianownik
oraz w takiej samej formie wyświetlane na ekranie i zapisywane do pliku.

 Napisz funkcję umożliwiającą wyświetlanie ułamka w postaci liczby mieszanej lub ułamka
niewłaściwego.
 Napisz funkcję zamieniającą ułamki w tablicy na formę dziesiętną.

 Zaimplementuj możliwość wykonywania podstawowych działań arytmetycznych (dodawanie /
odejmowanie / mnożenie / dzielenie / potęgowanie / pierwiastkowanie) bezpośrednio na
obiektach klasy ułamek.

 Napisz funkcję automatycznie skracającą ułamki w tablicy (oczywiście działającą tylko dla
tych ułamków, dla których jest to możliwe). Funkcja ta ma być funkcją zewnętrzną (nie
zdefiniowaną w klasie). Jako, iż zmiennie w klasie są typu private zastanów się nad sposobem
komunikacji tej funkcji z obiektami z klasy ułamek.[/code]

Nie za bardzo wiem jak się za to zabrać.
Zrobiłem póki co klasę, nazwałem ją "ułamek". Tam w PRIVATE zrobiłem 2 inty. int licznik oraz int mianownik.
Teraz chciałem zrobić w PUBLIC jakiś konstruktor, który wczytywałby dane z pliku. Jednak nie mam pojęcia jak to zrobić...
Wiem, że muszę skorzystać z fstream, ale nie ogarniam tego.

prosiłbym o jakąkolwiek pomoc, która mogła by mnie naprowadzić na rozwiązanie.
Z góry dziękuje i pozdrawiam :)

0

Nie mam pojęcia jak utworzyć tablice ułamków z / do pliku zewnętrznego oraz wyświetlić jej zawartość na ekranie, żeby dane w pliku były w formie licznik / mianownik ...

W tym momencie mój kod wygląda bardzo ubogo:
http://pastebin.com/tnXiGF84

Zrobiłem klasę oraz konstruktor czekający na jakieś dane. Jednak te dane mają być pobrane z pliku, który wcześniej został utworzony przez tablice ułamków. Strasznie to zagmatwane trochę.
Nie zabardzo wiem jak działać na tych plikach :(
Nie wspominając już, że dane mają być w private, ale jakoś nie mogę im przypisać wartości wtedy przez konstruktor więc dałem tymczasowo na public...

1
ofstream out("ulamek.txt");

i teraz zależy czy to trzymasz w vectorze, czy może w tablicy(w tym przypadku blee) i znasz ilość elementów w tablicy(oznaczmy ją jako n)

for(int i=0;i<n;i++)
    out<<ulamek[i].getLicznik()<<"/"<<ulamek[i].getMianownik()<<"\n";

Później wczytujesz do stringa;

ifstream in("ulamek.txt");
while(in>>txt){
    i tutaj odzielasz licznik od mianownika, oraz konwenterujesz do inta.
    cout<<txt<<"\n";
}
0

ułamki przechowuj w zmiennej double później musisz jakoś ze wzoru obliczyć jaki jest licznik a jaki mianownik. Ułamek wypisuj po prostu w 3 linijkach(licznik, podłoga(_), mianownik)

0

Nadal niewiele mi to pomogło. Nie zabardzo rozumiem jak to ogólnie ma wyglądać.
Mam tą całą klasę z dwiema zmiennymi (licznik oraz mianownik). I co? Każda zmienny ma być oddzielną tablicą, która będzie trzymać w sobie liczby ? I te liczby mają być wprowadzane i wyprowadzane do jednego pliku w formie licznik / mianownik?

http://pastebin.com/ehY5yZWy

1

W klasie masz licznik mianownik, masz getery, konstruktor nio i te metody, które na przykład zamieniają na ułamek niewłaściwy itd.
Tablice masz do trzymania tych obiektów czyli:

ułamek ułamki[10];

Chociaż to jest do d**y i wbrew światu zrób:

vector<ulamek>ulamki;

który zachowuje się jak tablica z miłym dodatkiem.
Gdy masz vector, to wczytujesz po kolei stringi czyli np masz w wczytanym stringu: "12/24" i co teraz musisz zrobić?
Musisz podzielić to na 2 stringi, w jednym będziesz miał 12 a w drugim 24. jak będziesz miał, to musisz to zamienić na inta, do czego możesz wykorzystać atoi albo możesz odjąć '0' od poszczególnej literki i troszkę pomnożyć, po czym wszytko ładnie zsumować.
jak masz wszystko to robisz

ulamki.push_back(ulamek(liczba1,liczba2));

nio i masz obiekt w tablicy. Do skracania ułamków masz NWD, do pokazania w postaci dziesiętnej wystarczy podzielić mianownik i licznik z rzutowaniem na double.. i tak dalej. Zadanie banalne, jeżeli potrafisz coś zakodzić. Jak dalej nie potrafisz, to tylko gotowiec Cie ratuje, albo dużo nauki.

0

A da się to jakoś bez tych vectorów zrobić? Jakoś nie kojarze tego w ogóle.
Zrobiłem coś takiego:
http://pastebin.com/9ympa2tN

Udało mi się sprawić, żeby ułamek zczytywał się z pliku i zapisywał do innego.
Jednak nie zastosowałem tam tablic żadnych, a chyba powinienem. **Da się jakoś subtelnie ten mój kod przerobić tak, żeby te tablice jednak się tam pojawiały i robiły swoje? ** Bo ten mój sposób jest dość barbarzyński ale przynajmniej go rozumiem.

ajajajaja, zamiast % dałem & - genius...

Aha i jeszcze chciałbym wiedzieć jak zmienić w klasie wartości, które są w private. na razie zmieniłem na public bo wywalał mi błąd, ale musze działac na private. Jak sprawić aby konstruktor się tam dobrał?

1

Robisz tak zwanego settera, czyli metodę publiczną, która zmienia wartość licznika bądź mianownika.
Napisałem Ci wyżej, do czego jest Ci tablica i na pewno nie jest to do tego:

 //  int liczniki[] = {2,4,6,3,2,4,5,8,7,6};            //na razie niepotrzebne
 //  int mianowniki[] = {5,9,1,5,5,4,7,5,21,6,99};

Do tej tablicy wczytujesz te obiekty. Jest z tym mały problem, bo nie wiesz ile jest ich w pliku. Jest to co prawda popylina, ale na przykład możesz w pierwszej linii pliku, napisać sobie ile jest tych obiektów, albo przyjąć, że zawsze będzie ich dziesięć. Widocznie twój nauczyciel toleruje popyline, bo nic nie pisać ani o listach, ani o vectorach. Ja radzę Ci użyć vectora, zwłaszcza, że chociażby sam parser prawdopodobnie będzie popyliną(bo nie będzie idioto odporny)
Masz też od tego konstruktor czyli:

ułamek(int l,int m):licznik(l),mianownik(m){}

Po czym jak Pan na włościach tworzysz sobie obiekt

ułamek u(1,2);
0

A mógłbyś mi napisać fragment tego kodu z tymi tablicami i vectorem? Nie mam pojęcia jak to powinno wyglądać niestety. Oraz jak oddzielić te 2 liczby do 2 osobnych tablic

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