Informatyka I Wykład 7
description
Transcript of Informatyka I Wykład 7
Jerzy F. KotowskiJerzy F. Kotowski 11
Informatyka IWykład 7
STEROWANIE c.d.
switchswitch PętlePętle
Jerzy F. KotowskiJerzy F. Kotowski 22
KONSTRUKCJA KONSTRUKCJA switch
switchswitch(zmienna){
casecase wyrażenie_stałe1:instrukcja1breakbreak;case case wyrażenie_stałe2:………..defaultdefault:breakbreak;
}
Zawsze można podstawić Zawsze można podstawić do pomocniczej zmiennejdo pomocniczej zmiennej
Wyrażenie stałe oblicza Wyrażenie stałe oblicza kompilator (definicja)kompilator (definicja)
Wyjście poza konstrukcjęWyjście poza konstrukcję Dowolna kolejnośćDowolna kolejność Wszystkie różneWszystkie różne Powinno byćPowinno być Czasami tu jest Czasami tu jest
najciekawiejnajciekawiej
Jerzy F. KotowskiJerzy F. Kotowski 33
switch - przykład 1przykład 1
x = a % 2;x = a % 2;switch(x)switch(x){{
case 0:case 0:printf(“\nLiczba a jest parzysta”);printf(“\nLiczba a jest parzysta”);break;break;
case 1:case 1:printf(“\nLiczba a jest nieparzysta”);printf(“\nLiczba a jest nieparzysta”);break;break;
default:default:printf(“\nRatunku! Popsułem się!!”);printf(“\nRatunku! Popsułem się!!”);break;break;
}}
7_17_1
Jerzy F. KotowskiJerzy F. Kotowski 44
switch - przykład 2przykład 2
x = a % 3;x = a % 3;switch(x)switch(x){{
case 0:case 0:printf(“\nLiczba a dzieli się przez 3”);printf(“\nLiczba a dzieli się przez 3”);break;break;
case 1:case 1:case 2:case 2:
printf(“\nLiczba a nie dzieli się przez 3”);printf(“\nLiczba a nie dzieli się przez 3”);break;break;
default:default:break;break;
}}
7_27_2
Jerzy F. KotowskiJerzy F. Kotowski 55
switch - przykład 3przykład 3
printf(“\nCzy masz już dość na dzisiaj?”);printf(“\nCzy masz już dość na dzisiaj?”);c = getch();c = getch(); // Wczytanie znaku z klawiatury bez echa// Wczytanie znaku z klawiatury bez echaswitch(c)switch(c){{
case ‘t’:case ‘t’:case ‘T’:case ‘T’:
printf(“\nNo to pa!”); printf(“\nNo to pa!”); getch(); exit(0); // WYJŚCIEgetch(); exit(0); // WYJŚCIEcase ‘n’:case ‘n’:case ‘N’:case ‘N’:
printf(“\nNo to gramy jeszcze raz!!”); getch(); printf(“\nNo to gramy jeszcze raz!!”); getch(); break;break;default:default:
printf(“\n\aChyba jednak masz już dość...”);break;printf(“\n\aChyba jednak masz już dość...”);break;}}
7_37_3
Jerzy F. KotowskiJerzy F. Kotowski 66
switch - przykład 4przykład 4
y = x % 3;y = x % 3;switch(y)switch(y){{
case 0:case 0:x++; break;x++; break;
case 1:case 1:x = 0; y = 1;x = 0; y = 1;
case 2:case 2:x++; y--;x++; y--;
default:default:printf(“\nZnowu printf(“\nZnowu
ja?”);ja?”);break;break;
}}
x = 7;x = 7; x?, y?x?, y? x: 1, y: 0 x: 1, y: 0
Zobaczymy Zobaczymy napisnapis
x = 8;x = 8; x?, y?x?, y? x: 9, y: 1 x: 9, y: 1
Zobaczymy Zobaczymy napisnapis
7_47_4
Jerzy F. KotowskiJerzy F. Kotowski 77
PĘTLA PĘTLA while
while(while(Wyrażenie))Instrukcja
Krok 1Krok 1 Wyznaczamy wartość Wyznaczamy wartość wyrażenia wyrażenia WyrażenieWyrażenie
Krok 2Krok 2 Jeżeli Jeżeli WyrażenieWyrażenie jest jest prawdą sterowanie przechodzi prawdą sterowanie przechodzi do do Kroku 3Kroku 3 a w przeciwnym a w przeciwnym przypadku wychodzi poza przypadku wychodzi poza konstrukcjękonstrukcję
Krok 3Krok 3 Wykonywana jest Wykonywana jest Instrukcja. Instrukcja. Powrót do Powrót do Kroku 1Kroku 1
Jerzy F. KotowskiJerzy F. Kotowski 88
PĘTLA PĘTLA while - przykład 1przykład 1
int n;int n;// wczytanie wartości n// wczytanie wartości nprintf(“\nPodaj n = “);printf(“\nPodaj n = “);scanf(“%d”, &n); scanf(“%d”, &n); while(n--)while(n--)
printf(“\n%d”,n);printf(“\n%d”,n);printf(“\n%d”,n);printf(“\n%d”,n);
& w funkcji scanf Drugie printf poza pętlą Podaliśmy n = 4. Co
zobaczymy na ekranie?Podaj n = 4
3210-1
Wniosek: Pętla while(n--) chodzi n razy. Po pętli n: -1
7_57_5
Jerzy F. KotowskiJerzy F. Kotowski 99
PĘTLA PĘTLA while - przykład 2przykład 2
int n;int n;// wczytanie wartości n// wczytanie wartości nprintf(“\nPodaj n = “);printf(“\nPodaj n = “);scanf(“%d”, &n); scanf(“%d”, &n); while(n--);while(n--);
printf(“\n%d”,n);printf(“\n%d”,n);printf(“\n%d”,n);printf(“\n%d”,n);
Pojawił się średnik Podaliśmy n = 4. Co
zobaczymy na ekranie?Podaj n = 4
-1-1
Ten przykład to bliskie spotkanie z instrukcją pustą
Kilka instrukcji pustychn = 5;;;;;n = 5;;;;;
7_67_6
Jerzy F. KotowskiJerzy F. Kotowski 1010
PĘTLA PĘTLA while - przykład 3przykład 3
int n;int n;// wczytanie wartości n// wczytanie wartości nprintf(“\nPodaj n = “);printf(“\nPodaj n = “);scanf(“%d”, &n); scanf(“%d”, &n); while(--n)while(--n)
printf(“\n%d”,n);printf(“\n%d”,n);printf(“\n%d”,n);printf(“\n%d”,n);
while(--n) Podaliśmy n = 4. Co
zobaczymy na ekranie?Podaj n = 4
3210
Wniosek: Pętla while(--n) chodzi n-1 razy. Po pętli n: 0
7_77_7
Jerzy F. KotowskiJerzy F. Kotowski 1111
PĘTLA PĘTLA while - przykład 4przykład 4
// obliczanie wartości n!// obliczanie wartości n!int n, n_silnia;int n, n_silnia;printf(“\nPodaj n = “);printf(“\nPodaj n = “);scanf(“%d”, &n); scanf(“%d”, &n); n_silnia = n;n_silnia = n;while(--n)while(--n)
n_silnia *=n;n_silnia *=n;
n_silnia *= n; n_silnia *= n; to samo co n_silnia = n_silnia * n;n_silnia = n_silnia * n; Niedługo będzie...
Uwaga!! n się zmieniło!! Można tak:
int n, n_s, i;int n, n_s, i;printf(“\nPodaj n = “);printf(“\nPodaj n = “);scanf(“%d”, &n); scanf(“%d”, &n); i = n_s = n;i = n_s = n;while(--i)while(--i)
n_s *= i;n_s *= i;printf(“\n%d! = %d”, n, n_s);printf(“\n%d! = %d”, n, n_s);
7_97_9
7_87_8
Jerzy F. KotowskiJerzy F. Kotowski 1212
PĘTLA PĘTLA do - while
dodoInstrukcja
while(while(Wyrażenie););
Krok 1Krok 1 Wykonywana jest Wykonywana jest InstrukcjaInstrukcja
Krok 2Krok 2 Wyznaczamy wartość Wyznaczamy wartość wyrażenia wyrażenia WyrażenieWyrażenie
Krok 3Krok 3 Jeżeli Jeżeli WyrażenieWyrażenie jest jest prawdą powracamy do prawdą powracamy do Kroku 1Kroku 1. . W przeciwnym przypadku W przeciwnym przypadku wychodzimy poza konstrukcjęwychodzimy poza konstrukcję
Wniosek:Wniosek: Pętla Pętla whilewhile może nie może nie pójść ani razu a pętla pójść ani razu a pętla do - whiledo - while pójdzie zawsze przynajmniej razpójdzie zawsze przynajmniej raz
Jerzy F. KotowskiJerzy F. Kotowski 1313
PĘTLA PĘTLA for
for(wyr1; wyr2; wyr3)for(wyr1; wyr2; wyr3)InstrukcjaInstrukcja
Średniki muszą byćŚredniki muszą być wyr1 - część inicjująca, - część inicjująca,
wykonywana razwykonywana raz wyr2 - warunek - warunek wyr3 - część modyfiku- - część modyfiku-
jącająca Instrukcja - może nie - może nie
być wykonana ani razubyć wykonana ani razu Od tłumaczenia jest Od tłumaczenia jest
jeden wyjątekjeden wyjątek
wyr1;wyr1;while(wyr2)while(wyr2){{
Instrukcja;Instrukcja;wyr3;wyr3;
}}
Jerzy F. KotowskiJerzy F. Kotowski 1414
PĘTLA PĘTLA for - przykłady 1 - 4przykłady 1 - 4
// inicjalizacja tablicy// inicjalizacja tablicyint i, a[10];int i, a[10];for(i=0; i<10; i++)for(i=0; i<10; i++)
a[i] = i;a[i] = i;
// inicjalizacja tablicy// inicjalizacja tablicyint i, a[10];int i, a[10];for(i=0; i<10; a[i++] = i);for(i=0; i<10; a[i++] = i);
// inicjalizacja tablicy// inicjalizacja tablicyint i, a[10];int i, a[10];i=0;i=0;for(;i<10;)for(;i<10;)
a[i++] = i;a[i++] = i;
int i = 0, a[10];int i = 0, a[10];for(;;)for(;;){{
if(i >= 10) break;if(i >= 10) break;a[i++] = i;a[i++] = i;
}}
Jerzy F. KotowskiJerzy F. Kotowski 1515
PĘTLA PĘTLA for - przykłady 5 - 6przykłady 5 - 6
// odwracanie tablicy// odwracanie tablicyint i, j;int i, j;float tab[20], kolega;float tab[20], kolega;for(i=0, j=19; i<j; i++, j--)for(i=0, j=19; i<j; i++, j--){{
kolega = tab[i];kolega = tab[i];tab[i] = tab[j];tab[i] = tab[j];tab[j] = kolega;tab[j] = kolega;
}}
W przykładzie wystąpił W przykładzie wystąpił gościnnie (2 x) słynny gościnnie (2 x) słynny operator przecinkowyoperator przecinkowy
// wyznaczanie wartości “n nad k”// wyznaczanie wartości “n nad k”int n, k, n_k, min, i;int n, k, n_k, min, i;printf(“\nn = “); scanf(“%d”, &n);printf(“\nn = “); scanf(“%d”, &n);printf(“k = “); scanf(“%d”, &k);printf(“k = “); scanf(“%d”, &k);min = k;min = k; // min = min(k,n-k)// min = min(k,n-k)if (n-k < min) min = n-k;if (n-k < min) min = n-k;n_k = n;n_k = n;for(i=1; i < min; i++)for(i=1; i < min; i++)
n_k = n_k * (n - i) / (i + 1); n_k = n_k * (n - i) / (i + 1); // ***// ***printf(“%d nad %d = %d”,n,k,n_k);printf(“%d nad %d = %d”,n,k,n_k); W instrukcji W instrukcji ****** wykorzystano wykorzystano
lewostronną łączność mnoże-lewostronną łączność mnoże-nia i dzieleniania i dzielenia
7_b7_b
7_a7_a
Jerzy F. KotowskiJerzy F. Kotowski 1616
PĘTLA PĘTLA for - przykład 6Aprzykład 6A
Alternatywna postać do pętli Alternatywna postać do pętli for z przykładu 6 z przykładu 6
int r, s; int r, s; // pomocnicze zmienne// pomocnicze zmiennen_k = n;n_k = n;r = n - 1;r = n - 1;s = 2;s = 2;while(--min)while(--min)
n_k = n_k * r-- / s++;n_k = n_k * r-- / s++;
7_c7_c
Jerzy F. KotowskiJerzy F. Kotowski 1717
SŁOWA KLUCZOWESŁOWA KLUCZOWE break oraz oraz continue
break pozwala na pozwala na wyskoczenie z wszystkich wyskoczenie z wszystkich konstrukcji sterującychkonstrukcji sterujących
continue jest używane w jest używane w
kontekście z pętlami.kontekście z pętlami. Przerywa bieżacy obieg i Przerywa bieżacy obieg i zaczyna nowy uprzednio zaczyna nowy uprzednio sprawdzając warunek. W sprawdzając warunek. W pętli pętli for wpierw przejście wpierw przejście do części modyfikującej.do części modyfikującej.
// sumowanie dodatnich// sumowanie dodatnich// elementów N elemen-// elementów N elemen-// towej tablicy ‘tab’// towej tablicy ‘tab’
int i, sumator;for(i=0, i<N; i++){
if(tab[i] <= 0)continue;
sumator += tab[i];}
Jerzy F. KotowskiJerzy F. Kotowski 1818
KONSTRUKCJA STERUJĄCAKONSTRUKCJA STERUJĄCA goto i etykietyi etykiety
Dobra praktyka dotycząca Dobra praktyka dotycząca pisania programów w ję-pisania programów w ję-zyku C polega na unikaniu zyku C polega na unikaniu konstrukcji konstrukcji goto
Konstrukcja Konstrukcja goto przydaje przydaje się w wyjątkowych sytuac-się w wyjątkowych sytuac-jach (np. obsługa błędów).jach (np. obsługa błędów).
W C++ służy do tego spec-W C++ służy do tego spec-jalny mechanizm nazywa-jalny mechanizm nazywa-ny “obsługą wyjątków”. ny “obsługą wyjątków”.
// Przykład wykorzystania// Przykład wykorzystania// konstrukcji ‘goto’// konstrukcji ‘goto’
if(niepowodzenie)goto error;
…………………………error:
dwukropek, średnik error - etykieta