JĘZYK C - PRZEKAZYWANIE PARAMETRÓW DO FUNKCJI
Transkrypt
JĘZYK C - PRZEKAZYWANIE PARAMETRÓW DO FUNKCJI
Politechnika Białostocka Wydział Elektryczny Katedra Elektrotechniki Teoretycznej i Metrologii Spis treści 1. Opis stanowiska ............................................................................................. 3 1.1. Stosowana aparatura ............................................................................... 3 Instrukcja do pracowni specjalistycznej z przedmiotu 1.2. Oprogramowanie ...................................................................................... 3 2. Wiadomości teoretyczne................................................................................ 3 Informatyka 1 2.1. Przekazywanie parametrów do funkcji przez wartość ............................... 3 Kod przedmiotu: ES1C200 009 2.2. Przekazywanie parametrów do funkcji przez wskaźnik ............................. 4 (studia stacjonarne) 2.3. Przekazywanie tablicy jednowymiarowej (wektora) do funkcji .................. 5 2.4. Przekazywanie tablicy dwuwymiarowej (macierzy) do funkcji ................... 7 2.5. Rekurencyjne wywołanie funkcji ............................................................... 9 3. Przebieg ćwiczenia ....................................................................................... 10 JĘZYK C - PRZEKAZYWANIE PARAMETRÓW DO FUNKCJI, REKURENCJA 4. Literatura ....................................................................................................... 11 5. Zagadnienia na zaliczenie ............................................................................ 11 6. Wymagania BHP ........................................................................................... 11 Numer ćwiczenia INF11 _____________ Materiały dydaktyczne przeznaczone dla studentów Wydziału Elektrycznego PB. Autor: dr inż. Jarosław Forenc Białystok 2013 © Wydział Elektryczny, Politechnika Białostocka, 2013 Wszelkie prawa zastrzeżone. Żadna część tej publikacji nie może być kopiowana i odtwarzana w jakiejkolwiek formie i przy użyciu jakichkolwiek środków bez zgody posiadacza praw autorskich. Informatyka 1 2 z 12 Instrukcja INF11 printf("main1: a = %3d, b = %3d \n",a,b); fun(a,b); printf("main2: a = %3d, b = %3d \n",a,b); 1. Opis stanowiska 1.1. Stosowana aparatura return 0; Podczas zajęć wykorzystywany jest komputer klasy PC z systemem operacyjnym Microsoft Windows (XP/Vista/7). 1.2. Oprogramowanie Na komputerach zainstalowane jest środowisko programistyczne Microsoft Visual Studio 2008 Standard Edition lub Microsoft Visual Studio 2008 Express Edition zawierające kompilator Microsoft Visual C++ 2008. 2. Wiadomości teoretyczne } Wynik działania programu: main1: fun1: fun2: main2: a a a a = = = = 20, 20, 10, 20, b b b b = = = = 20 20 10 20 Po powrocie z funkcji fun() wartości zmiennych a i b nie zmieniły się, gdyż w funkcji fun() pracowaliśmy na ich kopiach (posiadających takie same nazwy). 2.2. Przekazywanie parametrów do funkcji przez wskaźnik 2.1. Przekazywanie parametrów do funkcji przez wartość Przekazywanie parametrów przez wartość oznacza, że po przekazaniu sterowania do funkcji tworzone są kopie zmiennych przekazywanych do funkcji i wszystkie działania w funkcji wykonywane są na kopiach. Przekazywanie parametrów przez wskaźnik polega na tym, że do funkcji przekazywane są adresy zmiennych. Wszystkie operacje w funkcji wykonywane są zatem na zmiennych z funkcji wywołującej (poprzez ich adres). Przekazywanie parametrów do funkcji przez wskaźnik. Przekazywanie parametrów do funkcji przez wartość. #include <stdio.h> #include <stdio.h> void fun(int *a, int *b) { printf("fun1: a=%3d, b=%3d \n",*a,*b); *a = 10; *b = 10; printf("fun2: a=%3d, b=%3d \n",*a,*b); } void fun(int a, int b) { printf("fun1: a=%3d, b=%3d \n",a,b); a = 10; b = 10; printf("fun2: a=%3d, b=%3d \n",a,b); } int main() { int a = 20, b = 20; int main() { int a = 20, b = 20; printf("main1: a = %3d, b = %3d \n",a,b); Informatyka 1 3 z 12 Instrukcja INF11 Informatyka 1 4 z 12 Instrukcja INF11 lub fun(&a,&b); printf("main2: a = %3d, b = %3d \n",a,b); void zeruj(int tab[5]) { } return 0; } Wynik działania programu: main1: fun1: fun2: main2: a a a a = = = = 20, 20, 10, 10, b b b b W wywołaniu funkcji podajemy natomiast tylko nazwę wektora: = = = = 20 20 10 10 zeruj(tab); Po powrocie z funkcji fun() wartości zmiennych a i b zostały zmienione. Do funkcji fun() przekazane zostały adresy zmiennych a i b (&a, &b). W funkcji tej pracowaliśmy na zmiennych poprzez ich adresy. W poniższym programie znajduje się funkcja, do której przekazywana jest tablica jednowymiarowa (wektor). Przekazywanie do funkcji tablicy jednowymiarowej (wektora). W funkcji main(): #include <stdio.h> int a; a &a - deklaracja zmiennej typu int, - zmienna typu int, - adres zmiennej, a nie jej wartość. void zeruj(int tab[5]) { int i; for (i=0; i<5; i++) tab[i] = 0; W funkcji fun(): int *a; a *a - deklaracja zmiennej wskaźnikowej (wskaźnik do int), - adres zmiennej typu int, - wartość zmiennej wskazywanej przez a. } int main() { int i, tab[5] = {1,2,3,4,5}; 2.3. Przekazywanie tablicy jednowymiarowej (wektora) do funkcji for (i=0; i<5; i++) printf("%3d",tab[i]); printf("\n"); Tablice jednowymiarowe są przekazywane do funkcji przez wskaźnik. W nagłówku funkcji umieszczamy typ elementów wektora, jego nazwę i same nawiasy kwadratowe lub nawiasy kwadratowe z rozmiarem wektora: void zeruj(int tab[]) { } Informatyka 1 zeruj(tab); for (i=0; i<5; i++) printf("%3d",tab[i]); printf("\n"); return 0; } 5 z 12 Instrukcja INF11 Informatyka 1 6 z 12 Instrukcja INF11 Wynikiem działania powyższego programu jest: 1 0 2 0 3 0 4 0 int i, j; for (i=0; i<2; i++) for (j=0; j<3; j++) tab[i][j] = 0; 5 0 Do funkcji zeruj() jest przekazywany adres wektora. Wszystkie operacje dokonane na wektorze w funkcji są uwzględnione po wyjściu z niej. 2.4. Przekazywanie tablicy dwuwymiarowej (macierzy) do funkcji Przy przekazywaniu do funkcji tablicy dwuwymiarowej musimy koniecznie podać liczbę wierszy i kolumn lub tylko liczbę kolumn: void zeruj(int tab[2][3]) { } } void drukuj(int tab[2][3]) { int i, j; for (i=0; i<2; i++) { for (j=0; j<3; j++) printf("%3d",tab[i][j]); printf("\n"); } printf("\n"); } int main() { int i, j, tab[2][3] = {{1,2,3},{4,5,6}}; lub drukuj(tab); zeruj(tab); drukuj(tab); void zeruj(int tab[][3]) { } return 0; } W wywołaniu funkcji podajemy natomiast tylko nazwę tablicy: Wynikiem działania powyższego programu jest: zeruj(tab); W poniższym programie znajduje się funkcja, do której przekazywana jest tablica dwuwymiarowa (macierz). 1 4 2 5 3 6 0 0 0 0 0 0 Do funkcji zeruj() jest przekazywany adres macierzy. Wszystkie operacje dokonane na macierzy w funkcji są uwzględnione po wyjściu z niej. Przekazywanie do funkcji tablicy dwuwymiarowej (macierzy). #include <stdio.h> void zeruj(int tab[][3]) { Informatyka 1 7 z 12 Instrukcja INF11 Informatyka 1 8 z 12 Instrukcja INF11 2.5. Rekurencyjne wywołanie funkcji 3. Przebieg ćwiczenia Rekurencyjne wywołanie funkcji polega na ponownym jej wywołaniu zanim skończyło się jej poprzednie wywołanie. Poniżej znajdują się trzy wersje funkcji obliczającej silnię liczby n. Na pracowni specjalistycznej należy wykonać wybrane zadania wskazane przez prowadzącego zajęcia. W różnych grupach mogą być wykonywane różne zadania. 1. Napisz program zawierający następujące funkcje wykonujące operacje na N - elementowym wektorze liczb całkowitych: Wersja 1 - funkcja obliczająca silnię liczby (wersja nierekurencyjna). int silnia(int n) { int i, wynik = 1; - generuj() - funkcja zapisująca do wektora wygenerowane pseudolosowo liczby całkowite z zakresu 〈a, b〉〉, gdzie a i b są argumentami funkcji; - wyswietl() - funkcja wyświetlająca elementy wektora w jednym wierszu; for (i=1; i<=n; i++) wynik = wynik * i; - suma() - funkcja zwracająca sumę elementów wektora; - norma_max() - funkcja zwracająca wartość normy pierwszej wektora (największa wartość w wektorze co do modułu); return wynik; } - odwroc() - funkcja odwracająca kolejność elementów w wektorze. Wersja 2 - funkcja obliczająca silnię liczby (wersja rekurencyjna). 2. Napisz funkcję, do której przekazywany jest N - elementowy wektor liczb całkowitych oraz liczba całkowita x. Funkcja powinna obliczyć i zwrócić ilość wystąpień liczby x w wektorze. int silnia(int n) { if (n<=1) return 1; else return n*silnia(n-1); } 3. Napisz funkcję, do której przekazywana jest N× ×M - elementowa tablica liczb całkowitych. Funkcja powinna odwrócić kolejność elementów w poszczególnych wierszach tablicy. 4. Tablica liczb rzeczywistych pojedynczej precyzji ma N wierszy i 3 kolumny. Pierwsza i druga kolumna zawierają, odpowiednio, współrzędne x i y punktów znajdujących się w prostokątnym układzie współrzędnych. Napisz program, który dla każdego punktu zapisze w trzeciej kolumnie jego odległość od początku układu współrzędnych. Do obliczenia odległości punktu od początku układu współrzędnych zastosuj dodatkową funkcję. Odległość punktu (x, y) od początku układu współrzędnych określona jest wzorem: Wersja 3 - funkcja obliczająca silnię liczby (wersja rekurencyjna). int silnia(int n) { return n ? n*silnia(n-1) : 1; } d= Informatyka 1 9 z 12 Instrukcja INF11 Informatyka 1 x2 + y2 10 z 12 (1) Instrukcja INF11 5. Napisz funkcję rekurencyjną sumującą liczby od 1 do n, gdzie n jest dodatnią liczbą całkowitą będącą argumentem funkcji. 6. Ciąg Fibonacciego opisany jest następującym wzorem rekurencyjnym: f1 = 1, f 2 = 1, ..., f n = f n−1 + f n−2 dla n > 2 (2) Napisz funkcję obliczającą rekurencyjnie wartość n-tego wyrazu tego ciągu. W trakcie zajęć laboratoryjnych należy przestrzegać następujących zasad. - Sprawdzić, czy urządzenia dostępne na stanowisku laboratoryjnym są w stanie kompletnym, nie wskazującym na fizyczne uszkodzenie. - Jeżeli istnieje taka możliwość, należy dostosować warunki stanowiska do własnych potrzeb, ze względu na ergonomię. Monitor komputera ustawić w sposób zapewniający stałą i wygodną obserwację dla wszystkich członków zespołu. - Sprawdzić prawidłowość połączeń urządzeń. 4. Literatura [1] Kernighan B.W., Ritchie D.M.: Język ANSI C. Programowanie. Wydanie II. Helion, Gliwice, 2010. [2] Prata S.: Język C. Szkoła programowania. Wydanie V. Helion, Gliwice, 2006. [3] King K.N.: Język C. Nowoczesne programowanie. Wydanie II. Helion, Gliwice, 2011. [4] Summit S.: Programowanie w języku C. FAQ. Helion, Gliwice, 2003. [5] Wileczek R.: Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows. Helion, Gliwice, 2009. - Załączenie komputera może nastąpić po wyrażeniu zgody przez prowadzącego. - W trakcie pracy z komputerem zabronione jest spożywanie posiłków i picie napojów. - W przypadku zakończenia pracy należy zakończyć sesję przez wydanie polecenia wylogowania. Zamknięcie systemu operacyjnego może się odbywać tylko na wyraźne polecenie prowadzącego. - Zabronione jest dokonywanie jakichkolwiek przełączeń oraz wymiana elementów składowych stanowiska. 5. Zagadnienia na zaliczenie - Zabroniona jest zmiana konfiguracji komputera, w tym systemu operacyjnego i programów użytkowych, która nie wynika z programu zajęć i nie jest wykonywana w porozumieniu z prowadzącym zajęcia. 1. Wyjaśnij różnice w przekazywaniu parametrów do funkcji przez wartość i wskaźnik. - W przypadku zaniku napięcia zasilającego należy niezwłocznie wyłączyć wszystkie urządzenia. 3. Co to jest rekurencyjne wywołanie funkcji i kiedy jest stosowane? - Stwierdzone wszelkie braki w wyposażeniu stanowiska oraz nieprawidłowości w funkcjonowaniu sprzętu należy przekazywać prowadzącemu zajęcia. 6. Wymagania BHP - Zabrania się samodzielnego włączania, manipulowania i korzystania z urządzeń nie należących do danego ćwiczenia. 2. Opisz sposób przekazywania do funkcji tablic jedno- i dwuwymiarowych. Warunkiem przystąpienia do praktycznej realizacji ćwiczenia jest zapoznanie się z instrukcją BHP i instrukcją przeciw pożarową oraz przestrzeganie zasad w nich zawartych. Informatyka 1 11 z 12 Instrukcja INF11 - W przypadku wystąpienia porażenia prądem elektrycznym należy niezwłocznie wyłączyć zasilanie stanowiska. Przed odłączeniem napięcia nie dotykać porażonego. Informatyka 1 12 z 12 Instrukcja INF11