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

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

Język C++ zajęcia nr 2

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Tablice, funkcje - wprowadzenie

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

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

Wskaźniki. Informatyka

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

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

Wstęp do programowania

Laboratorium nr 10. Temat: Funkcje cz.2.

Wstęp do programowania

Tablice, funkcje, wskaźniki - wprowadzenie

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

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

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Wstęp do Programowania, laboratorium 02

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Wstęp do informatyki- wykład 11 Funkcje

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

Język C zajęcia nr 11. Funkcje

tablica: dane_liczbowe

Wstęp do informatyki- wykład 9 Funkcje

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

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

Techniki Programowania wskaźniki

Wskaźniki w C. Anna Gogolińska

Języki i metodyka programowania. Wskaźniki i tablice.

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Funkcja (podprogram) void

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Podstawy programowania 1

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

W dowolnym momencie można zmienić typ wskaźnika.

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Przekazywanie argumentów wskaźniki

Podstawy programowania w języku C++

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

KURS C/C++ WYKŁAD 2. char znak; znak = a ; Program 2 #include<stdio.h> void main() { char znak; while( (znak = getchar() )!= t ) putchar(znak); }

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

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

Szablony. Szablony funkcji

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

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

Co nie powinno być umieszczane w plikach nagłówkowych:

Wykład nr 3. Temat: Wskaźniki i referencje. Edward Morgan Forster

Techniki Programowania wskaźniki 2

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

KURS C/C++ WYKŁAD 6. Wskaźniki

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Programowanie proceduralne w języku C++ Funkcje

Funkcja, argumenty funkcji

Materiał. Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Funkcje Wskaźniki Referencje Tablice dynamiczne Typ string Przeładowania funkcji

Lab 9 Podstawy Programowania

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

Algorytmy i język C++

Część 4 życie programu

Język C, tablice i funkcje (laboratorium)

Wskaźniki. Programowanie Proceduralne 1

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Wstęp do informatyki- wykład 9 Pętla while, do while,for -pętla w pętli- przykłady Funkcje

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

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

Zmienne, stałe i operatory

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

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Programowanie i struktury danych

Podstawy programowania. Wykład: 8. Wskaźniki. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

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

Zmienne i struktury dynamiczne

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

Programowanie Procedurale

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

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

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

Proste typy zmiennych języka C++ *) Zapis 3.4 e-38 jest równoważny zapisowi 3,

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

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

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

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

Wykład 3. Instrukcje powtarzające

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

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Wstęp do wskaźników w języku ANSI C

Wykład 1: Wskaźniki i zmienne dynamiczne

PARADYGMATY PROGRAMOWANIA Wykład 3

IX. Wskaźniki.(3 godz.)

Wykład 5: Klasy cz. 3

Transkrypt:

Funkcje. Deklaracja funkcji: KURS C/C++ WYKŁAD 8 #include<stdio.h> //deklaracje funkcji: printf(...), scanf(...) #include<math.h> //double sqrt (double ) #include<conio.h> //void clrscr (void) void main (){ float liczba, wynik; double kwadrat; clrscr(); scanf ("%f", &liczba); if (liczba>0) wynik = sqrt (liczba); //konwersja typu else wynik = pow (liczba, 3)); Deklaracja funkcji: typ_funkcji nazwa_funkcji (lista typów argumentów); Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty. float fun( int a); float fun( int); Nazwy argumentów w deklaracjach nie są istotne dla kompilatora i można je pominąć. void fun(char *); int fun(void); char *fun (char tab[]); void fun (float&); Definicja funkcji Definicja jest deklaracją, w której jest przedstawiona treść funkcji. Każda funkcja wywoływana w programie musi być zdefiniowana, tylko raz. long dodaj(int, int ); // deklaracja funkcji, prototyp funkcji main() { long wynik; int i=9; float f=3.45; wynik = dodaj (2, 5); //wywołanie funkcji wynik = dodaj(3, i); wynik = dodaj(i, f); //konwersja float do int long dodaj(int a, int b){//definicja funkcji

long w; w=2*a+2*b; return (w); // return (2*a+2*b); return jest instrukcją powrotu Przy przekazywaniu argumentów, sprawdza się typ argumentów i tam gdzie trzeba dokonuje się niejawnej i jawnej konwersji typów argumentów. int index (char *, char); // deklaracja funkcji, prototyp funkcji main() { int idx; char tab[]= Informatyka, znak; idx = index (tab, f ); //wywołanie funkcji cout<<idx; //... znak= x ; idx=index (tab, znak); cout<<idx; //... int index (char *str, char znak);{ //definicja funkcji int *adr; adr=str; while ((*str!= NULL) && (*str!= znak)) str++; if (*str) return (str adr) else return -1; 1. Funkcja może zwracać wartość, wtedy przed jej nazwą umieszczamy typ zmiennej zwracanej przez funkcję, 2. Jeśli funkcja nie zwraca wartości jej nazwę poprzedzamy słowem void, 3. Funkcja może być wywoływana z argumentami, wtedy lista argumentów umieszczana jest po nazwie funkcji w nawiasach, 4. Jeśli funkcja wywoływana jest bez argumentu to deklarujemy: int f(void) lub int f(), Przekazywanie argumentów do funkcji Podczas wywoływania funkcji przydziela się pamięć dla jej argumentów formalnych, a następnie każdemu argumentowi formalnemu przypisuje się odpowiadający mu parametr aktualny. Sprawdza się przy tym zgodności typów i w razie potrzeby dokonuje się konwersji. void func(int par) { par += 5; //par = par+5; zmienna par to tzw. parametr formalny funkcji.

W funkcji main() wywołujemy ją w nastepujący sposób: void main(){ int a1=5; func(a1); // a1 to jest parametr aktualny funkcji. Argumenty przekazujemy: - przez wartość - przez wskaźnik - przez referencję (przezwisko) Przekazywanie parametrów przez wartość Funkcja pracuje na kopii zmiennej (parametru aktualnego), więc funkcja nie ma możliwości modyfikowania go. Parametr aktualny służy jedynie do modyfikacji parametru formalnego przechowywanego tymczasowo na stosie. int func(int par) { par = par + 5; cout<<"\nfunkcja: par="<<par; return (par); zmienna par to argument (parametr) formalny funkcji. void main(){ int w, a1=5; cout<<"\nparametr aktualny przed wywolaniem: a1 = "<<a1; w = func(a1); cout<<"\nparametr aktualny po wywolaniu: a1 = "<<a1; cout<<"\nwynik = "<<w; // Ekran: Parametr aktualny przed wywolaniem: a1 = 5 funkcja: par=10 Parametr aktualny po wywolaniu: a1=5 Wynik = 10 Przekazywanie parametrów przez wskaźnik Przy przekazywaniu parametru przez adres do funkcji przesyłany jest adres zmiennej (parametru aktualnego), na stosie tworzona jest kopia adresu. void func(int *par) { *par = *par + 5; cout<<"\nfunkcja: par="<<*par; zmienna par to argument (parametr) formalny funkcji.

void main(){ int a1=15; cout<<"\nparametr aktualny przed wywolaniem: a1 = "<<a1; func(&a1); cout<<"\nparametr aktualny po wywolaniu: a1 = "<<a1; Ekran: Parametr aktualny przed wywolaniem: a1 = 15 funkcja:par=20 Parametr aktualny po wywołaniu: a1=20 Przykład 2. struct st{ int licznik; char text[100]; ; void ustaw (st *, int); int sprawdz (st *p1, int w); void main() { int było; struct st p1 = {12, Dawid Lynch ; cout<< \n <<p1.licznik; //12 ustaw (&p1, 17); cout<< \n << p1.licznik; // 17 bylo = sprawdz (&p1, 12); void ustaw (st *p1, int w){ p1->licznik=w; strcpy (p1->text, Nowy licznik ); int sprawdz (const st *p1, int w){//obiekt jest stały if (p1->licznik = = w ) return (1); else return (0); Aby zabezpieczyć obiekty przed przypadkową zmianą argument specyfikujemy jako const. int sprawdz (const st *p1, int w){//obiekt jest stały if (p1->licznik = = w ) { p1->licznik = w+1; return (1); else return (0); //błąd modyfikacja obiektu stałego

Deklaracja argumentu wskaźnikowego jako const jest informacją, że wartość obiektu wskazywanego przez ten argument nie jest zmieniana przez funkcję. Przez referencję Przy przekazywaniu parametru przez referencje do funkcji przesyłany jest adres zmiennej. Operacje przeprowadzane są bezpośrednio na zmiennej, której referencje przesłano do funkcji lub na zmiennej tymczasowej gdy występuje niezgodność typu referencyjnego i argumentu. void func(int a, int &b) { a = a+5; b = b+6; cout<<"funkcja: parametr po modyfikacji: a = "<<a; cout<<"funkcja: parametr po modyfikacji: b = "<<b; main (){ int a1=5, b1=15; func (a1,b1); cout<<"parametr po wywolaniu funkcji: a1 = "<<a1; cout<<"parametr po wywolaniu funkcji: b1 = "<<b1; EKRAN: funkcja: parametr po modyfikacji: a = 10 funkcja: parametr po modyfikacji: b = 21 Parametr po wywolaniu funkcji: a1 = 5 Parametr po wywolaniu funkcji: b1 = 21 Po zakoñczeniu funkcji kopia zmiennej a1 przechowywana na stosie jest ze stosu usuwana - zmienna a1 - nie zostanie zmieniona. Drugi argument przesyłany jest przez referencje, na stosie przechowywany jest adres zmiennej, więc funkcja działa bezpośrednio na zmiennej, co powoduje że wartość zmiennej b1 jest zostaje zmieniona. Wywołanie funkcji dla parametrów przekazywanych przez wartość i referencję nie różni się od siebie. Może to prowadzić do błędów. Są również pewne niebezpieczeñstwa przy parametrach przekazywanych przez referencję: #include <stdio.h> void o_dwa (float &f){ f=f +2;

void main (){ int i=3; float f=3.0; o_dwa (i); //generowany ostrzeżenie o niezgodnośći parametrów. o_dwa (f); printf ("i=%d f=%3.1f ", i, f); Ekran: i=3 f=5.0 Niezgodność typu referencyjnego powoduje, że operacje wykonywane są na zmiennej tymczasowej. Przykład funkcji z parametrem przekazywanym przez wartość, wskaźnik i referencję: void fun_war (float ); //przez wartość void fun_wsk (float *); //przez wskaźnik void fun_ref (float &); //przez referencje void main() { float obl, nr =12; obl=fun_war (nr); cout<<obl; //-100 cout<<nr; //nr =12; fun_wsk (&nr); cout<<nr; //nr=120 fun_ref (nr); cout<<nr; //nr=130 float fun_war (float par) { par=3; return (-103 + par); //przez wartość void fun_wsk (float *par) {*par=120; //przez wskaźnik void fun_ref (float &par) {par=130;; //przez referencje Przekazywanie tablic (argumenty tablicowe) Jeśli argumentem funkcji jest tablica, to do funkcji jest przekazywany wskaźnik do jej pierwszego elementu. TABLICE NIE MOGą BYĆ PRZEKAZYWANE PRZEZ WARTOśĆ. Przyklad 1- tablica jednowymiarowa:

void f1 (int*wsk1, int n); void f2 (int tab[], int n); void f3 (int tab[4]); const r=4; void main(){ int i; int tablica[r] = {1,2,3,4; f1(tablica,r); f2(tablica,r); f3(tablica); void f1(int *wsk1, int n){ for(int i = 0; i<n; i++) *wsk++=3; //lub wsk[i]=3; void f2(int tab[],int n){ for(int i = 0; i<n; i++) tab[i]=5; //lub *tab++=5; void f3(int tab[4]){ for(int i = 0; i<4; i++) tab[i]=5; //lub *tab++=5; Przykład 2- tablica dwuwymiarowa: #include<math.h> const w=3, k=5; void f1 (int [w][k]); void f2 (int [][k], int) ; //void f3 (int [][], int, int); // poprawnie: void f3 (int **t, int, int );

void main(){ int tablica[w][k] = {1,2,3,4,5, 1,2,3,4,5; int t[2][5] = {1,2, 3,4, 5,1, 2,3, 4,5; f1 (tablica); f2 (tablica, w); f2 (t, 2); f3 ( (int **) t, 2, 5); void f1 (int t[w][k]){ for(int i=0; i<w; i++) for(int j=0; j<k; j++) cout<<t[i][j]; void f2 (int t[][k], int wym1){ for(int i=0; i<wym1; i++) for(int j=0; j<k; j++) cout<<t[i][j]; //void f3 (int t[][], int wym1, int wym2); // poprawnie: void f3 (int **t, int wym1, int wym2){ for (int i=0; i<wym1; i++) for (int j=0; j<wym2; j++) cout<< ((int*)t)[i*wym2+ j]<<endl;