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