Laboratorium nr 5 1/6 Język C Instrukcja laboratoryjna Temat: Funkcje, parametry linii poleceń, typ wyliczeniowy. 5 Przygotował: mgr inż. Maciej Lasota 1) Parametry linii poleceń. Język C oprócz wprowadzania danych za pomocą odpowiednich funkcji biblioteki standardowej (scanf, sscanf, getchar, getc, gets itp.) umożliwia również tworzenie programów, w których dane wprowadzane są z linii poleceń (podczas wywoływania programu) przez użytkownika. Wprowadzanie danych z linii poleceń polega na podaniu listy argumentów po nazwie programu podczas wywoływania. Obsługa parametrów wymaga stworzenia odpowiedniej funkcji głównej main. Przykład takiej funkcji został przedstawiony poniżej: int main(int argc, char *argv[])... return(0); *argv[ ] jest to parametr, który jest wskaźnikiem na tablicę znakową zawierającą wszystkie argumenty wprowadzane z linii poleceń. Pierwszym elementem tablicy argv[0] jest zawsze nazwa programu. argc jest to parametr, który zawiera liczbę całkowitą. Liczba ta określa ilość przekazywanych argumentów do programu z linii poleceń. Zarazem argc jest indeksem tablicy argv[ ].
Laboratorium nr 5 2/6 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) int a,b,wynik; if(argc!= 3) printf("program dodaje dwie liczby, podaj dwa parametry!!!\n"); exit(1); a = atoi(argv[1]); //konwersja na liczbe calkowita b = atoi(argv[2]); //konwersja na liczbe calkowita printf("nazwa programu: %s\n",argv[0]); printf("parametr A: %d\n",a); printf("parametr B: %d\n",b); wynik = (a+b); printf("wynik dodawania: %d\n",wynik); 2) Funkcje. Funkcje umożliwiają podzielenie oraz pogrupowanie często wykonywanego kodu źródłowego (instrukcji programu) na mniejsze moduły (bloki), które mogą być wielokrotnie wykorzystywane w programie. Zadaniem funkcji zazwyczaj jest wykonywanie określonych operacji oraz zwracanie lub też nie określonej wartości. Często ukrywają one w sobie szczegóły pewnych operacji przed innymi częściami programu, w których znajomość tych szczegółów jest zbędna lub niewskazana. Wykorzystywanie funkcji w programie daje większą przejrzystość kodu oraz łatwiejsze wprowadzanie zmian. Funkcja główna jest to podstawowa funkcja, od której zaczyna działanie każdy program napisany w języku C. Funkcja ta musi występować w każdym pliku źródłowym, który kompilujemy i który później będziemy wykonywać jako program (nie dotyczy plików źródłowych kompilowanych jako moduły). W języku C funkcją główną jest funkcja main. Może ona zwracać określona wartość lub nie zwracać żadnej wartości, wszystkie pozostałe zdefiniowane funkcje zawsze wywołujemy z wnętrza funkcji main.
Laboratorium nr 5 3/6 Deklaracja funkcji w języku C wygląda następująco: [typ danych funkcji] [nazwa funkcji]([parametry funkcji]) [deklaracja zmiennych lokalnych] instrukcja1; instrukcja2;... [zwracana wartość]; Parametry funkcji są to zmienne przekazywane, do ciała funkcji w celu wykonania na nich operacji (działań). W języku C wszystkie parametry przekazywane są przez wartość, oznacza to że operujemy jedynie na kopiach zmiennych, a nie na oryginalnych zmiennych. Zmienne lokalne funkcji są to zmienne widoczne tylko w obrębie danego bloku (ciała funkcji), tworzone są w momencie inicjowania (wywoływania) i niszczona w momencie kończenia funkcji. Kolejne wywołanie tej samej funkcji tworzy nowe instancje zmiennych. Zasięg nazw jest ta cześć programu, wewnątrz której można daną nazwę zmiennej stosować. W przypadku zmiennych lokalnych funkcji zasięg nazw ogranicza się jedynie do danego bloku instrukcji (ciała funkcji). Zmienne lokalne o tej samej nazwie, które występują w różnych funkcjach nie są ze sobą powiązane w żaden sposób. #include <stdio.h> #include <stdlib.h> int warunek(int a, int b) if(a > b) return (1); if(a < b) return (2);
Laboratorium nr 5 4/6 int main(void) int x,y; printf("podaj liczbe calkowita \"x\": "); scanf("%d",&x); printf("podaj liczbe calkowita \"y\": "); scanf("%d",&y); if(warunek(x,y) == 1) printf("liczba %d jest wieksza od liczby %d\n",x,y); else if(warunek(x,y) == 2) printf("liczba %d jest mniejsza od liczby %d\n",x,y); else printf("liczba %d jest rowna liczbie %d\n",x,y); #include <stdio.h> #include <stdlib.h> float suma(float a, float b) return(a+b); float roznica(float a, float b) return(a-b); float iloczyn(float a, float b) return(a*b); float iloraz(float a, float b) return(a/b);
Laboratorium nr 5 5/6 int main(int argc, char *argv[]) float x,y; if(argc!= 3) printf("blad!, wywolanie programu: %s [liczba1] [liczba2]\n",argv[0]); exit(0); x = atof(argv[1]); y = atof(argv[2]); printf("suma liczb: %.2f + %.2f = %.4f\n",x,y,suma(x,y)); printf("roznica liczb: %.2f - %.2f = %.4f\n",x,y,roznica(x,y)); printf("iloczyn liczb: %.2f * %.2f = %.4f\n",x,y,iloczyn(x,y)); printf("iloraz liczb: %.2f / %.2f = %.4f\n",x,y,iloraz(x,y)); 3) Rekurencja. Rekurencja lub też rekursja ma miejsce wtedy, gdy dana funkcja w sposób pośredni lub bezpośredni wywołuje samą siebie. W różnych językach programowania funkcja, która wywołuje samą siebie nazywana jest funkcją rekurencyjną. Funkcja rekurencyjna musi spełniać dwa podstawowe założenia: musi posiadać koniec, musi zmniejszać stopień złożoności obliczanego problemu. Definicja silni spełnia obie zasady rekurencji. Po pierwsze, posiada koniec (określony warunkiem n = 0). Po drugie, upraszcza początkowy problem, ponieważ obliczenie wartości wyrażeni (n 1) jest prostsze niż obliczenie wyrażenia (n). int silnia(int liczba) if(liczba == 0) return(1); return(liczba * silnia(liczba-1));
Laboratorium nr 5 6/6 4) Typ wyliczeniowy. Typ wyliczeniowy enum w języku C został stworzony dla zmiennych, które przechowują tylko ograniczony zbiór wartości. Dostęp do tych wartości odbywa się poprzez nazwę tzw. etykietę. Język C implementuje typ wyliczeniowy enum jako zgodny z typem całkowitym, dlatego też, poprawnym sposobem przydzielenie wartości do zmiennej jest podanie numeru określonej etykiety. Ogólna postać instrukcji enum jest następująca: enum nazwa_typu etykieta1, etykieta2,... nazwa_zmiennej;