Instrukcja warunkowa if, operatory
Najprostsza instrukcja warunkowa if ma postać:
if(wyrazenie)instrukcja
Powoduje ona obliczenie wartości wyrażenia i jeśli jest ono prawdziwe (true), czyli jego wartość jest
różna od 0 wykonywana jest instrukcja, jeśli wartość wyrażenia wynosi 0 instrukcja nie jest
wykonywana.
Pełna postać instrukcji if zawiera również słowo kluczowe else, po której następuje instrukcja
wykonywana, gdy wartość wyrażenia jest false.
if(wyrazenie)instrukcja1 else instrukcja2
Schemat blokowy instrukcji warunkowej przedstawia się następująco:
Wyrażenie można utworzyć przy pomocy operatorów arytmetycznych (*, /, +, -, %), operatorów
relacji (<, <=, >, >=, ==, !=), operatorów logicznych (!, &&, ||) oraz nawiasów.
Poniżej przedstawiona została tabela operatorów według malejących priorytetów:
Lp
operator
Łączność
znaczenie
1
(), []
lewostronna
2
-, ~, (typ), !, &, *, ++, --
prawostronna
3
*, /, %
lewostronna
4
+, -
lewostronna
5
<<, >>
lewostronna
bit. przesunięcie w lewo, prawo/ int,
char
6
<, <=, >, >=
lewostronna
7
==, !=
lewostronna
8
&
lewostronna
bitowa koniunkcja/ int, char
9
^
lewostronna
bit. różnica symetryczna/ int, char
10
|
lewostronna
bitowa alternatywa/ int, char
11
&&
lewostronna
AND
12
||
lewostronna
OR
13
?:
prawostronna
wyrażenie warunkowe
14
=
prawostronna
podstawienie
15
,
lewostronna
TRUE
FALSE
wyrażenie
instrukcja1
instrukcja2
Znaczenie operatorów::
[ ]
- odwołania do elementów tablicy
~
- uzupełnienie jedynkowe – zamienia każdy bit na przeciwny (1 -> 0; 0 -> 1)
*
- wskaźnik do obiektu /operator jednoargumentowy)
++
- inkrementacja, czyli zwiększenie o 1( np. i++ oznacza i+1) /int
--
- dekrementacja czyli zmniejszenie o 1( np. i-- oznacza i-1) /int
==
- operator przyrównania (np. a==0 sprawdza, czy a jest równe 0)
!=
- operator relacji różny od (np. a!=0 sprawdza, czy a jest różne od 0)
,
- operator przecinkowy – oddziela wyrażenia, które są interpretowane od lewej do prawej
strony
?:
- w1?w2:w3 – odpowiada instrukcji warunkowej: if(w1) w2 else w3
Przykład:
Oto schemat blokowego i programu, który wczytuje dwie liczby całkowite i sprawdza, która z nich jest
większa:
START
czytaj a,b
a>b
STOP
TAK
NIE
pisz a
pisz b
lub równe
int main(int argc, char *argv[])
{
//max(a,b)
int a, b;
printf("\n\n\ta=");
scanf("%d",&a);
printf("\n\n\tb=");
scanf("%d",&b);
if(a>b)
printf("a jest wieksze\n");
else
printf("b jest wieksze lub rowna a\n\n\n");
}
Poniżej przedstawiony jest fragment programu, w którym wyróżniony został przypadek, gdy
wprowadzone liczby są równe. Należy zastosować dwie instrukcje warunkowe:
.
.
.
if(a>b)
printf("\n\ta jest wieksze\n\n");
else
if(a==b)
printf("\n\ta i b sa rowne\n\n");
else
printf("\n\tb jest wieksze \n\n\n");
}
W kolejnym przykładzie wczytywane są trzy liczby całkowite, a zadaniem jest znalezienie największej
z nich.
int main(int argc, char *argv[])
{
//max(a,b,c)
int a, b,c;
printf("\n\n\ta=");
scanf("%d",&a);
printf("\n\n\tb=");
scanf("%d",&b);
printf("\n\n\tc=");
scanf("%d",&c);
if(a>b)
if(a>c)
printf("\n\ta jest wieksze\n\n");
else
printf("\n\tc jest wieksze\n\n");
else
if(b>c)
printf("\n\tb jest wieksze\n\n");
else
printf("\n\tc jest wieksze \n\n\n");
}
START
czytaj a,b,c
a>b
STOP
a>c
b>c
TAK
TAK
TAK
NIE
NIE
NIE
pisz
a
pisz c
pisz b
pisz c
W następnym przykładzie obliczane są pierwiastki równania liniowego: bx+c=0.
int main(int argc, char *argv[])
{
//rownanie liniowe bx+c=0
double b,c,x;
printf("\n\n\tb=");
scanf("%lf",&b);
printf("\n\n\tc=");
scanf("%lf",&c);
if(b==0)
if(c==0)
printf("\n\ttozsamosc\n\n");
else
printf("\n\tsprzecznosc\n\n");
else
{
x=-c/b;
printf("\n\tx=%10.5lf \n\n\n",x);
}
}
START
czytaj b,c
b=0
pisz x
STOP
c=0
TAK
TAK
NIE
NIE
pisz
tożsamość
pisz
sprzeczność
x=-c/b
Kolejny program oblicza pierwiastki równania kwadratowego: ax
2
+bx+c=0.
START
czytaj a,b,c
TAK
NIE
b=0
pisz
x
STOP
c=0
TAK
NIE
pisz
tożsamoś
ć
pisz
sprzeczność
x=-c/b
a=0
d=b*b-4*a*c
x1=(-b-sqrt(d))/(2*a)
x2=(-b+sqrt(d))/(2*a)
pisz x1,x2
NIE
TAK
int main()
{
//rownanie kwadratowe
double a, b,c,x1,x2,delta;
printf("\n\n\ta=");
scanf("%lf",&a);
printf("\n\n\tb=");
scanf("%lf",&b);
printf("\n\n\tc=");
scanf("%lf",&c);
if (a==0)
if(b==0)
if(c==0)
printf("\n\ttozsamosc\n\n");
else
printf("\n\tsprzecznosc\n\n");
else
{
x1=-c/b;
printf("\n\tx=%10.5lf \n\n\n",x1);
}
else
{
delta=b*b-4*a*c;
if(delta>=0)
{
x1=(-b-sqrt(delta))/(2*a);
x2=(-b+sqrt(delta))/(2*a);
printf("\n\tx1=%10.5lf x2=%10.5lf\n\n" ,x1,x2);
}
else
printf("\n\tnie ma pierw. rzeczywistych\n\n");
}
}
Przykład: Wyrażenia relacyjne, logiczne /fragmenty płaszczyzny/
Jednym z możliwych zastosowań instrukcji warunkowej jest sprawdzanie, czy zadany punkt
płaszczyzny mieści się określonym obszarze ograniczonym przez wykresy funkcji. Przykładowy
program wczytuje dwie liczby rzeczywiste, będące współrzędnymi x i y punktu na płaszczyźnie
i sprawdza, czy ten punkt należy do obszaru oznaczonego na poniższym rysunku kolorem żółtym.
Obszar jest ograniczony przez wykresy trzech funkcji:
y = 10x
y = x
3
+ 3
y = -x
2
+ 6
Należy sprawdzić, czy zadany punkt leży pod wykresem funkcji kwadratowej: y = -x
2
+ 6,
nad
wykresem funkcji y = x
3
+ 3
oraz pod wykresem liniowej funkcji: y = 10x, czyli, czy współrzędne
punktu x i y spełniają następujące nierówności:
y < 10 * x
y < -x *x + 6
y > x * x * x + 3
Oto program realizujący to zadanie:
int main()
{
double x,y;
scanf("%lf %lf",&x, &y);
if (y<10*x &&y<-x*x+6 && y>x*x*x+3)
printf ("punkt leży w wyznaczonym obszarze\n");
else
printf ("punkt nie leży w wyznaczonym obszarze\n");
}
y=x
3
+3
y=-x
2
+6
y=10x