W poprzednim odcinku dowiedzieliśmy się jak budować swoje funkcje oraz napisaliśmy program który pobierał z klawiatury znaki. Dzisiaj napiszemy coś bardziej skomplikowanego.
W poprzednim odcinku opisane było pobieranie znakow z klawiatury i przekształcanie ich na typ int, czyli na liczby dziesietne. Przyjrzyjmy sie teraz danemu przykładowi, aby przybliżyć sobie pisanie i wykorzystywanie własnych funkcji:
#include <stdio.h> int pobierz(void); main() { printf("Podaj jakąs liczbę: "); printf("\nOto ta liczba:%d\n",pobierz()); return(0); } int pobierz(void) { char s[100]; int c,wynik; int i = 0; while((c = getchar()) != '\n') { if(isdigit(c) == 0 ) { printf("\nTo nie jest cyfra\n"); return(0); } s[i++] = c; } s[i] = '\0'; wynik = atoi(s); return wynik; }
Na początku programu pojawia się deklaracja funkcji pobierz(), która ma zwracać wartość dziesiętną (int) i nie oczekuje żadnego argumentu (void). Następnie funkcja printf prosi o podanie dowolnej liczby, a później przenosi kursor do nowego wiersza "\n" i wywołuje funkcje pobierz, by następnie wypisać na ekranie wartość zwróconą przez pobierz(). Budowa funkcji pobierającej znaki z klawiatury i przekształcającej je na liczby dziesiętne była opisana w poprzednim odcinku. Warto tylko wspomnieć, że funkcja ma "filtr" sprawdzający czy aby na pewno zostały podane cyfry, a nie inne znaki.
W poprzednim odcinku kursu napisany był program, który dodawał do siebie dwie liczby, a użyta tam była funkcja dodaj():
/* definicja funkcji */ int dodaj(int a,int b) { int suma; suma = a + b; return suma; }
Warto wiedzieć, że w języku C wszystkie argumenty jakie będziemy przekazywać funkcji (tutaj int a, int b) są przekazywane przez wartość. Oznacza to, że funkcja nie będzie mogła zmienić bezpośrednio wartości zmiennej w funkcji wywołującej (zmiennej a lub b), a jedynie swoją prywatna kopię tej zmiennej. Dzięki temu takie argumenty mogą być traktowane jako zmienne lokalne (czyli takie które dziąłają tylko na terenie danej funkcji). W naszym przykładzie zmiana zmiennej a:
/* definicja funkcji */ int dodaj(int a,int b) { int suma; a = 5; /* zmiana wartości a */ suma = a + b; return suma; }
nie wpłynie na zmianę zmiennej a poza obrębem funkcji dodaj. Aby zmienić wartośc argumentów przekazywanych funkcji, można posłużyć się wskażnikami, ale poznamy je dopiero w następnych odcinkach...
Zmienne zadeklarowane w funcji main(), np:
main() { int liczba; int zmienna; int zmienna2; }
są zmiennymi, których wartości nie może zmienić żadna inna funkcja, ponieważ nie ma do nich bezpośredniego dostępu, gdyż są one zadeklarowane wewnątrz main(). Tak samo jest ze zmiennymi zadeklarowanymi w innych funkcjach np: zmienna suma w funkcji dodaj, którą napisaliśmy wyżej. Takie zmienne są zwane zmiennymi automatycznymi, gdyż powstają one wraz z ich zadeklarowaniem przez funkcje, a znikają po skończeniu danej funkcji. Jężeli wartość funkcji nie zostanie zadeklarowana, to zmienna ta będzie zawierać śmiecie:
#include <stdio.h> main() { int zmienna; printf("Oto wartość zmiennej :%d\n",zmienna); return(0); }
Program ten wypisuje wartość zadeklarowanej zmiennej. Można zobaczyć co będzie wypisane jeżeli nie będzie zadeklarowana wartość funkcji.
Istnieje jeszcze inny typ zmiennych, zwanych zmiennymi zewnętrznymi. Zmienne te są przeciwieństwem zmiennych automatycznych, gdyż nie znikają wraz z zakończeniem działania funkcji, ale istnieją w programie przez cały czas. Zmienne zewnętrzne muszą być zadeklarowane na zewnątrz wszystkich funkcji:
#include <stdio.h> void test(void); int zmienna = 5; main() { printf("Oto wartość zmiennej :%d\n",zmienna); printf("Wywołanie funkcji test\n"); test(); return(0); } void test(void) { printf("Oto wartość zmiennej: %d\n",zmienna); }
Program ten demonstruje działanie zmiennych zewnętrznych. Na początku następuje deklaracja funkcji test oraz zmiennej "zmienna", której jednocześnie przypisywana jest wartość 5. W funkcji main() funkcja printf() wypisuje wartość zmiennej "zmienna", następnie informuje o wywołaniu funkcji test i następuje samo wywołanie. Funkcja test przy użyciu printf także wypisuje wartość zmiennej "zmienna". Jak widać dostęp do zmiennej mają wszystkie funkcje w programie.
Teraz poznamy bardzo prostą funkcję przy użyciu której możemy uruchamiać inne programy:
#include <stdio.h> main() { system("C:dir c:"); return(0); }
Działanie tej funkcji jest proste, funkcja ta wykonuje linijkę zawartą między nawiasami. Jej deklaracja jest następująca:
int system(const char *)
Funkcja przekazuje tekst zawarty w s (słowo const oznacza stały, tzn. że zmienna nie zmienia swojej wartości) jako polecenie do wykonywania przez interpretator poleceń (shell)...