Język C, © Daniel Pociecha, danpoc@agh.edu.pl
8
Język C – część 2
Podejmowanie decyzji w programie
if … else
Instrukcja warunkowa umożliwia wykonanie pewnej instrukcji w zależności od wartości
wyrażenia. Wszystkie wartości różne od 0, są w języku C traktowane jako prawda,
równe 0, jako fałsz. Wyrażenia logiczne są liczone tylko do momentu, w którym można
określid jego wartośd.
if (wyrażenie) instrukcja;
lub
if (wyrażenie)
{
instrukcja1;
}
else
{
instrukcja2;
}
W pierwszym przypadku instrukcja wykonuje się, jeśli wartośd wyrażenia jest różna
od 0. W drugim wykonuje się jedna z dwóch podanych instrukcji (nigdy obie), pierwsza
– gdy wartośd wyrażenia jest różna od 0, druga – gdy wartośd wyrażenia jest równa 0.
switch
Instrukcja switch służy do wybierania jednego przypadku z wielu. Instrukcja case
określa punkt wejścia do ciągu następnych instrukcji. Program wykonuje się od
instrukcji po tym case, dla którego wartośd wyrażenia stałego jest równa wartości
wyrażenia w instrukcji switch. Chcąc wyjśd z instrukcji switch należy użyd rozkazu
break. Instrukcja default określa punkt wejścia w przypadku, gdy wyrażenie nie
zostało dopasowane do żadnego wyrażenia stałego.
switch (wyrażenie) {
case przypadek1 : instrukcje1;
case przypadek2 : instrukcje2;
...
default : instrukcje;
}
Język C, © Daniel Pociecha, danpoc@agh.edu.pl
9
Przykład 4
/* Program oblicza pierwiastki rzeczywiste trójmianu
kwadratowego */
#include<stdio.h>
#include<math.h>
int main()
{
float a, b, c, delta, x1, x2;
printf("Podaj współczynniki trójmianu\n");
printf("a = ");
scanf("%f", &a);
printf("b = ");
scanf("%f", &b);
printf("c = ");
scanf("%f", &c);
delta = b * b - 4.0 * a * c;
if (delta >= 0.0)
{
x1 = (-b - sqrt(delta))/(2.0 * a);
x2 = (-b + sqrt(delta))/(2.0 * a);
printf("Pierwiastkami są liczby %.2f, %.2f\n", x1, x2);
}
else
printf("Trójmian nie ma pierwiastków rzeczywistych\n");
return 0;
}
Przykład 5
/* Program wyświetla słowną reprezentację oceny */
#include<stdio.h>
int main()
{
int ocena;
printf("Podaj ocenę (1 do 6)\n");
printf("ocena = ");
scanf("%d", &ocena);
Język C, © Daniel Pociecha, danpoc@agh.edu.pl
10
switch(ocena) {
case 6: printf("celujący\n");
break;
case 5: printf("bardzo dobry\n");
break;
case 4: printf("dobry\n");
break;
case 3: printf("dostateczny\n");
break;
case 2: printf("mierny\n");
break;
case 1: printf("niedostateczny\n");
break;
default: printf("błąd danych\n");
}
return 0;
}
ZADANIE 4. Przekształd przykład 4 tak by w przypadku, gdy delta = 0 program liczył
i wyświetlał tylko jeden pierwiastek równania
ZADANIE 5. Przekształd przykład 5 tak by użytkownik miał możliwośd wprowadzenia
imienia ucznia i ocen z trzech jego przedmiotów. Następnie program liczy średnią
z ocen ucznia, zaokrągla do wartości całkowitej a na koocu wyświetla słowną
reprezentację oceny
ZADANIE 6. Uporządkuj trzy wczytane od najmniejszej do największej
ZADANIE 7. Sprawdź, czy dana liczba całkowita jest parzysta
ZADANIE 8. Sprawdź, czy w ciągu 3 liczb występują liczby ujemne
Język C, © Daniel Pociecha, danpoc@agh.edu.pl
11
Obliczenia cykliczne
while
Pętla while jest wykonywana tak długo aż wartośd wyrażenia jest prawdą
(różne od 0). Warunek jest sprawdzany przed wejściem do pętli, stąd instrukcja;
może nie zostad nigdy wykonana, jeżeli przy pierwszym sprawdzeniu wartośd
wyrażenia jest równa 0.
while (wyrażenie) instrukcja;
do … while
Pętla do … while różni się w działaniu od pętli while jedynie tym, że najpierw
jest wykonywana instrukcja;, a następnie sprawdzana wartośd wyrażenia. W pętli
tej, instrukcja; zawsze wykona się przynajmniej raz.
do {
instrukcja;
} while (wyrażenie);
Przykład 6
/* Program oblicza silnię podanej liczby */
#include<stdio.h>
int main()
{
int liczba, silnia, i;
printf("Proszę podać l. nat.: ");
printf("liczba = ");
scanf("%d", &liczba);
i = 1;
silnia = 1;
while (i < liczba)
{
i++;
silnia *= i;
}
printf("Silnia liczby: %d, to: %d\n", liczba, silnia);
return 0;
}
Język C, © Daniel Pociecha, danpoc@agh.edu.pl
12
Przykład 7
/* Program oblicza średnią podanych liczb różnych od zera */
#include<stdio.h>
int main()
{
float suma, a;
int i;
printf("Podaj liczby, 0 - koniec!\n");
suma = 0.0;
i = 0;
do {
printf("a = ");
scanf("%f", &a);
if(a) {
suma += a;
i++;
}
}
while (a);
printf("Średnia: %.2f\n", suma/i);
return 0;
}
for
Wszystkie wyrażenia są opcjonalne. instr_0 jest wykonana przed wejściem do pętli
(tylko raz!). Następnie oblicza się warunek i sprawdza czy jest on różny od 0. Jeśli tak,
wykonywana jest instrukcja i instr_krok. Następnie sprawdzana jest wartośd
warunku itd. Pętla jest wykonywana do momentu, gdy warunek będzie równy 0.
Instrukcja for(;;) instrukcja;, jest to bezwarunkowa pętla nieskooczona.
Instrukcja w pętli for może nie wykonad się ani razu, jeżeli warunek będzie od
razu równy 0. Pętla for może byd pętlą nieskooczoną, jeżeli warunek nigdy nie
przyjmie wartości 0.
for (instr_0; warunek; instr_krok) instrukcja;
Język C, © Daniel Pociecha, danpoc@agh.edu.pl
13
Przykład 8
/* Program oblicza silnię podanej liczby */
#include<stdio.h>
int main()
{
int liczba, silnia, i;
printf("Proszę podać l. nat.: ");
printf("liczba = ");
scanf("%d", &liczba);
silnia = 1;
for(i = 2; i <= liczba; i++) silnia *= i;
printf("Silnia liczby: %d, to: %d\n", liczba, silnia);
return 0;
}
break i continue
Instrukcja break pozwala na opuszczenie aktualnie wykonywanej pętli for, while
oraz do i przejście do instrukcji znajdującej się bezpośrednio po zakooczonej pętli.
Instrukcja continue powoduje zakooczenie bieżącej iteracji aktualnie wykonywanej
pętli for, while oraz do. Dla instrukcji for jest obliczane wyrażenie, którego
wartośd decyduje o wykonaniu następnej iteracji. Natomiast dla instrukcji while oraz
do jest obliczana wartośd wyrażenia sterującego pętlą.
Przykład 9
/* break i continue */
#include<stdio.h>
int main()
{
int liczba, i;
printf("Podaj liczbę od 0 do 10: ");
printf("liczba = ");
scanf("%d", &liczba);
Język C, © Daniel Pociecha, danpoc@agh.edu.pl
14
for(i = 0; i <= 10; i++)
{
if(i == liczba) break;
/* if(i == liczba) continue; */
printf("Licznik: %d\n", i);
}
return 0;
}
ZADANIE 9. Wyprowadź kwadraty i sześciany liczb od jednego do stu
ZADANIE 10. Znajdź największy podzielnik liczby wprowadzonej z klawiatury
ZADANIE 11. Znajdź wszystkie liczby, będące podzielnikami liczby wprowadzonej
z klawiatury
ZADANIE 12. Wyznacz NWD (Największy Wspólny Dzielnik) liczb a i b –
wprowadzonych z klawiatury – wykorzystując algorytm Euklidesa. Zasada działania
algorytmu jest następująca. Dopóki a i b są różne od siebie, od większej z liczb należy
odjąd mniejszą, i tak do momentu aż a i b będą sobie równe.
ZADANIE 13. Wyprowadź na ekran monitora wszystkie cyfry danej liczby