W dzisiejszym odcinku przyjrzymy się bliżej operatorom logicznym oraz arytmetycznym. Poznamy też niektóre sposoby przekształcania danych.
Operatory arytmetyczne, które składają się z dwóch argumentów to: +, -, *, /, %. Ostatni z nich to modulo, czyli operator dzielenia:
x % y
Wynikiem takiego działania będzie reszta z dzielenia x przez y. Wynik będzie więc równy 0, jeżeli y jest podzielnikiem x. Operatora & nie można stosować do zmiennych typu float i double. Napiszmy zatem program, który będzie sprawdzał podzielność dwóch liczb. Do tego celu użyjemy funkcji pobierz(), którą zajmowaliśmy się w poprzednim odcinku kursu.
#include <stdio.h> int pobierz(void); main() { int x = 0; int y = 0; int wynik = 0; printf("Program bada podzielność dwóch liczb\n"); printf("Podaj dzielną: "); x = pobierz(); printf("\nPodaj dzielnik: "); y = pobierz(); if(x % y == 0){ printf("\nLiczba %d jest dzielnikiem liczby %d\n",y,x); wynik = x / y; printf("Wynik dzielenia wynosi: %d\n",wynik); return(0); } else if(x % y != 0){ printf("\nLiczba %d nie jest dzielnikiem liczby %d\n",y,x); wynik = x % y; printf("Reszta z dzielenia: %d\n",wynik); 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 następuje deklaracja zmiennych x, y, wynik oraz przypisanie im wartości 0. Następnie funkcja printf wypisuje na ekranie informacje o programie i prosi o podanie dzielnej. Tutaj zmiennej x poprzez funkcję pobierz, zostaje przypisana wartość pobrana z klawiatury. Dalej znów printf (tym razem z zapytaniem o dzielnik) i przypisanie y wartości z funkcji pobierz. Następnie jest już instrukcja if, która sprawdza modulo (%), czyli resztę z dzielenia liczb x i y. Teraz jeżeli reszta równa jest 0 (czyli x jest podzielna przez y), to printf wypisuje na ekranie napis i wartości x i y, a następnie zmiennej wynik zostaje przypisany wynik z dzielenia x przez y. Potem funkcja printf wypisuje na ekranie wynik z dzielenia, aby przejść następnie do funkcji exit(0), która zakończy działanie programu.
Ale gdyby warunek x % y == 0 nie został spełniony, to przechodzimy do funkcji else if, która sprawdza czy x % y nie jest różne (!=) od zera. Następnie funkcja printf wypisuje na ekranie informacje z y i nie jest dzielnikiem x, a następnie zmiennej wynik zostaje przypisana reszta z dzielenia x i y. Dalej funkcja printf wypisuje tę wartość na ekranie i następuje koniec programu (funkcja return). Nie będziemy omawiali funkcji pobierz gdyż zostało to już zrobione w poprzednim odcinku kursu. Warto do tego programu dodać jeszcze ochronę przed dzieleniem przez 0, np poprzez dodanie przed instrukcją if wyrażenia:
if(y == 0){ printf("BŁĄD: wystąpiło dzielenie przez 0\n"); return(0); }
Ważne żeby ten fragment umiejscowić dopiero po tym jak nastąpi pobieranie znaków z klawiatury, gdyż zmienna y od "nowości" ma wartość 0, a dopiero funkcja pobierz przyporządkowuje jej jakąś inną wartość.
Operatorami relacji są: >, >=, <, <=, ==, !=
Popatrzmy na wyrażenie:
a > b - 5
którego kolejność będzie następująca:
a > (b - 5)
Operatory relacji są wykonywane póżniej (mają niższy priorytet) niż
operatory arytmetyczne.
Operatory logiczne && i || są obliczane od strony lewej do
prawej. Koniec obliczania następuje w momencie kiedy zostanie
określony wynik (prawda lub fałsz).
W języku C występuje jednoargumentowy operator negacji ! (wykrzyknik).
Najczęściej stosowany jest w takiej sytuacji jak ta:
if(!zmienna)
zamiast
if(zmienna == 0)
Jak dotąd poznaliśmy już jeden sposób przekształcania typów. Była to instrukcja atoi, która przekształcała tekst zawarty w tablicy na wartość numeryczną. Czasem przekształcanie typów jest konieczne (jak w przypadku naszej funkcji pobierz), np. nie można używać typów float do indeksowania tablicy. Istnieje jeszcze jednoargumentowy operator zwany rzutem (ang. cast). Zakładając, że funkcja liczenie(double) oczekuje argumentu o typie double, a zmienna a jest typu int, możemy zapisać:
liczenie((double)a);
Sam argument a nie ulega zmianie, zmieniana jest tylko wartość odczytywana przez funkcję liczenie.
W języku C istnieje jeszcze kwalifikator const (stały), który używany
jest do deklaracji zmiennych, których wartości nie chcemy zmieniać
podczas dalszej pracy programu. Wyrażenie:
const int t = 5;
mówi że wartość zmiennej t będzie stała i nie będzie się zmieniać
przez dalszy okres pracy programu. Próba przypisania czegoś do takiej
zmiennej jest nieprawidłowa i w kompilatorze VBCC wywołuje błąd:
"assignment to constant type", czyli przypisanie dla typu const.
Kiedy użyjemy operatora const do deklaracji tablicy:
const char tekst[] = "Tekst";
to każdy z jej elementów nie ulegnie zmianie.
A gdy np użyjemy go do parametrów funkcji:
int zmienna(const int);
to funkcja nie będzie mogła zmienić tej zmiennej.
I to by bylo na tyle w dzisiejszym odcinku kursu.