W poprzednim odcinku poznaliśmy podstawowe funkcje pobierania danych z klawiatury, a dzisiaj poznamy działanie funkcji if, zajmiemy się tablicami i poznamy trochę nowych funkcji.
Na początku zajmiemy się właśnie funkcją if, więc popatrzmy na ten mały przykładzik:
#include <stdio.h> main() { int zmienna; printf("Jesteś kobietą czy mężczyzną?\n"); printf("1-kobieta\n"); printf("2-mężczyzna\n"); zmienna=getchar(); /* Sprawdzanie co zostalo wpisane */ /* jeżeli 1 to kobieta */ if(zmienna == '1'){ printf("A więc jesteś kobietą...\n"); return(0); } /* jeżeli 2 to mężczyzna */ else if(zmienna == '2'){ printf("A więc jesteś mężczyzną...\n"); return(0); } /* jeżeli ani 1 ani 2 */ printf("Hmmm, coś z tobą nie tak\n"); return(0); }
W poprzednich częściach kursu poznaliśmy funkcje, które zostały użyte w tym przykładzie, więc nie powinno być problemów z niezrozumieniem ich. Sercem programu jest tutaj instrukcja if. Instrukcja ta sprawdza czy warunek napisany między nawiasami okrągłymi jest prawdziwy, jeżeli tak to wykonywane są instrukcje zawarte między nawiasami klamrowymi. Jeżeli warunek nie jest prawdziwy to instrukcje te zostają pominięte. Pojawia się tutaj operator ==, który oznacza znak równości, więc wyrażenie:
if(zmienna == '1') { ... ... }
oznacza: jezeli zmienna "zmienna" równa się '1' to wykonuj dalej instrukcję.
Nasz program na początku deklaruje zmienną "zmienna", następnie wypisuje na ekranie napis przy użyciu printf, pytając użytkownika oto czy jest mężczyzną czy kobietą. Dalej jest funkcja getchar, która pobiera dane z klawiatury. Następnie jest już funkcja if. Po uruchomieniu programu zostaniemy poproszeni o podanie odpowiednio 1 - jeśli użytkownik jest kobietą lub 2 - jeśli jest mężczyzną. Szkoda, że na większości ekranów zagości napis "A więc jesteś mężczyzną..."
W naszym przykładzie jest jeszcze wyrazenie "else if", które działa tak samo jak funkcja if, ale zawsze występuje po niej. W naszym przykładzie funkcja ta sprawdza drugą ewentualność wyboru między mężczyzną a kobietą. Oprócz "else if" istnieje samo "else". Napiszmy mały programik z wykorzystaniem właśnie else:
#include <stdio.h> main() { int zmienna; printf("Napisz literę q:"); zmienna=getchar(); /* sprawdzanie czy zostało wpisane q */ if(zmienna == 'q'){ printf("Napisałeś q...\n"); return(0); } /* jeżeli nie to: */ else { printf("Nie napisałeś q...\n"); return(0);} }
W tym przykładzie program prosi o napisanie litery q. Funkcja if sprawdza co zostało napisane i jeżeli jest to q, to funkcja printf wypisuje na ekranie napis i następuje koniec programu (exit). Jeżeli nie jest to q, to przechodzimy do else, gdzie wykonywane są instrukcje zawarte między nawiasami klamrowymi (printf i exit). Wnioskujemy z tego, że instrukcje zawarte w else, są wykonywane jeżeli warunek sprawdzany w if będzie nieprawdą. Popatrzmy teraz na następujący przykład:
#include <stdio.h> main() { int zmienna; printf("Napisz cyfrę od 1 do 3\n"); zmienna = getchar(); if(zmienna == '1' || zmienna == '2' || zmienna == '3'){ printf("Cyfra mieści się w przedziale 1-3\n"); return(0); } else { printf("Cyfra nie mieści się w przedziale 1-3\n"); return(0); } }
Program zaczyna się od komunikatu proszącego o wpisanie cyfry od 1 do 3. Dalej z klawiatury pobierany jest znak, który jest zapisywany do zmiennej "zmienna". Operator logiczny (||) pojawiający się przy funkcji if to "or" czyli "lub". W naszym przypadku taki zapis oznacza:
Jeżeli "zmienna" równa się 1 lub zmienna równa się 2 lub zmienna równa się 3 to wykonuj funkcje ujęte między nawiasy klamrowe funkcji if. Oprócz operatora "or" występuje również && "and", czyli "i". Priorytet operatora && jest wyższy niż priorytet operatora ||. Cały warunek sprawdzany jest od strony lewej do prawej, więc jeżeli "zmienna" będzie miała wartość 1, dalsze warunki (zmienna == '2' itd.) nie będą sprawdzane.
W języku C, podobnie jak np. w Amosie, występują tablice. Deklaracja
int tablica[10];
deklaruje tablicę składającą się z 10 liczb całkowitych (int). Indeksy zaczynają się zawsze od zera np. tablica[0], tablica[1]... tablica[9] Indeksem może być tutaj wyrażenie o wartości stałej, zawierające zmienne całkowite, jak i stałe całkowite. Przypisanie tablica[0] = 5; przypisze zerowemu elementowi tablicy wartość 5. Napiszemy teraz program który będzie liczył sumę dwóch liczb pobranych z klawiatury:
#include <stdio.h> main() { char s[100]; int liczba1,liczba2,c,wynik; int i = 0; printf("Podaj pierwszą liczbę: "); while((c = getchar()) != '\n') { if(isdigit(c) == 0 && c != '-') { printf("\nTo nie jest cyfra\n"); return(0); } s[i++] = c; } s[i] = '\0'; liczba1 = atoi(s); i = 0; printf("Podaj drugą liczbę: "); while((c = getchar()) != '\n') { if(isdigit(c) == 0 && c != '-') { printf("\nTo nie jest cyfra\n"); return(0); } s[i++] = c; } s[i] = '\0'; liczba2 = atoi(s); wynik = liczba1 + liczba2; printf("Suma liczb %d i %d to %d\n",liczba1,liczba2,wynik); return(0); }
Na początku programu następuje deklaracja zmiennych liczba1, liczba2, c oraz wynik. Deklarowana jest także tablica s o 100 elementach oraz zmienna i, której od razu przypisywana jest wartosc 0. Następnie poprzez funkcję printf proszeni jesteśmy o podanie pierwszej liczby. Potem jest już pętla while w której sprawdzany jest warunek czy ((c=getchar()) != '\n'), czyli czy przypadkiem nie naciśnięty został klawisz enter. Potem jest instrukcja if, w której filtrowane są dane pochodzące z klawiatury. Użyta jest tutaj funkcja isdigit(), która pochodzi ze standardowej biblioteki (stdio.h). Funkcja ta zwraca wartość 1, czyli TRUE (prawda), jeżeli zawartością zmiennej którą podamy funkcji (w naszym przypadku c) będą cyfry dziesiętne. Jeżeli zawartością zmiennej nie będą cyfry dziesiętne, to wtedy funkcja zwróci wartość 0, czyli FALSE (nieprawda). Występuje tutaj także operator logiczny && (i), który nakazuje sprawdzenie także czy zmienna nie jest równa '-' (minus), gdyż może wystąpić też taka możliwość że zostanie podana liczba ujemna. Jeżeli kryterium zostanie spełnione, to oznacza to że zawartość zmiennej c nie jest cyfrą dziesiętną, więc zostaje wyświetlony stosowny komunikat i następuje zakończenie programu. Dalej tablicy s zostaje przypisana wartość c. Na początku wartość zmiennej "i" wynosi 0, więc wartość pierwszemu wyrazowi zostaje przypisana pierwsza cyfra (jeżeli mamy do czynienia z liczbą wielocyfrową). Wyrażenie i++ zwiększa wartość jakiejś zmiennej o 1, więc każdemu następnemu wyrazowi tablicy s zostanie przypisana następna cyfra z danej liczby, tzn. jezeli liczbą będzie np: 123, to 0 wyraz będzie miał wartość 1, pierwszy 2, drugi 3 .Na końcu każdego łańcucha musi być wyrażenie '\0', więc zostaje one tam przypisane. Następnie funkcja atoi() zamienia zawartość tablicy s na liczbę dziesiętną,a wynik przekazuje zmiennej "liczba1". Potem zerowana jest zmienna i, a cała operacja jest powtarzana, ale tym razem pobierana jest liczba2. Na końcu liczony jest "wynik" i wszystko zostaje wyprowadzone na ekran za pomocą printf. Na sam koniec została funkcja return(0) powodująca wyjście z programu.
Zajmijmy się jeszcze raz funkcjami, które sprawdzają z jakim typem
danych mamy do czynienia. Omówilśmy już użytą wyżej funkcję
isdigit(), teraz poznamy trochę więcej. Wszystkie funkcje zwracają
wartość 1 lub 0, jak to było w przypadku funkcji isdigit(). Jeżeli
argumentem c będzie zmienna zawierająca dane. które chcemy sprawdzić
to:
iscntrl(c) - zwraca jeden, jeżeli jest to znak kontrolny (znaki z przedziału 0 (NUL) i 0x1F (US) oraz znak 0x7F (DEL)).
isgraph(c) - zwraca jeden, jeżeli jest to znak drukowalny za wyjątkiem odstępu (przedział 0x20 (' ') i 0x7E ('~'))
islower(c) - zwraca jeden, jeżeli jest to mała litera.
isprint(c) - zwraca jeden, jeżeli jest to znak drukowalny łącznie z odstępem.
ispunct(c) - zwraca jeden, jeżeli jest to znak drukowalny za wyjątkiem odstępu, liter i cyfr.
isspace(c) - zwraca jeden, jeżeli jest to odstęp, nowa strona, nowy wiersz, tabulator, pionowy tabulator.
isupper(c) - zwraca jeden, jeżeli jest to wielka litera.
isxdigit(c) - zwraca jeden, jeżeli jest to cyfra szesnastkowa.
isalnum(c) - kiedy prawdą jest albo isalpha(c) albo isdigit(c)
isalpha(c) - kiedy prawdą jest albo isupper(c) albo islower(c)
Wszystkie funkcje dostępne są ze standardowej biblioteki i otrzymamy
je kiedy napiszemy:
#include <stdio.h>
W języku C mamy możliwość pisania swoich funkcji, dzięki czemu możemy pewną część programu zamknąć w jednej instrukcji. Dotąd korzystaliśmy już z gotowych funkcji jak getchar(), printf(), putchar() a teraz nauczymy się pisać swoje funkcje. Napiszmy teraz funkcję, która będzie dodawała dwie liczby. Funkcja dodaj(a,b) będzie dodawała liczbę a i b i zwracała wynik:
#include <stdio.h> /* definicja funkcji */ int dodaj(int a,int b); main() { int a = 5; int b = 6; printf("Suma: %d\n",dodaj(a,b)); return(0); } /* definicja funkcji */ int dodaj(int a,int b) { int suma; suma = a + b; return suma; }
Po uruchomieniu programu, na ekranie powinien pojawić się napis "Suma: 11". Komenda "return wyrażenie;" zwraca do funkcji main jakieś wyrażenie. Instrukcja nie musi zwracać żadnej wartości, czasem sama może coś wypisywać na ekranie itp. W naszym przypadku funkcja dodaj zwraca dla funkcji printf same liczby 5 i 6. Przed funkcją main występuje deklaracja "int dodaj (int a,int b);", która pokazuje że funkcja dodaj zwraca typ int, a oczekuje dwóch argumentów typu int. Taka deklaracja zwana jest prototypem funkcji i musi być zgodna z definicją funkcji i jej wywołaniem. Nazwy parametrów nie są istotne, równie dobrze może to wyglądać tak:
int dodaj(int,int);
I to by było na tyle... W następnym odcinku napiszemy bardziej skomplikowany program z wykorzystaniem funkcji własnej roboty. Na koniec jeszcze jedno. Aby wyczyścić ekran ze znaków, należy użyć funkcji:
printf("\f");