1 / 90

Zasady zaliczenia

Zasady zaliczenia. Warunki uzyskania zaliczenia: Samodzielne wykonanie i prezentacja zadanego programu zaliczeniowego. Umiejętność wyjaśnienia instrukcji pojawiających się w kodzie oraz wprowadzenia drobnych modyfikacji. Kolokwium (15-16.05.2010)

hanzila
Download Presentation

Zasady zaliczenia

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Zasady zaliczenia • Warunki uzyskania zaliczenia: • Samodzielne wykonanie i prezentacja zadanego programu zaliczeniowego. Umiejętność wyjaśnienia instrukcji pojawiających się w kodzie oraz wprowadzenia drobnych modyfikacji. • Kolokwium (15-16.05.2010) • 3) Alternatywną możliwością zaliczenia jest aktywność na zajęcia (3 oceny bdb za pojawiające się na zajęciach zadania)

  2. Programowanie obiektowe • Metodologia tworzenia programów komputerowych, która definiuje programy za pomocą "obiektów" - elementów łączących stan (czyli dane) i zachowanie (czyli procedury, tu: metody). Obiektowy program komputerowy wyrażony jest jako zbiór takich obiektów, komunikujących się pomiędzy sobą w celu wykonywania zadań. Podejście to różni się od tradycyjnego programowania proceduralnego, gdzie dane i procedury nie są ze sobą bezpośrednio związane. Programowanie obiektowe ma ułatwić pisanie, konserwację i wielokrotne użycie programów lub ich fragmentów

  3. Cechy podejścia obiektowego • Wszystko jest obiektem. • Program jest zbiorem obiektów, które poprzez wysyłanie komunikatów mówią sobie nawzajem, co robić. • Każdy obiekt posiada swą własną pamięć, na którą składają się inne obiekty. • Każdy obiekt posiada swój własny typ. • Wszystkie obiekty danego typu mogą otrzymywać te same komunikaty. • Obiekt ma stan, zachowanie i tożsamość.

  4. Abstrakcja Każdy obiekt w systemie służy jako model abstrakcyjnego "wykonawcy", który może wykonywać pracę, opisywać i zmieniać swój stan, oraz komunikować się z innymi obiektami w systemie, bez ujawniania, w jaki sposób zaimplementowano dane cechy.

  5. Enkapsulacja Czyli ukrywanie implementacji, hermetyzacja. Zapewnia, że obiekt nie może zmieniać stanu wewnętrznego innych obiektów w nieoczekiwany sposób. Tylko wewnętrzne metody obiektu są uprawnione do zmiany jego stanu. Każdy typ obiektu prezentuje innym obiektom swój "interfejs", który określa dopuszczalne metody współpracy.

  6. Polimorfizm Referencje i kolekcje obiektów mogą dotyczyć obiektów różnego typu, a wywołanie metody dla referencji spowoduje zachowanie odpowiednie dla pełnego typu obiektu wywoływanego. Jeśli dzieje się to w czasie działania programu, to nazywa się to późnym wiązaniem lub wiązaniem dynamicznym. Niektóre języki udostępniają bardziej statyczne (w trakcie kompilacji) rozwiązania polimorfizmu - na przykład szablony i przeciążanie operatorów w C++.

  7. Dziedziczenie Porządkuje i wspomaga polimorfizm i enkapsulację dzięki umożliwieniu definiowania i tworzenia specjalizowanych klas na podstawie bardziej ogólnych. Dla klas specjalizowanych nie trzeba redefiniować całej funkcjonalności, lecz tylko tę, której nie ma obiekt ogólniejszy.

  8. Klasy class nazwa_klasy { //Składniki i funkcje składowe }; Przykład 1. class osoba { char nazwisko[80]; int wiek; }; Przykład 2. class samochod { char marka[60]; int rok_produkcji; };

  9. Tworzenie obiektów danej klasy Deklaracja obiektu danej klasy: nazwa_klasy nazwa_obiektu; Odwołanie do składników i funkcji składowych danej klasy: nazwa_obiektu.skladnik nazwa_obiektu.funkcja(argumenty) Przykład: class osoba{ int wiek; }; Main(){ Osoba Kowalski; Kowalski.wiek=55; ... }

  10. Klasy Ćwiczenie 1. Napisz klasę plytaCD, zawierającą składniki reprezentujące dane o autorze, tytule, wydawcy, roku wydania, liczbie utworów, czasie trwania. Utwórz obiekt tej klasy i ustal wartość składnika rok wydania. Ćwiczenie 2. Napisz klasę Zwierze, zawierającą składniki reprezentujące dane o rodzaju, rodzinie, rzędzie, gromadzie, typie, królestwie, liczbie kończyn, objętości mózgu, masie.

  11. Ukrywanie informacji Rodzaje dostępu do składnika klasy: public – składnik dostępny bez ograniczeń, private – dostępny tylko dla funkcji składowych danej klasy, protected – dostępny tak jak składniki private, ale dodatkowo dostępny też dla klas wywodzących się z danej klasy. Jeśli w definicji klasy nie określamy sposobu dostępu, to rodzaj dostępu domyślnie jest ustalany jako private.

  12. Funkcje składowe(1) Definiowanie funkcji: 1) W definicji klasy, np.: class osoba{ char nazwisko[100]; public: void przedstaw(){ cout<<nazwisko<<endl; } }; Zalecane dla krótkich funkcji.

  13. Funkcje składowe(2) 2) W definicji klasy, np.: class osoba{ char nazwisko[100]; public: //tylko deklaracja void pobierz_dane(); }; //definicja funkcji poza definicją klasy void osoba::pobierz_dane() { //instrukcje } Zalecane dla dłuższych funkcji.

  14. Funkcje składowe(3) Ćwiczenie 3. Napisz funkcje składowe klasy plytaCD: -wprowadzającą dane do składników obiektów, Do odczytu wartości zmiennej z klawiatury można użyć instrukcji: cin >> nazwa_zmiennej; -wyświetlajacą dane obiektu, -zwracającą średni czas trwania utworu.

  15. Konstuktory (1) • Konstruktor to specjalna funkcja, która jest uruchamiana automatycznie • przy definiowaniu każdego obiektu danej klasy. • Deklaracja konstruktora • nazwa_klasy (argumenty); • Zasady deklaracji: • nazwa konstruktora identyczna z nazwą klasy, • nie określa się zwracanego typu (nawet void), • nie są dziedziczone. • Klasa może mieć wiele konstruktorów (konstruktory mogą być • przeładowane). Wykonywany jest wtedy • konstruktor z odpowiednią liczbą i rodzajem argumentów.

  16. Konstuktory (2) Przykład: class plyta { char tytul[100]; int cena; plyta (char tyt[200], int c); }; plyta::plyta(char tyt[200], int c){ strcpy(tytul, tyt); cena=c; } Ćwiczenie 4. Napisz dowolny konstruktor klasy Zwierze.

  17. Konstuktory (3) Konstruktor domniemany – konstruktor, który można wywołać bez argumentów. Klasa może mieć tylko jeden konstruktor domniemany. Jeśli klasa nie ma żadnego konstruktora, to kompilator automatycznie generuje konstruktor domniemany. Konstruktorami domniemanymi są także konstruktory posiadające wyłącznie argumenty domniemane, np.: class abc{ //... public: abc(int); abc(float); //deklaracja konstruktora domniemanego abc(char *b = NULL, float a = 6.3, int c = 2); };

  18. Konstuktory (4) Konstruktor kopiujący – konstruktor, który można wywołać z argumentem będącym referencją obiektu danej klasy. klasa::klasa( klasa &) Konstruktor kopiujący jest wykorzystywany do tworzenia obiektu będącego kopią obiektu wskazanego argumentem. Jeśli klasa nie ma zdefiniowanego konstruktora kopiującego, to kompilator tworzy go automatycznie. Ćwiczenie 5 Napisz konstruktor kopiujący klasy Zwierze, który uaktualnia globalną zmienną reprezentującą liczbę aktualnie istniejących obiektów tej klasy.

  19. Destruktory(1) • Destruktorem klasy K jest jej funkcja składowa o nazwie ~K. Funkcja ta • jest wywoływana automatycznie zawsze, gdy obiekt jest likwidowany. • Destruktor nie jest obowiązkowym składnikiem klasy. • Przykłady zastosowania destruktorów: • -odświeżenie ekranu po usunięciu obiektu (np. okienka), • -zwalnianie obszaru pamięci zarezerwowanego dla obiektu, • -liczenie obiektów danej klasy, • -zapis informacji o usuwanych obiektach. • Deklaracja destruktora: • ~nazwa_klasy(); • Zasady deklaracji: • -brak zwracanego typu, • -brak argumentów, • -nazwa destruktora to nazwa klasy poprzedzona znakiem ~.

  20. Destruktory(2) Jawne wywołanie destruktora: obiekt.~klasa(); wskaznik->klasa(); This->~klasa(); //z wnętrza klasy Ćwiczenie 6. Napisz destruktor klasy Płyta, który wypisze na ekran wybrane informacje o płycie.

  21. Funkcje zaprzyjaźnione(1) Funkcja zaprzyjaźniona z klasą to funkcja, która (mimo, że nie jest składnikiem klasy) ma dostęp do wszystkich (nawet prywatnych) składników klasy. Funkcja staje się zaprzyjaźniona, gdy jej deklarację wewnątrz klasy poprzedzimy słowem kluczowym friend. Funkcja jest zaprzyjaźniona z klasą, a nie z konkretnym obiektem. Zalety funkcji zaprzyjaźnionych: -funkcja może być przyjacielem więcej niż jednej klasy, -funkcja może dokonywać konwersji zdefiniowanych przez użytkownika na argumentach jej wywołania, -można nadać dostęp do składowych prywatnych nawet funkcjom, które nie mogłyby być składnikami klasy, np. napisanym w innym języku programowania.

  22. Funkcje zaprzyjaźnione(2) Zasady tworzenia funkcji zaprzyjaźnionych: -z wnętrza funkcji zaprzyjaźnionej można się odwoływać do składników przez: obiekt.nazwa lub wsk->nazwa, -w przypadku funkcji przeładowanych przyjacielem klasy K jest tylko ta wersja funkcji, która odpowiada liście argumentów widocznej w deklaracji przyjaźni, -funkcja zaprzyjaźniona może być też funkcją składową innej klasy (friend nazwa_klasy::nazwa_funkcji(int a);), -przyjaźń nie jest przechodnia, -przyjaźń nie jest dziedziczona, -aby klasy miały nawzajem zaprzyjaźnione funkcje, to całe klasy muszą być ze sobą nawzajem zaprzyjaźnione, np.: class K {friend class M; // ... }; Oznacza to, że wszystkie składowe klasy M mają dostęp do prywatnych składników klasy K.

  23. Funkcje zaprzyjaźnione(3) Przykład: class person{ private: char name[30]; char surname[100]; //Deklaracja funkcji zaprzyjaznionej friend void introduce(person pPerson); }; //definicja funkcji zaprzyjaznionej void introduce(person pPerson){ cout<<"My name is "<<pPerson.surname<<endl; cout<<pPerson.name<<" "<<pPerson.surname<<endl; };

  24. Funkcje zaprzyjaźnione(4) Ćwiczenie 7. Napisz funkcję zaprzyjaźnioną z klasą PlytaCD zwracającą łączny czas trwania płyt podanych jako argumenty.

  25. Przeładowanie operatorów(1) C++ udostępnia zbiór operatorów umożliwiających operacje na zmiennych typu całkowitego, rzeczywistego i znakowego oraz operatorów indeksowania, wywołania funkcji, dostępu do składowych oraz dynamicznego przydziału, zwalniania pamięci itd. int i, j, k; k = i + j; Większość tych operatorów może zostać zdefiniowana dla operandów innych typów, np.: klasa obiekt1, obiekt2, obiekt3; obiekt3 = obiekt1 + obiekt2; Zdefiniowanie funkcji operatorowej nazywamy przeciążeniem operatora. Identyfikator funkcji ma postać: typ_zwracany operator@ (argumenty){...}

  26. Przeładowanie operatorów(2) Lista operatorów, które mogą być przeładowane: + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= = = != <= >= && || ++ -- , ->* -> new delete () [] Nie mogą być przeładowane operatory: . .* :: ?: Operatory predefiniowane (automatycznie generowane dla każdej klasy): = & , new delete

  27. Przeładowanie operatorów(3) Uwagi: -nie można zmieniać priorytetu wykonywania operatorów, np. wyrażenie a + b * c zawsze jest traktowane jako a + (b * c), a nie jako (a + b) * c, -nie można zmieniać liczby argumentów (tego, czy operator jest jedno-, czy dwuargumentowy), -nie można zmieniać łączności operatorów, np. wyrażenie a=b=c=d niezależnie od sposobu, w jaki przeładowujemy operator odpowiada wyrażeniu a = (b = (c = d)), -jeśli funkcja operatorowa jest zdefiniowana jako zwykła (globalna) funkcja, to przyjmuje tyle argumentów na ilu pracuje operator, -przynajmniej jeden z argumentów musi być typu zdefiniowanego przez użytkownika, -argumenty nie mogą być domniemane,

  28. Przeładowanie operatorów(4) -dana funkcja operatorowa może być albo funkcją globalną, albo funkcją składową klasy, dla której pracuje. Jeśli operator definiujemy jako funkcję składową, to ma ona zawsze o jeden argument mniej niż ta sama funkcja napisana jako globalna, -jeśli chcemy, by operator mógł pracować na niepublicznych składnikach klasy to musimy zadeklarować tę funkcję jako zaprzyjaźnioną z daną klasą, -funkcja operatorowa, która jest funkcją składową klasy – wymaga, aby obiekt stojący po lewej stronie operatora był obiektem jej klasy. Operator, który jest zwykłą funkcją globalną – nie ma takiego ograniczenia.

  29. Przeładowanie operatorów(5) Przeładowanie operatorów jednoargumentowych: -jako zwykła (globalna) funkcja: operator@ (K); -jako funkcja składowa klasy K: K::operator@ (void); Przeładowanie operatorów dwuargumentowych: -jako zwykła (globalna) funkcja: operator@ (x, y); -jako funkcja składowa klasy K: K::operator@ (y);

  30. Przeładowanie operatorów(6) Przeładowanie operatorów jako zwykła funkcja: -jeśli operator ma dopuszczać, by po jego lewej stronie stał typ wbudowany, -jeśli operator sięga po obiekt po to, by pracować z nim bez modyfikowania go. Przeładowanie operatorów jako funkcja składowa klasy: -jeśli operator zmienia w jakiś sposób obiekt, na którym pracuje.

  31. Przeładowanie operatorów(7) Dwuargumentowy operator przypisania = klasa &klasa::operator=(klasa &) Służy do przypisania jednemu obiektowi klasy treści drugiego obiektu tej klasy. Operator przypisania składa się zwykle z dwóch części. Najpierw następuje część „destruktorowa”, po czym następuje część „konstruktorowa” – przypominająca konstruktor kopiujący.

  32. Przeładowanie operatorów(8) Przykład: #include <cstdlib> #include <iostream> using namespace std; class Ulamek{ int licznik; int mianownik; public: Ulamek(int l, int m):licznik(l), mianownik(m){}; }; int main(int argc, char *argv[]){ Ulamek a(1,2), b(3,4), c(0, 1), d(1, 1); //Nasze cele to umożliwienie wykonania takich instrukcji c = 1 + a + b - d; cout<< „Wynik=” << c << endl; system("PAUSE"); return EXIT_SUCCESS; }

  33. Przeładowanie operatorów(9) • Krok 1 – przeładowanie operatora + • W sekcji public klasy Ulamek proszę wstawić deklarację: • friend Ulamek operator+(Ulamek a, Ulamek b); • Poza klasą proszę wstawić definicję: • Ulamek operator+(Ulamek a, Ulamek b){ • Ulamek c(0,1); • c.licznik = (a.licznik * b.mianownik) + (b.licznik * a.mianownik); • c.mianownik = a.mianownik * b.mianownik; • return c; • }; • Proszę przetestować działanie funkcji wykonując instrukcję: • c = a + b;

  34. Przeładowanie operatorów(10) • Krok 2 – przeładowanie operatora + dla typu int • W sekcji public klasy Ulamek proszę wstawić deklarację: • friend Ulamek operator+(int a, Ulamek b); • Poza klasą proszę wstawić definicję: • Ulamek operator+(int a, Ulamek b){ • Ulamek c(0,1); • c.licznik = b.licznik + a * b.mianownik; • c.mianownik = b.mianownik; • return c; • }; • Proszę przetestować działanie funkcji wykonując instrukcję: • c = 1 + b;

  35. Przeładowanie operatorów(11) • Krok 3 – przeładowanie operatora - • W sekcji public klasy Ulamek proszę wstawić deklarację: • Ulamek operator-(Ulamek a); • Poza klasą proszę wstawić definicję: • Ulamek Ulamek::operator-(Ulamek a){ • Ulamek c(0,1); • c.licznik = (licznik * a.mianownik) - (a.licznik * mianownik); • c.mianownik = mianownik * a.mianownik; • return c; • }; • Proszę przetestować działanie funkcji wykonując instrukcję: • c = a - b;

  36. Przeładowanie operatorów(12) • Krok 4 – przeładowanie operatora << • W sekcji public klasy Ulamek proszę wstawić deklarację: • friend ostream &operator<<(ostream &out, Ulamek &a); • Poza klasą proszę wstawić definicję: • ostream &operator<<(ostream &out, Ulamek &a){ • out<<a.licznik<<"/"<<a.mianownik; • return out; • } • Proszę przetestować działanie funkcji wykonując instrukcję: • cout << a;

  37. Przeładowanie operatorów(13) • Ćwiczenie 8: • Przeładuj dla klasy Ulamek operator dzielenie dwóch obiektów tej klasy • Napisz funkcję globalną realizującą podnoszenie do potęgi obiektów klasy Ulamek • Utwórz klasę Osoba posiadającą prywatne składniki: imie, nazwisko i rok urodzenia, a następnie przeładuj dla tej klasy operator << tak, aby możliwe było wypisywanie na ekran obiektów tej klasy za pomocą instrukcji cout<< nazwaObiektu. • Napisz klasę Rachunek posiadającą składniki: kwota, waluta. • Dodaj do utworzonej klasy konstruktor inicjalizujący wartości składników. • Przeładuj operatory dodawania i odejmowania dla utworzonej klasy. Funkcje operatorowepowinny dodawać/odejmować kwoty na rachunku dokonując przeliczenia po ustalonych kursach w przypadku wystąpienia niezgodności waluty.

  38. Dziedziczenie (1) Dziedziczenie to technika pozwalająca na definiowanie klasy przy wykorzystaniu klasy już wcześniej istniejącej. Istniejąca klasa (klasa podstawowa): class X { … } Nowa klasa (klasa pochodna): class Y : specyfikator_dostępu X { … }

  39. Dziedziczenie (2) W klasie pochodnej można zdefiniować: -dodatkowe dane składowe, -dodatkowe funkcje składowe, -składniki, które już istnieją w klasie podstawowej (najczęściej funkcje). Specyfikator dostępu określa, do której sekcji klasy Y należą elementy klasy X.

  40. Dziedziczenie (3) Sposób umieszczenia składników klasy podstawowej w klasie pochodnej : Od strony klasy podstawowej: -składniki z sekcji private są dziedziczone, ale w zakresie klasy pochodnej nie ma do nich bezpośredniego dostępu, -składniki z sekcji protected i public są dostępne bezpośrednio w klasie pochodnej. Od strony klasy pochodnej: -specyfikator dostępu pozwala określić sposób, w jaki klasa pochodna chce odziedziczyć składniki protected i public klasy X, -jeśli separatorem jest public, składniki protected są dziedziczone jako protected, zaś składniki public są dziedziczone jako public, -jeśli separatorem jest protected, składniki public i protected są dziedziczone jako protected, -jeśli separatorem jest private, składniki public i protected są dziedziczone jako private, -separatorem domyślnym jest private,

  41. Dziedziczenie (4)

  42. Dziedziczenie (5) Dziedziczenie składników z klasy podstawowej nie obejmuje: -konstruktorów, -destruktorów, -operatora przypisania.

  43. Dziedziczenie (6) Przykład: class samochod{ int rocznik; public: samochod(int r):rocznik(r){}; void pokaz(){cout<<"Rocznik: "<<rocznik<<endl;} }; class osobowy: public samochod{ int ilosc_miejsc; public: osobowy(int m, int r):samochod(r), ilosc_miejsc(m){} void pokaz(){ samochod::pokaz(); cout<<"Ilosc miejsc: "<<ilosc_miejsc<<endl; } };

  44. Dziedziczenie (7) Dziedziczenie wielokrotne class A :specyfikator_dostępu B, specyfikator_dostępu C { ... } Jeśli klasy B i C mają składniki o jednakowych nazwach, to można się do nich odwoływać przez: nazwa_klasy::nazwa_skladnika;

  45. Dziedziczenie (8) • Zadanie 3. • 1) Zaimplementuj klasę Pojazd zawierającą składniki reprezentujące: maksymalną prędkość, moc silnika, rodzaj paliwa, ładowność itp.. • 2) Dodaj do klasy funkcje składowe setNazwaPola(wartość) oraz funkcjeskładowe getNazwaPola(). Funkcje setNazwaPola powinny umożliwić ustalenie wartości składników, a funkcja getNazwaPola pobranie ich wartości. • 3) Na podstawie klasy Pojazd utwórz klasy pochodne Samolot, Samochod, Czolg. Dodaj po kilka składników do każdej klasy pochodnej. • 4) Na podstawie klasy Samochod utwórz klasy pochodne Fiat i Ford. • 5) Utwórz klasę Statek zawierającą składniki reprezentujące: wyporność, maksymalną prędkość, rodzaj paliwa itp.. • 6) Na podstawie klas Pojazd i Statek utwórz klasę Amfibia. • 7) Do klas Pojazd i Statek dodaj konstruktory uzupełniające dane obiektów. • 8) Dodaj konstruktory do utworzonych klas pochodnych. • 9) Stwórz obiekty klasy Pojazd, Samolot, Samochod, Statek i Amfibia. • Dla utworzonych obiektów sprawdź działanie funkcji składowych setNazwaPola i getNazwaPola. • W klasach pochodnych utwórz funkcje getNazwaPola i setNazwaPola realizujące zadania podobne jak w klasach podstawowych, ale obejmujące też składniki specyficzne dla danych klas.

  46. Wskaźniki (1) • Przypomnienie • Definiowanie wskaźników: • typ *nazwa_wsk; • Ustawianie wskaźnika na obiekt: • nazwa_wsk = &k; • Odwołanie do wskazywanej wartości: • *nazwa_wsk • Obszary zastosowania wskaźników: • praca z tablicami, • funkcje, które mogą zmieniać wartość przesyłanych do nich argumentów, • dostęp do specjalnych komórek pamięci, • rezerwacja obszarów pamięci • Szerzej: • Jerzy Grębosz, Symfonia C++, s. 388 - 398

  47. Funkcje wirtualne (1) • Ćwiczenia: • Utwórz klasę Auto posiadającą funkcję opis() wypisującą na ekran tekst „Auto”. • Utwórz klasy Osobowy, Ciężarowy, Autobus dziedziczące z klasy Auto. • W klasach pochodnych przeładuj funkcję opis() tak, aby w każdej klasie wypisywała na ekran inny tekst. • Utwórz obiekty każdej z utworzonych klas i wywołaj ich metody opis(). • Utwórz wskaźnik do obiektu klasy auto(), ustaw go kolejno tak, aby wskazywał na obiekty klas pochodnych i uruchom za każdym razem metodę opis() korzystając z tego wskaźnika (wskaznik -> opis();). • Zaobserwuj działanie programu, a następnie zmodyfikuj deklarację metody opis tak, aby zawierała słowo kluczowe virtual: • void virtual opis(){...} • 7. Ponownie uruchom program i porównaj działanie z wersją bez słowa kluczowego virtual.

  48. Praca z plikami (1) • Ćwiczenia: • Przepisz i uruchom poniższy program: • #include <cstdlib> • #include <iostream> • #include <fstream> • using namespace std; • class station{ • public: • int No; • char name[40]; • char changes[100]; • void showName(){ • cout<<name<<endl; • }; • void showChanges(){ • cout<<"Changes: "<<changes<<endl; • }; • }; • int main(int argc, char *argv[]) • { • station route1[20]; • int i, j; • char tempNo[10]; • i = 0;

  49. Praca z plikami (2) //1) definicja strumienia ifstream route1File; //2) Wskazanie, z ktorym plikiem ma sie komunikowac strumien route1File.open("route1.txt"); if(!route1File){ cout<<"Couldn't open file!"<<endl; system("PAUSE"); return 1; } //3) Operacje wejscia/wyjscia while(route1File){ route1File>>route1[i].name; route1File>>route1[i].No; route1File>>route1[i].changes; i++; }; for(j = 0; j<i-1; j++){ cout<<"Station no "<<route1[j].No<<": "; route1[j].showName(); route1[j].showChanges(); } //4) Zakonczenie pracy z plikiem route1File.close(); system("PAUSE"); }

  50. Praca z plikami (3) • Utwórz plik route1.txt, umieść go w katalogu, w którym znajduje się program i zapisz w nim dane: • Worcester 1 Birmingham,London • Reading 2 Edingburg,London • Oxford 3 London,Birmingham • London 4 Liverpool,Birmingham,Glasgow • 3. Uruchom program i zaobserwuj jego działanie.

More Related