Programowanie obiektowe 2005/2006. Laboratorium 1. Przeciążanie funkcji

Podobne dokumenty
Przeciążanie funkcji. Przykład 1: #include <iostream> using namespace std; double srednia(double n1, double n2) { return ((n1 + n2)/2.

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

Zadanie 1. Napisz, skompiluj i uruchom program, który wyświetla komunikat: "Mam na imie...".

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Wymiar musi być wyrażeniem stałym typu całkowitego, tzn. takim, które może obliczyć kompilator. Przykłady:

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Część 4 życie programu

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie w języku C++

DYNAMICZNE PRZYDZIELANIE PAMIECI

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

Proste programy w C++ zadania

Programowanie strukturalne i obiektowe. Funkcje

Szablony funkcji i szablony klas

Prof. Danuta Makowiec Instytut Fizyki Teoretycznej i Astrofizyki pok. 353, tel danuta.makowiec at gmail.com

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

Przeciążenie (przeładowanie nazw) funkcji

Wstęp do programowania

Funkcje. Deklaracja funkcji. Definicja funkcji. Wykorzystanie funkcji w programie.

Programowanie proceduralne w języku C++ Funkcje

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

tablica: dane_liczbowe

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

TEMAT : KLASY DZIEDZICZENIE

Argumenty wywołania programu, operacje na plikach

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

Laboratorium nr 10. Temat: Funkcje cz.2.

Język C, tablice i funkcje (laboratorium)

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Programowanie komputerowe. Zajęcia 5

Szablony. Szablony funkcji

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Wartości domyślne, przeciażenia funkcji

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Wstęp do programowania

Podstawy Programowania C++

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

PARADYGMATY PROGRAMOWANIA Wykład 3

Język ludzki kod maszynowy

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Struktury Struktura polami struct struct struct struct

Techniki Programowania wskaźniki 2

Programowanie komputerowe. Zajęcia 4

Wstęp do Informatyki

Wskaznik. Przekazywanie wyniku funkcji przez return. Typy i zmienne wskaznikowe. Zmienna wskazywana. typ * nazwa_wkaznika

Podstawy Programowania Obiektowego

Podstawy algorytmiki i programowania - wykład 5 C-struktury cd.

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Język C++ zajęcia nr 2

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

Podstawy programowania w języku C i C++

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

C++ wprowadzanie zmiennych

Wartości domyślne, przeciażenia funkcji

4. Funkcje. Przykłady

I - Microsoft Visual Studio C++

Programowanie komputerowe. Zajęcia 3

Tablicę 2-wymiarową można przedstawić jako pewien zestaw tablic 1-wymiarowych np.:

Programowanie Obiektowew języku C++ Zadania L4

Szablony klas, zastosowanie szablonów w programach

Wstęp do programowania

Programowanie komputerowe. Zajęcia 1

Podstawy Programowania Podstawowa składnia języka C++

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Rzutowanie i konwersje

void Pobierz(Student &a); void Wypisz(Student a); void Ustaw_zaliczenia(Student t[],int r); void Wypisz_najlepszych(Student t[],int r, float prog);

Pliki wykład 2. Dorota Pylak

Operacje wejścia/wyjścia odsłona pierwsza

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Język C zajęcia nr 11. Funkcje

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Podstawy programowania w języku C++ Zadania

Podstawy programowania skrót z wykładów:

Język C, tablice i funkcje (laboratorium, EE1-DI)

Zmienne i struktury dynamiczne

int tab_a [ 2 ] [ 3 ];

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Metody Metody, parametry, zwracanie wartości

Język C++ wykład VIII

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Wstęp do programowania

Wstęp do programowania

Pytania sprawdzające wiedzę z programowania C++

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

do instrukcja while (wyrażenie);

Projektowanie klas c.d. Projektowanie klas przykład

EGZAMIN 2 (14 WRZEŚNIA 2015) JĘZYK C++

Zadania z podstaw programowania obiektowego

* WWW: * * Adres: Instytut Informatyki ul. Będzińska Sosnowiec Pokój 214 * Telefon:

Algorytmy i Struktury Danych. Anna Paszyńska

Transkrypt:

Laboratorium 1 Przeciążanie funkcji W języku C++ można stosować tę samą nazwę dla funkcji o różnej treści, pod warunkiem, że funkcje te mają różne parametry (różny jest typ lub liczba parametrów). Jest to przeciążanie nazwy funkcji. Kompilator analizuje listę typów argumentów aktualnych i dobiera (o ile nie ma niejednoznaczności) odpowiednią wersję funkcji. Dzięki takiemu rozwiązaniu, użytkownik musi pamiętać tylko jedną nazwę i nią się posługiwać w programie. Wybór właściwej funkcji należy do kompilatora. Przykład 1: Przykład 2: // Obydwie funkcje mają nazwę srednia // bez przeciążania musiałyby mieć inne nazwy double srednia(double n1, double n2) return ((n1 + n2)/2.0); double srednia(double n1, double n2, double n3) return ((n1 + n2 + n3)/3.0); int main () cout << "Srednia liczb 2.5 i 4.5 wynosi: ", srednia(2.5,4.5); cout << "Srednia liczb 2.5, 4.5 i 6.5 wynosi: ", srednia(2.5,4.5,6.5); cin.get(); return 0; // Obydwie funkcje mają nazwę srednia // bez przeciążania musiałyby mieć inne nazwy double srednia(int t[],int ile) int suma=0; for (int i=0;i<ile;i++) suma += t[i]; return (double)suma/ile; double srednia(double t[],int ile) double suma=0; for (int i=0;i<ile;i++) suma += t[i]; return suma/ile; int main () int t1[]=1,2,3; // tablica liczb całkowitych double t2[]=4.,5.,6.; // tablica liczb rzeczywistych cout << "calkowite: "<< srednia(t1,3) << endl; 1

cout << "rzeczywiste: "<< srednia(t2,3) << endl; return 0; O czym należy pamiętać podczas przeciążania funkcji? double litry(double kilometry, double litry) // Oblicza ile samochod pali na 100 km return (litry/kilometry*100); // int litry(int stan_baku_pocz, int stan_baku_kon) // Oblicza zuzycie bezyny // return (stan_baku_pocz stan_baku_kon); // int main () cout << "Zuzycie benzyny: ", litry(100.,12.); cout << "Zuzycie benzyny: ", litry(100,8); // Co będzie jeśli wprowadzimy przeciążoną funkcję litry? Pytania sprawdzające: 1. Kiedy używać przeciążania funkcji? 2. Załóżmy, że mamy dwie definicje funkcji: double wynik(double czas, double odleglosc); int wynik(double punkty); Która definicja funkcji zostanie użyta w wywołaniu: double x, y; y=wynik(x); 3. Załóżmy, że mamy następujące definicje: double f(double n1, double n2); double f(double czas, int licznik); double x,y; Która definicja będzie użyta w następujących wywołaniach funkcji: a) x=f(y,3.0); b) x=f(2,3); c) x=f(2,3.0); Argumenty domyślne Argument domyślny to wartość, która jest używana automatycznie wtedy, kiedy pominiemy odpowiedni argument rzeczywisty w wywołaniu funkcji. 2

Przykład: a) z parametrami obowiązkowymi: w prototypie (deklaracji) i definicji funkcji podaje się listę argumentów; dla każdego umieszczonego na liście argumentu należy podczas wywołania funkcji dostarczyć wartość zgodną z typem podanym w deklaracji // Definicja funkcji int suma(int a, int b, int c) return a+b+c;... // Tylko jeden sposób wywołania funkcji z=suma(1,3.0,6.0);// wartości przesłane w argumentach b) z parametrami domyślnymi: w prototypie (deklaracji) i w definicji funkcji podaje się listę argumentów z przypisanymi im wartościami domyślnymi argumentów; w wywołaniu takiej funkcji można nie podawać argumentów, przy czym obowiązuje zasada: jeśli w wywołaniu podany zostanie argument, jego wartość zostanie w funkcji wykorzystana jeśli w wywołaniu nie podany zostanie argument, w funkcji zostanie przyjęta wartość domyślna tego argumentu // Definicja funkcji każdemu argumentowi przypisano // wartość domyślną int suma(int a=0, int b=0, int c=0) return a+b+c; // Różne wywołania funkcji z=suma(); // wszystkie wartości domyślne, // wynik z wynosi 0 z=suma(5); // b i c wartości domyślne // wynik z wynosi 5 z=suma(5,3); // c wartość domyślna // wynik z wynosi 8 z=suma(1,3,6); // wszystkie wartości przesłane w argumentach // wynik z wynosi 10 Ograniczenia stosowania parametrów domyślnych: jeśli parametr nie ma wartości domyślnej, to nie może jej posiadać żaden z poprzedzających go parametrów Zadanie 1 // poprawne int objetosc(int dlugosc, int szerokosc=1, int wysokosc=1); // NIEPOPRAWNE!!! int objetosc(int dlugosc=1, int szerokosc=1, int wysokosc); Opracować zestaw przeciążonych funkcji, które pozwalają 3

a) wczytać do tablicy jednowymiarowej całkowitej lub rzeczywistej zestaw liczb całkowitych lub rzeczywistych (funkcje mają nazwę Czytaj), b) wydrukować zawartość odpowiedniej tablicy (funkcje mają nazwę Drukuj); c) obliczyć sumę wszystkich elementów w tablicy (funkcje mają nazwę Suma). Napisać program testujący opracowane funkcje. Zadanie 2 Napisać program pozwalający scalać dwie tablice jednowymiarowe o różnych rozmiarach. Założenia: Tablice przechowywane są w postaci struktury: struct Tab unsigned n; // liczba elementów int *t; // elementy tablicy ; W programie wykorzystywane są funkcje: Tab NewTab(unsigned m, unsigned n); // tworzenie tablicy m x n, // wypełnionej zerami void wypelnij(tab T, int x=0); // wypełnianie tablicy wartoscią x void drukuj(tab T, char* nazwa); // drukowanie tablicy Tab scal(tab T1, Tab T2); // scalanie tablic void UsunTab(Tab T1); // usuwanie tablic int max(int a, int b) return (a>b)?a:b; // funkcja pomocnicza: // max z dwóch liczb Zadania domowe Zadanie 1. Niech będą dane następujące deklaracje: int fun(int); int fun(double); void fun(int, double); void fun(double, int); int n, p; double x,y; char c; float z; Które z podanych poniżej wywołań są poprawne, które funkcje zostaną wywołane, jakie będą wykonane konwersje? Zadanie 2. a) fun(n) b) fun(x) c) fun(n,x) d) fun(x,n) e) fun(c) f) fun(n,p) g) fun(n,c) h) fun(n,z) i) fun(z,z) Czy przeciążanie funkcji można stosować do referencji? Czy kompilator rozróżni te funkcje? 4

Zadanie 3. void fun(int x); void fun(int &x); Czy rozróżnione zostaną następujące funkcje? void fun(char *x); void fun(const char *x); Zadanie 4. Zmodyfikować zadanie 2 z laboratorium tak, dotyczyło tablic dwuwymiarowych. Zadanie ma teraz postać: Opracować zestaw przeciążonych funkcji, które pozwalają d) wczytać do tablicy dwuwymiarowej całkowitej lub rzeczywistej zestaw liczb całkowitych lub rzeczywistych (funkcje mają nazwę Czytaj), e) wydrukować zawartość odpowiedniej tablicy (funkcje mają nazwę Drukuj); f) obliczyć sumę wszystkich elementów w tablicy lub we wskazanym wierszu (funkcje mają nazwę Suma). Napisać program testujący opracowane funkcje. Zadanie 5 Napisać program pozwalający scalać dwie tablice dwuwymiarowe o różnych rozmiarach. Założenia: Tablice przechowywane są w postaci struktury: struct Tab unsigned n; // liczba kolumn unsigned m; // liczba wierszy int *t; // elementy tablicy ; W programie wykorzystywane są funkcje: Tab NewTab(unsigned m, unsigned n); // tworzenie tablicy m x n, // wypełnionej zerami void wypelnij(tab T, int x=0); // wypełnianie tablicy wartoscią x void drukuj(tab T, char* nazwa); // drukowanie tablicy Tab scal(tab T1, Tab T2); // scalanie tablic void UsunTab(Tab T1); // usuwanie tablic int max(int a, int b) return (a>b)?a:b; // funkcja pomocnicza: // max z dwóch liczb Zadanie 6. Napisać zestaw funkcji działających na datach. Napisać program testujący opracowane funkcje. struct DATA int dzien; int miesiac; 5

int rok; ; // Prototypy funkcji bool CzyPoprawna(const DATA &data); int DniPomiedzy(const DATA &data1, const DATA &data2); bool Wczesniejsza(const DATA &data1, const DATA &data2); void DodajDni(const DATA &data1, DATA &data2, int dni); ostream &operator<< (ostream &wy, const DATA &data); // Stałe const int dniwmiesiacu[12] = 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ; // Dni od poczatku roku do poczatku miesiaca const int dnidomiesiaca[12] = 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ; static char *nazwymiesiecy[12] = "Styczen", "Luty", "Marzec", "Kwiecien", "Maj", "Czerwiec", "Lipiec", "Sierpien", "Wrzesien", "Pazdziernik", "Listopad", "Grudzien" ; //**************************************************************** bool RokPrzestepny (int rok) // "rok" musi być z zakresu 1900 i 2999. // Zwraca prawdę, jeśli "rok" jest przestępny... static int DniOd1900(const DATA &data) // "data" zawiera poprawną datę // (pomiedzy 1 Stycznia 1990 i 31 Grudnia 2100) // Zwraca liczbę dni od 1 stycznia 1990... //**************************************************************** bool CzyPoprawna(const DATA &data) // Zwraca true, jeśli data jest z zakresu // 1 Styczen 1990 i 31 Grudzien 2100... int DniPomiedzy(const DATA &data1, const DATA &data2) // "data1" i "data2" zawierają poprawne dane // Zwraca liczbę dni pomiędzy "data1" i "data2"... bool Wczesniejsza(const DATA &data1, const DATA &data2) // "data1" i "data2" zawierają poprawne dane // Zwraca true, jeśli "data1" jest wcześniejsza od "data2" // W przeciwnym wypadku zwraca false... void DodajDni(const DATA &data1, DATA &data2, int dni) // "data1" jest poprawna i "dni" >= 0. // Wstawia do data2 nową datę: data1 + dni... ostream &operator<< (ostream &wy, const DATA &data) // Uzycie: cout << data; // Drukuje dane w postaci "1 Styczen 1990". wy << data.dzien <<' ' << nazwymiesiecy[data.miesiac - 1] << ' ' << data.rok; 6

return wy; //**************************************************************** // Przykład funkcji testującej int main() DATA data1, data2; int dni; cout << "Wpisz trzy liczby: dzien, miesiac, rok\n" << " (np. 12 10 2002) ==> "; cin >> data1.dzien >> data1.miesiac >> data1.rok; if (CzyPoprawna(data1)) cout << data1 << endl; else cout << "*** Niepoprawna data ***\n" << " (Poprawne daty sa z zakresu: " << " 1 Styczen 1990 i\n" << " 31 Grudzien 2100).\n"; return 1; cout << "O lie dni zwiekszyc date ==> "; cin >> dni; DodajDni(data1, data2, dni); cout << "Nowa data to " << data2 << endl; if (DniPomiedzy(data1, data2) == dni) cout << "Test ok.\n"; else cout << "Blad w DodajDni lub DniPomiedzy.\n"; 7