Jerzy F. Kotowski1 Informatyka I Wykład 7 STEROWANIE c.d. n switch n Pętle
Jerzy F. Kotowski2 KONSTRUKCJA KONSTRUKCJA switch switch switch(zmienna) { case case wyrażenie_stałe1: instrukcja1 break break; case case wyrażenie_stałe2: ……….. default default: break break; } n Zawsze można podstawić do pomocniczej zmiennej n Wyrażenie stałe oblicza kompilator (definicja) n Wyjście poza konstrukcję n Dowolna kolejność n Wszystkie różne n Powinno być n Czasami tu jest najciekawiej
Jerzy F. Kotowski3 przykład 1 switch - przykład 1 x = a % 2; switch(x){ case 0: printf(\nLiczba a jest parzysta); break; case 1: printf(\nLiczba a jest nieparzysta); break;default: printf(\nRatunku! Popsułem się!!); break;} 7_1
Jerzy F. Kotowski4 przykład 2 switch - przykład 2 x = a % 3; switch(x){ case 0: printf(\nLiczba a dzieli się przez 3); break; case 1: case 2: printf(\nLiczba a nie dzieli się przez 3); break;default:break;} 7_2
Jerzy F. Kotowski5 przykład 3 switch - przykład 3 printf(\nCzy masz już dość na dzisiaj?); c = getch();// Wczytanie znaku z klawiatury bez echa switch(c){ case t: case T: printf(\nNo to pa!); getch(); exit(0); // WYJŚCIE case n: case N: printf(\nNo to gramy jeszcze raz!!); getch(); break; default: printf(\n\aChyba jednak masz już dość...);break; } 7_3
Jerzy F. Kotowski6 przykład 4 switch - przykład 4 y = x % 3; switch(y){ case 0: x++; break; case 1: x = 0; y = 1; case 2: x++; y--; default: printf(\nZnowu ja?); break;} n x = 7; n x?, y? n x: 1, y: 0 Zobaczymy napis n x = 8; n x?, y? n x: 9, y: 1 Zobaczymy napis 7_4
Jerzy F. Kotowski7 PĘTLA PĘTLA while while() while(Wyrażenie) Instrukcja n Krok 1 Wyznaczamy wartość wyrażenia Wyrażenie n Krok 2 Jeżeli Wyrażenie jest prawdą sterowanie przechodzi do Kroku 3 a w przeciwnym przypadku wychodzi poza konstrukcję Krok 3 Wykonywana jest Instrukcja. Powrót do Kroku 1 Krok 3 Wykonywana jest Instrukcja. Powrót do Kroku 1
Jerzy F. Kotowski8 PĘTLA przykład 1 PĘTLA while - przykład 1 int n; // wczytanie wartości n printf(\nPodaj n = ); scanf(%d, &n); while(n--)printf(\n%d,n);printf(\n%d,n); n n & w funkcji scanf n n Drugie printf poza pętlą n n Podaliśmy n = 4. Co zobaczymy na ekranie? Podaj n = n n Wniosek: Pętla while(n--) chodzi n razy. Po pętli n: -1 7_5
Jerzy F. Kotowski9 PĘTLA przykład 2 PĘTLA while - przykład 2 int n; // wczytanie wartości n printf(\nPodaj n = ); scanf(%d, &n); while(n--);printf(\n%d,n);printf(\n%d,n); n n Pojawił się średnik n n Podaliśmy n = 4. Co zobaczymy na ekranie? Podaj n = n n Ten przykład to bliskie spotkanie z instrukcją pustą Kilka instrukcji pustych n = 5;;;;; 7_6
Jerzy F. Kotowski10 PĘTLA przykład 3 PĘTLA while - przykład 3 int n; // wczytanie wartości n printf(\nPodaj n = ); scanf(%d, &n); while(--n)printf(\n%d,n);printf(\n%d,n); n n while(--n) n n Podaliśmy n = 4. Co zobaczymy na ekranie? Podaj n = n n Wniosek: Pętla while(--n) chodzi n-1 razy. Po pętli n: 0 7_7
Jerzy F. Kotowski11 PĘTLA przykład 4 PĘTLA while - przykład 4 // obliczanie wartości n! int n, n_silnia; printf(\nPodaj n = ); scanf(%d, &n); n_silnia = n; while(--n) n_silnia *=n; n n_silnia *= n; n_silnia = n_silnia * n; n n_silnia *= n; to samo co n_silnia = n_silnia * n; Niedługo będzie... n n Uwaga!! n się zmieniło!! n n Można tak: int n, n_s, i; printf(\nPodaj n = ); scanf(%d, &n); i = n_s = n; while(--i) n_s *= i; printf(\n%d! = %d, n, n_s); 7_9 7_8
Jerzy F. Kotowski12 PĘTLA PĘTLA do - while do Instrukcja while(); while(Wyrażenie); n Krok 1 Wykonywana jest Instrukcja n Krok 2 Wyznaczamy wartość wyrażenia Wyrażenie Krok 3 Jeżeli Wyrażenie jest prawdą powracamy do Kroku 1. W przeciwnym przypadku wychodzimy poza konstrukcję Krok 3 Jeżeli Wyrażenie jest prawdą powracamy do Kroku 1. W przeciwnym przypadku wychodzimy poza konstrukcję n Wniosek: Pętla while może nie pójść ani razu a pętla do - while pójdzie zawsze przynajmniej raz
Jerzy F. Kotowski13 PĘTLA PĘTLA for for(wyr1; wyr2; wyr3) Instrukcja n Średniki muszą być n - część inicjująca, wykonywana raz n wyr1 - część inicjująca, wykonywana raz n - warunek n wyr2 - warunek n - część modyfiku- jąca n wyr3 - część modyfiku- jąca n - może nie być wykonana ani razu n Instrukcja - może nie być wykonana ani razu n Od tłumaczenia jest jeden wyjątek wyr1;while(wyr2){Instrukcja;wyr3;}
Jerzy F. Kotowski14 PĘTLA przykłady PĘTLA for - przykłady // inicjalizacja tablicy int i, a[10]; for(i=0; i<10; i++) a[i] = i; // inicjalizacja tablicy int i, a[10]; for(i=0; i<10; a[i++] = i); // inicjalizacja tablicy int i, a[10]; i=0;for(;i<10;) a[i++] = i; int i = 0, a[10]; for(;;){ if(i >= 10) break; a[i++] = i; }
Jerzy F. Kotowski15 PĘTLA przykłady PĘTLA for - przykłady // odwracanie tablicy int i, j; float tab[20], kolega; for(i=0, j=19; i<j; i++, j--) { kolega = tab[i]; tab[i] = tab[j]; tab[j] = kolega; } n W przykładzie wystąpił gościnnie (2 x) słynny operator przecinkowy // wyznaczanie wartości n nad k int n, k, n_k, min, i; printf(\nn = ); scanf(%d, &n); printf(k = ); scanf(%d, &k); min = k; // min = min(k,n-k) if (n-k < min) min = n-k; n_k = n; for(i=1; i < min; i++) n_k = n_k * (n - i) / (i + 1); // *** printf(%d nad %d = %d,n,k,n_k); n W instrukcji *** wykorzystano lewostronną łączność mnoże- nia i dzielenia 7_b7_a
Jerzy F. Kotowski16 PĘTLA przykład 6A PĘTLA for - przykład 6A n Alternatywna postać do pętli z przykładu 6 n Alternatywna postać do pętli for z przykładu 6 int r, s; // pomocnicze zmienne n_k = n; r = n - 1; s = 2; while(--min) n_k = n_k * r-- / s++; 7_c
Jerzy F. Kotowski17 SŁOWA KLUCZOWE oraz SŁOWA KLUCZOWE break oraz continue n pozwala na wyskoczenie z wszystkich konstrukcji sterujących n break pozwala na wyskoczenie z wszystkich konstrukcji sterujących n jest używane w kontekście z pętlami. Przerywa bieżacy obieg i zaczyna nowy uprzednio sprawdzając warunek. W pętli wpierw przejście do części modyfikującej. n continue jest używane w kontekście z pętlami. Przerywa bieżacy obieg i zaczyna nowy uprzednio sprawdzając warunek. W pętli for wpierw przejście do części modyfikującej. // sumowanie dodatnich // elementów N elemen- // towej tablicy tab int i, sumator; for(i=0, i<N; i++) { if(tab[i] <= 0) continue; sumator += tab[i]; }
Jerzy F. Kotowski18 KONSTRUKCJA STERUJĄCA i etykiety KONSTRUKCJA STERUJĄCA goto i etykiety n Dobra praktyka dotycząca pisania programów w ję- zyku C polega na unikaniu konstrukcji n Dobra praktyka dotycząca pisania programów w ję- zyku C polega na unikaniu konstrukcji goto n Konstrukcja przydaje się w wyjątkowych sytuac- jach (np. obsługa błędów). n Konstrukcja goto przydaje się w wyjątkowych sytuac- jach (np. obsługa błędów). n W C++ służy do tego spec- jalny mechanizm nazywa- ny obsługą wyjątków. // Przykład wykorzystania // konstrukcji goto if(niepowodzenie) goto error; …………… error: n n dwukropek, średnik n n error - etykieta