Wykład 7.
Transkrypt
Wykład 7.
Instrukcje sterujące: pętle Elwira Wachowicz [email protected] 11 kwietnia 2013 Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 1 / 24 Operator inkrementacji: ++ Operator inkrementacji zwiększa wartość operandu o 1. Może znajdować się przed operandem: tryb przedrostkowy (++a) lub za operandem: tryb przyrostkowy (a++). but = 23 .0; while (++but < 45) { stopa = MNOZNIK * but + KOREKTA; printf("%8.1f %15.2f cm\n", but, stopa) } Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 2 / 24 Operator inkrementacji: ++ but = 23.0; while (++but < 45) { stopa = MNOZNIK * but + KOREKTA; printf("%8.1f %15.2f cm\n", but, stopa) } Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 3 / 24 Operator inkrementacji: ++ /* rostki.c -- przedrostek a przyrostek */ #include <stdio.h> int main(void) { int a = 1, b = 1; int aplus, bplus; aplus = a++; /* bplus = ++b; /* printf("a aplus printf("%1d %5d %5d return 0; przyrostek */ przedrostek */ b bplus \n"); %5d\n", a, aplus, b, bplus); } Wynik działania: a 2 aplus 1 b 2 bplus 2 Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 4 / 24 Operator inkrementacji: ++ Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 5 / 24 Operator dekrementacji: –– --licznik; licznik--; /* odmiana przedrostkowa operatora dekrementacji */ /* odmiana przyrostkowa operatora dekrementacji */ /* butelki.c -- odliczanie w dół #include <stdio.h> #define MAX 100 */ int main(void) { int licznik = MAX + 1; while(--licznik >0) { printf("%d butelek piwa na stole, " "%d butelek piwa!\n", licznik, licznik); printf("Weź jedną i puść ją w krąg,\n"); printf("%d butelek piwa!\n\n", licznik - 1); } return 0; } Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 6 / 24 Operator dekrementacji: –– 100 butelek piwa na stole, 100 butelek piwa! Weź jedną i puść ją w krąg, 99 butelek piwa! 99 butelek piwa na stole, 99 butelek piwa! Weź jedną i puść ją w krąg, 98 butelek piwa! I na koniec: 1 butelek piwa na stole, 1 butelek piwa! Weź jedną i puść ją w krąg, 0 butelek piwa! Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 7 / 24 Priorytet Operatory ++ i –– mają priorytet niższy jedynie od nawiasów. Priorytetu nie należy mylić z kolejnością wykonywania działań: y = 2; n = 3; liczba = (y + n++) * 6; Daje: liczba = (2 + 3) * 6 = 5 * 6 = 30 Zwiększenie n następuje dopiero po jej wykorzystaniu do obliczenia wartości wyrażenia. Priorytet mówi, że operator odnosi się do n, a nie do 2 + n Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 8 / 24 Zachowaj ostrożność Nie stosuj operatora inkrementacji lub dekrementacji do zmiennej, która jest częścią więcej niż jednego argumentu funkcji. printf("%10d %10d\n", num, num * num++) Funkcja printf() może obliczyć ostatni argument jako pierwszy i zwiększyć zmienną num przed przejściem do następnego argumentu. Nie stosuj operatora inkrementacji lub dekrementacji do zmiennej, która w wyrażeniu pojawia się więcej niż jeden raz. n = 3; y = n++ + n++; Nie wiadomo jaka będzie wartość y. Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 9 / 24 Wyrażenia Wyrażenie jest kombinacją operatorów i operandów (to, czym posługuje się operator). Przykłady: 4 -6 4 + 21 a*(b + c/d)/20 q = 5*2 x = ++q % 3 q > 3 Elwira Wachowicz ([email protected]) Wyrażenie -4 + 6 c = 3 + 8 5 > 3 6 + (c = 3 + 8) Instrukcje sterujące: pętle Wartość 2 11 1 17 11 kwietnia 2013 10 / 24 Instrukcje Instrukcje główne elementy, z których zbudowany jest program. To kompletne polecenie wydane komputerowi. W C kończy się zawsze znakiem średnika. nogi = 4 to wyrażenie, które może być częścią większego wyrażenia. nogi = 4; jest instrukcją. Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 11 / 24 /* dodaj.c -- cztery typy instrukcji */ /* oblicza sumę pierwszych dwudziestu liczb całkowitych */ #include <stdio.h> int main(void) { int licznik, suma; licznik = 0; suma = 0; while ( licznik++ < 20) suma = suma + licznik; printf("suma = %d\n", suma); return 0; /* instrukcja deklaracji */ /* instrukcja przypisania /* jak wyżej */ /* instrukcja while */ /* instrukcja wywołania funkcji */ } Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 12 / 24 Konwersja typów Zmienne całkowite char i short są przetwarzane na typ int. Gdy dwa typy w operacji, oba wyrównywane są do typu o wyższej randze. Kolejność od typów od najwyższej rangi do najniższej: long double, double, float, unsigned int, int. W instrukcji przypisania ostateczny wynik jest przetwarzany na typ zmiennej, której nadawana jest wartość. Może wystąpić awans do typu o wyższej randze lub degradacja do typu o niższej randze. Uwaga: typ o niższej randze może nie być wystarczająco pojemny aby przechować całą liczbę. (Np. typy zmiennoprzecinkowe przy konwersji są zawsze obcinane: 23.13 i 23.99 → 23, −23.5 → −23). Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 13 / 24 /* konwers.c -- automatyczne konwersje typów #include<stdio.h> */ int main(void) { char ch; int i; float fl; fl = i = ch = ’A’; printf("ch = %c, i = %d, fl = %2.2f\n", ch, i, fl); ch = ch + 1; i = fl + 2 * ch; fl = 2.0 * ch + i; printf("ch = %c, i = %d, fl = %2.2f\n", ch, i, fl); ch = 5212205.17; printf("Teraz ch = %c\n", ch); return 0; } Wynik działania: ch = A, i = 65, fl = 65.00 ch = B, i = 197, fl = 329.00 Teraz ch = Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 14 / 24 Operator rzutowania Rzutowanie: metoda pozwalająca na wybranie przez programistę typu zmiennej w trakcie wykonywania operacji. Polega na poprzedzeniu wartości nazwą żądanego typu podaną w nawiasie. Mamy zmienną myszy typu int. myszy = 1.6 + 1.7; myszy = (int) 1.6 + (int) 1.7; Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 15 / 24 Instrukcja: while Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 16 / 24 Instrukcje złożone (bloki) Instrukcja złożona (blok) to przynajmniej dwie instrukcje scalone ze sobą przez zawarcie ich w klamrach. /* fragment 1 */ index = 0; while (index++ < 10) sam = 10 * index + 2; printf("sam = %d\n", sam); Elwira Wachowicz ([email protected]) /* fragment 2 */ index = 0; while (index++ < 10) { sam = 10 * index + 2; printf("sam = %d\n", sam); } Instrukcje sterujące: pętle 11 kwietnia 2013 17 / 24 Instrukcje złożone (bloki) Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 18 / 24 Funkcje z argumentami /* hash.c -- definiuje funkcje z argumentami #include<stdio.h> void hash(int n); /* prototyp funkcji int main(void) { int razy = 5; char ch = ’!’; float f = 6.0; hash(razy); hash(ch); hash((int) f); return 0; /* kod ASCII wykrzyknika to 33 */ */ */ /* argument typu int */ /* char jest automatycznie zmieniany na int */ /* rzutowanie wymusza konwersję f na int */ } void hash(int n) { while (n-- > 0) printf("#"); printf("\n"); } Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 19 / 24 Operatory relacji Operator < <= == >= > != Znaczenie jest mniejszy jest mniejszy lub równy jest równy jest większy lub równy jest większy jest różny od Priorytet operatorów relacji jest niższy niż operatorów arytmetycznych, ale wyższy niż operatorów przypisania. Czyli x > y + 2 jest równoważne x > (y + 2), a x = y > 2 jest równoważne x = (y >2). Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 20 / 24 /* suma.c -- sumuje liczby calkowite wpisane przez użytkownika */ #include <stdio.h> int main(void) { long num; long suma = 0L; /* przypisanie zmiennej suma wartości początkowej zero */ int stan; printf("Podaj liczby calkowite do zsumowania. "); printf("Wpisz q, aby zakonczyc program. \n"); stan = scanf("%ld",&num); while (stan == 1) { suma = suma + num; printf("Podaj nastepna liczbe calkowita do zsumowania. "); printf("Wpisz q, aby zakonczyc program. \n"); stan = scanf("%ld",&num); } printf("Suma podanych liczb wynosi %ld.\n", suma); return 0; } Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 21 / 24 Przykładowy wynik działania programu suma.c: Podaj liczby calkowite do zsumowania. Wpisz q, 1 Podaj nastepna liczbe calkowita do zsumowania. 2 Podaj nastepna liczbe calkowita do zsumowania. 4 Podaj nastepna liczbe calkowita do zsumowania. 5 Podaj nastepna liczbe calkowita do zsumowania. q Suma podanych liczb wynosi 12. Elwira Wachowicz ([email protected]) aby zakonczyc program. Wpisz q, aby zakonczyc program. Wpisz q, aby zakonczyc program. Wpisz q, aby zakonczyc program. Wpisz q, aby zakonczyc program. Instrukcje sterujące: pętle 11 kwietnia 2013 22 / 24 Czym jest prawda? /* p_i_f.c -- wartosci prawdziwe i falszywe w C */ #include <stdio.h> int main(void) { int prawda, falsz; prawda = (10 > 2); /* wartosc prawdziwej relacji */ falsz = (10 == 2); /* wartosc falszywej relacji */ printf("prawda = %d; falsz = %d \n", prawda, falsz); return 0; } Wynik działania programu: prawda = 1; falsz = 0 Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 23 / 24 /* prawda.c -- ktore wartosci sa prawdziwe? */ #include <stdio.h> int main(void) { int n = 3; while(n) printf("%d\n", n--); n = -3; while(n) printf("%d\n", n++); return 0; } Wynik działania programu: 3 2 1 -3 -2 -1 Elwira Wachowicz ([email protected]) Instrukcje sterujące: pętle 11 kwietnia 2013 24 / 24