Politechnika Białostocka Wydział Elektryczny Katedra Elektrotechniki Teoretycznej i Metrologii Instrukcja do pracowni specjalistycznej z przedmiotu Informatyka 1 Kod przedmiotu: EZ1C200 010 (studia niestacjonarne) Spis treści 1. Opis stanowiska... 3 1.1. Stosowana aparatura... 3 1.2. Oprogramowanie... 3 2. Wiadomości teoretyczne... 3 2.1. Przekazywanie parametrów do funkcji przez wartość... 3 2.2. Przekazywanie parametrów do funkcji przez wskaźnik... 4 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 INF08Z Autor: dr inż. Jarosław Forenc Białystok 2013 Materiały dydaktyczne przeznaczone dla studentów Wydziału Elektrycznego PB. 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 INF08Z
1. Opis stanowiska 1.1. Stosowana aparatura 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 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 do funkcji przez wartość. 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 a = 20, b = 20; printf("main1: a = %3d, b = %3d \n",a,b); fun(a,b); printf("main2: a = %3d, b = %3d \n",a,b); Wynik działania programu: main1: a = 20, b = 20 fun1: a = 20, b = 20 fun2: a = 10, b = 10 main2: a = 20, b = 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 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. 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 a = 20, b = 20; printf("main1: a = %3d, b = %3d \n",a,b); Informatyka 1 3 z 12 Instrukcja INF08Z Informatyka 1 4 z 12 Instrukcja INF08Z
fun(&a,&b); printf("main2: a = %3d, b = %3d \n",a,b); lub void zeruj(int tab[5]) Wynik działania programu: main1: a = 20, b = 20 fun1: a = 20, b = 20 fun2: a = 10, b = 10 main2: a = 10, b = 10 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 funkcji main(): int a; a &a W funkcji fun(): - deklaracja zmiennej typu int, - zmienna typu int, - adres zmiennej, a nie jej wartość. int *a; - deklaracja zmiennej wskaźnikowej (wskaźnik do int), a - adres zmiennej typu int, *a - wartość zmiennej wskazywanej przez a. W wywołaniu funkcji podajemy natomiast tylko nazwę wektora: W poniższym programie znajduje się funkcja, do której przekazywana jest tablica jednowymiarowa (wektor). Przekazywanie do funkcji tablicy jednowymiarowej (wektora). void zeruj(int tab[5]) int i; for (i=0; i<5; i++) tab[i] = 0; int i, tab[5] = 1,2,3,4,5; 2.3. Przekazywanie tablicy jednowymiarowej (wektora) do funkcji 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[]) for (i=0; i<5; i++) printf("%3d",tab[i]); for (i=0; i<5; i++) printf("%3d",tab[i]); Informatyka 1 5 z 12 Instrukcja INF08Z Informatyka 1 6 z 12 Instrukcja INF08Z
Wynikiem działania powyższego programu jest: 1 2 3 4 5 0 0 0 0 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: lub void zeruj(int tab[2][3]) void zeruj(int tab[][3]) W wywołaniu funkcji podajemy natomiast tylko nazwę tablicy: W poniższym programie znajduje się funkcja, do której przekazywana jest tablica dwuwymiarowa (macierz). Przekazywanie do funkcji tablicy dwuwymiarowej (macierzy). int i, j; for (i=0; i<2; i++) for (j=0; j<3; j++) tab[i][j] = 0; 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]); int i, j, tab[2][3] = 1,2,3,4,5,6; drukuj(tab); drukuj(tab); Wynikiem działania powyższego programu jest: 1 2 3 4 5 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. void zeruj(int tab[][3]) Informatyka 1 7 z 12 Instrukcja INF08Z Informatyka 1 8 z 12 Instrukcja INF08Z
2.5. Rekurencyjne wywołanie funkcji 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. Wersja 1 - funkcja obliczająca silnię liczby (wersja nierekurencyjna). int silnia(int n) int i, wynik = 1; for (i=1; i<=n; i++) wynik = wynik * i; return wynik; Wersja 2 - funkcja obliczająca silnię liczby (wersja rekurencyjna). int silnia(int n) if (n<=1) return 1; else return n*silnia(n-1); Wersja 3 - funkcja obliczająca silnię liczby (wersja rekurencyjna). int silnia(int n) return n? n*silnia(n-1) : 1; 3. Przebieg ćwiczenia 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: - 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; - 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); - odwroc() - funkcja odwracająca kolejność elementów w wektorze. 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. 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: d + 2 2 = x y (1) Informatyka 1 9 z 12 Instrukcja INF08Z Informatyka 1 10 z 12 Instrukcja INF08Z
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: f 1 = 1 2 n n 1 n 2 >, f = 1,..., f = f + f dla n 2 (2) Napisz funkcję obliczającą rekurencyjnie wartość n-tego wyrazu tego ciągu. 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. 5. Zagadnienia na zaliczenie 1. Wyjaśnij różnice w przekazywaniu parametrów do funkcji przez wartość i wskaźnik. 2. Opisz sposób przekazywania do funkcji tablic jedno- i dwuwymiarowych. 3. Co to jest rekurencyjne wywołanie funkcji i kiedy jest stosowane? 6. Wymagania BHP Warunkiem przystąpienia do praktycznej realizacji ćwiczenia jest zapoznanie się z instrukcją BHP i instrukcją przeciw pożarową oraz przestrzeganie zasad w nich zawartych. 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ń. - 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. - 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. - W przypadku zaniku napięcia zasilającego należy niezwłocznie wyłączyć wszystkie urządzenia. - Stwierdzone wszelkie braki w wyposażeniu stanowiska oraz nieprawidłowości w funkcjonowaniu sprzętu należy przekazywać prowadzącemu zajęcia. - Zabrania się samodzielnego włączania, manipulowania i korzystania z urządzeń nie należących do danego ćwiczenia. - 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 11 z 12 Instrukcja INF08Z Informatyka 1 12 z 12 Instrukcja INF08Z