Laboratorium nr 5
1/6
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[ ].
Język C
Temat: Funkcje, parametry linii poleceń, typ wyliczeniowy.
Instrukcja
laboratoryjna
5
Przygotował: mgr inż. Maciej Lasota
Laboratorium nr 5
2/6
Przykład:
#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);
return (0);
}
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.
Przykład:
#include <stdio.h>
#include <stdlib.h>
int warunek(int a, int b)
{
if(a > b)
{
return (1);
}
if(a < b)
{
return (2);
}
return (0);
}
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);
}
return (0);
}
Przykład:
#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));
return (0);
}
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).
Przykład:
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;