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.