Wykład 3. Instrukcje powtarzające 3_. Instrukcja while Graf działania instrukcji while POCZĄTEK 0 wyrażenie relacyjne.... KONIEC Składnia (zapis) instrukcji while: while (wyrażenie_relacyjne) // ------ Wewnętrzny blok instrukcji jest powtarzany tak długo, dopóki wyrażenie relacyjne po słowie while ma wartość prawda (tj. różną od zera).
2 Przykład Program obliczający pierwiastek kwadratowy metodą Newtona z wykładu 2 #include<conio.h> //dla clrscr #include<stdio.h> //dla printf,scanf #include<math.h> //dla sqrt int main() double x,p; printf("podaj x: "); scanf("%lf",&x); printf("\nkolejne aproksymacje:"); p=x/2.0; // 0. przybliżenie printf("\n\n%.9lf",p); p=(x+p*p)/(2*p); printf("\n%.9lf",p); p=(x+p*p)/(2*p); printf("\n%.9lf",p); p=(x+p*p)/(2*p); printf("\n%.9lf",p); p=(x+p*p)/(2*p); printf("\n%.9lf",p); //. przybliżenie // 2. przybliżenie // 3. przybliżenie // 4. przybliżenie printf("\n\nfunkcja sqrt(%.lf) zwraca: %.9lf",x,sqrt(x)); Program ten można znacznie skrócić, stosując instrukcję while, której warunkiem kontynuacji jest dostatecznie duża różnica pomiędzy kolejnymi przybliżeniami wyniku: while(fabs(p0-p)>=eps) p0=p; p=(x+p*p)/(2*p); printf("\n%.9lf",p); Zmienna p0 pamięta poprzedni wynik, a zmienna p - wynik bieżący. Funkcja fabs(p0-p) zwraca moduł różnicy tych wyników.
3 Cały program przyjmie teraz postać: //newton.cpp //Oblicza pierwiastek kwadratowy. #include<conio.h> //dla getch #include<stdio.h> //dla printf,scanf #include<math.h> //dla sqrt, fabs int main() double x,p,p0; const double EPS=0.00000; printf("podaj x: "); scanf("%lf",&x); printf("\nkolejne aproksymacje:"); p=x/2.0; printf("\n\n%.9lf",p); while(fabs(p0-p)>=eps) p0=p; if (p!=0) p=(x+p*p)/(2*p); printf("\n%.9lf",p); printf("\n\nfunkcja sqrt daje: %.9lf",sqrt(x)); 3_2. Instrukcja for Instrukcję for można traktować jako skrócony zapis instrukcji while. Składnia instrukcji for for (instrukcja, instrukcja ; wyrażenie_relacyjne ; instrukcja, instrukcja) // - - - - -
4 Po słowie kluczowym for, w nawiasach, można wyróżnić trzy sekcje, oddzielone średnikami: for (instrukcja, instrukcja ; wyrażenie_relacyjne ; instrukcja, instrukcja) sekcja sekcja 2 sekcja 3 Sekcje oraz 3 są to pojedyncze instrukcje, lub kilka instrukcji oddzielonych przecinkami. Sekcja 2 jest wyrażeniem relacyjnym. Jego prawdziwość jest warunkiem powtarzania bloku instrukcji wewnętrznych. Graf działania instrukcji for POCZĄTEK instrukcja, instrukcja,... sekcja 0 wyrażenie relacyjne sekcja 2 KONIEC... wewnętrzny blok instrukcji instrukcja, instrukcja,... sekcja 3
5 Przykład Obliczenie wartości funkcji silnia zgodnie z definicją: dla x==0: x!== dla x>0: x!==*2*3 *.* (x-)*x Silnię obliczymy iteracyjnie, tak jak poniżej pokazano dla x==4. S==((()*2)*3)*4)==24 //silnia.cpp //obliczenie x! #include<conio.h> #include<stdio.h> int main() double s;; int x,j; //wczytanie argumentu printf("podaj argument silni: "); scanf("%d",&x); //obliczenie silni for(s=.0,j=;j<=x;j++) //wydruk wyniku printf("\n%d!=%.6lg",x,s);
6 Cykle działania instrukcji for w programie silnia.cpp dla x==4 Numer cyklu Wartość relacji j <= x Instrukcje wykonywane Wartość zmiennej s Wartość zmiennej j 0 (stan początkowy) prawda () s=; j=; prawda () j++ 2 2 prawda () j++ 2 3 3 prawda () j++ 6 4 4 prawda () j++ 24 5 STOP fałsz (0) 24 5 Równoważne sposoby zapisu instrukcji for a/ postać typowa: s=.0; for(j=; j<=x; j++) b/ postać z pustymi sekcjami i 3 s=.0; j=; for( ;j<=x; ) j++;
c/ postać z umieszczeniem kilku instrukcji w sekcjach i 3 for(s=.0, j=; j<=x; s*=j, j++); Instrukcja for i równoważna jej instrukcja while 7 for(j=; j<=x; j++) j=; while(j<=x) j++; Przykład Program do obliczania kilku wyrazów Fibonacci pokazany na wykł. : #include<stdio.h> #include<conio.h> int main() unsigned long ost=,post=0,wyraz=; int n=; printf("\nwyraz %2d: %6lu",n++,wyraz); wyraz=ost+post; post=ost; ost=wyraz; printf("\nwyraz %2d: %6lu",n++,wyraz); wyraz=ost+post; post=ost; ost=wyraz; printf("\nwyraz %2d: %6lu",n++,wyraz); wyraz=ost+post; post=ost; ost=wyraz; printf("\nwyraz %2d: %6u",n++,wyraz); wyraz=ost+post; post=ost; ost=wyraz;
8 Wprowadzając do program instrukcję for, można skrócić zapis i uzyskać możliwość drukowania danej liczby n wyrazów: //fibon_2.cpp //obliczenie i wydruk n wyrazów Fibonacci #include<stdio.h> #include<conio.h> int main() double ost=,post=0,wyraz=; int j,n; printf( Ile wyrazow? ); scanf( %d,&n); for (j=; j<=n; j++) printf("\nwyraz %3d %2lg",j,wyraz); wyraz=ost+post; post=ost; ost=wyraz; 3_3. Instrukcja do while Instrukcję tę zapisujemy ogólnie w następujący sposób: do // - - - - while (wyrażenie_relacyjne);
9 Graf działania instrukcji do while POCZĄTEK - - - -. wyrażenie relacyjne 0 KONIEC Warunek powtarzania (wyrażenie relacyjne) sprawdza się po każdym wykonaniu bloku instrukcji wewnętrznych. Wewnętrzny blok instrukcji zostaje wykonany co najmniej jeden raz! Funkcja rand: Funkcja rand, opisana w <stdlib.h>, pełni funkcję generatora liczby losowej. Po wywołaniu jak poniżej: int x=rand(); przypisze się do zmiennej x liczba losowa z zakresu od 0 do 32767. Zakres ten można zawęzić, stosując operator szukania reszty z dzielenia, na przykład: x=rand()%00; Liczba losowa zapisana w zmiennej x leży teraz w zakresie <0, 99>.
0 Przykład Generowanie 6 uporządkowanych rosnąco liczb losowych //losowe.cpp #include <conio.h> #include <stdio.h> #include <stdlib.h> //dla srand,rand #include <time.h> //dla time int main() int x,x2,x3,x4,x5,x6,j=0; time_t czas; //zmienna dla pamiętania czasu czas=time(null); //aktualny czas (sek.) srand(czas); //ustawienie generatora do x=rand()%00; x2=rand()%00; x3=rand()%00; x4=rand()%00; x5=rand()%00; x6=rand()%00; j++; while (!(x<x2&&x2<x3&&x3<x4&&x4<x5&&x5<x6)); printf("\n%d %d %d %d %d %d", x,x2,x3,x4,x5,x6); printf("\nliczba cykli: %d",j);
3_4. Instrukcje break i continue Działanie instrukcji break: POCZĄTEK wyrażenie relacyjne 0 if (wyr) break; // - - - - -. KONIEC Działanie instrukcji continue: POCZĄTEK wyrażenie relacyjne 0 if (wyr) continue; // - - - - - - -. KONIEC
2 3_5. Zagnieżdżanie instrukcji powtarzających Uwaga: Zagnieżdżone pętle muszą mieć różne zmienne licznikowe! Przykład Drukowanie tablicy mnożenia liczb do 8 //multab.cpp //druk tablicy mnozenia #include<conio.h> #include<stdio.h> int main() printf("\n Tabliczka mnozenia liczb..8"); printf("\n =============================="); for (int j=;j<9;j++) printf("\n"); for(int k=;k<9;k++) printf("%4d",j*k); Przykład Drukowanie wszystkich kombinacji dwóch liter //letters.cpp //Drukuje wszystkie wyrazy dwuliterowe. #include <conio.h> #include <stdio.h> int main() for (char x='a'; x<='z'; x++) for (char y='a'; y<='z';y++) printf("%3c%c",x,y);