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 8
Przykład 4 /* Program oblicza pierwiastki rzeczywiste trójmianu kwadratowego */ #include<math.h> 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"); Przykład 5 /* Program wyświetla słowną reprezentację oceny */ int ocena; printf("podaj ocenę (1 do 6)\n"); printf("ocena = "); scanf("%d", &ocena); Język C, Daniel Pociecha, danpoc@agh.edu.pl 9
switch(ocena) case 6: printf("celujący\n"); case 5: printf("bardzo dobry\n"); case 4: printf("dobry\n"); case 3: printf("dostateczny\n"); case 2: printf("mierny\n"); case 1: printf("niedostateczny\n"); default: printf("błąd danych\n"); 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 10
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 */ 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); Język C, Daniel Pociecha, danpoc@agh.edu.pl 11
Przykład 7 /* Program oblicza średnią podanych liczb różnych od zera */ 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); 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 12
Przykład 8 /* Program oblicza silnię podanej liczby */ 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); 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 */ int liczba, i; printf("podaj liczbę od 0 do 10: "); printf("liczba = "); scanf("%d", &liczba); Język C, Daniel Pociecha, danpoc@agh.edu.pl 13
for(i = 0; i <= 10; i++) if(i == liczba) /* if(i == liczba) continue; */ printf("licznik: %d\n", i); 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 Język C, Daniel Pociecha, danpoc@agh.edu.pl 14