KURS C/C++ WYKŁAD 2
Transkrypt
KURS C/C++ WYKŁAD 2
KURS C/C++ WYKŁAD 2 Instrukcje iteracyjne Instrukcja while Składnia tej instrukcji jest następująca: while (wyrażenie) instrukcja W pętli while wykonanie instrukcji powtarza się tak długo, jak długo wartość wyrażenia jest różna od zera. Sprawdzenia tego dokonuje się przed każdym wykonaniem instrukcji. char znak; znak =�a�; Program 1 #include<stdio.h> void main() { char znak; znak = getchar(); // pobierz znak, <enter> while(znak != �t�) { // blok instrukcji putchar(znak); //wypisz znak znak = getchar(); } } Program 2 #include<stdio.h> void main() { char znak; while( (znak = getchar() ) != �t�) putchar(znak); } Blok instrukcji (instrukcja złożona): { lista instrukcji } { putchar(ch); ch = getchar(); } Funkcja int getchar(void) zwraca czytany znak (kod). W przypadku gdy napotka koniec zbioru lub gdy wystąpi błąd w operacji czytania zwraca EOF. Funkcja int putchar(int c) zwraca wysyłany znak c lub EOF gdy powstał błąd. Program 1 #include<stdio.h> void main() { int ch; ch = getchar(); while(ch != EOF) { putchar(ch); ch = getchar(); } } // blok instrukcji Program 2 #include<stdio.h> void main() { int ch; while( (ch = getchar() ) != EOF) putchar(ch); } Wprowadzono symboliczną nazwa EOF (end of file - koniec pliku). Stała EOF jest obiektem całkowitym zdefiniowanym w standardowym pliku nagłówkowym <stdio.h>. W Borland 3.1, EOF przyjmuje wartość -1, w niektórych implementacjach jako 0. Instrukcja do...while Składnia instrukcji jest następująca: do instrukcja while wyrażenie W pętli do...while wykonanie instrukcji powtarza się tak długo, jak długo wartość wyrażenia jest różna od zera. Sprawdzenia tego dokonuje się po każdym wykonaniu instrukcji, dlatego pętla wykona się zawsze co najmniej raz; to różni ją od pętli while która może nie wykonć się wcale. Program 1 #include<stdio.h> void main(){ int ch; do{ ch = getch(); putch (ch); } while (ch != �a�); } Program 2 #include<stdio.h> #include<conio.h> void main() { int i; clrscr(); i=2; while(i != 0) { // blok instrukcji printf (�pętla while i=%d\n�,i); i=i-1; getch(); } printf (�po pętli\n�); Program 3 #include<stdio.h> #include<conio.h> void main() { int i; clrscr(); i=2; do { // blok instrukcji printf(�pętla do_while i=%d\n�,i); i--; getch(); } while (i != 0); printf (�po pętli\n�); } } EKRAN: pętla while i=2 pętla do_while i=2 pętla while i=1 pętla do_while i=1 po pętli po pętli; Program 3 #include<stdio.h> #include<conio.h> void main() { int i=0; float licznik=0; clrscr(); while(i) { // blok instrukcji printf (?i=%d\n?,i); i--; licznik++; } printf (�po pętli licznik=%f�,licznik); } Program 4 #include<stdio.h> #include<conio.h> void main() { int i=0; float licznik=0; clrscr(); do { // blok instrukcji printf (?i=%d\n?,i); i = i-1; licznik++; } while (i); printf(�po pętli licznik=%f�,licznik); } EKRAN: licznik=0 i=0 Jestem po pętli while i=i-1=0-1=-1 i=-1 i=i-1=-1-1=-2 i=-2 i=i-1=-2-1=-3 ...... po pętli licznik=65536 Przykłady pętli: Przykład 1, float kwota; do { printf (? Podaj wpłacaną kwotę �); scanf (?%f?, &kwota); } while (kwota<=0); Przykład 2. int liczba; do { cout<<�Podaj liczbę całkowitą z przedziału <10, 100>� ; cin>>liczba; } while ( (liczba<10) | | (liczba>10)); // | | operator logiczny lub (suma logiczna) Przykład 3. int liczba; do { cout<<�Podaj liczbę całkowitą z przedziału (-?,10) lub (100, +?) ; cin>>liczba; } while ( (liczba>=10) && (liczba<=100)); //&& - operator logiczny i (iloczyn logiczny) Program 5 #include<conio.h> #include<stdio.h> void main() { char ch; // zakończenie pętli po wprowadzeniu znaku ENTER while ( (ch=getchar()) !=0xA){ putchar(ch); } while ( (ch=getche()) !=0xD){ putch(ch); } } Instrukcja for Składnia pętli for ma postać: for (inst_ini; wyr_war; wyr_krok) instrukcja; inst _ini wykorzystywana jest zwykle do deklarowania i inicjalizowania zmiennych na potrzeby pętli wyr_war wyrażenie warunkowe wykorzystywane jest do testowania warunków wykonywania pętli, wyr_krok określa zmianę stanu pętli i używane jest zwykle do zwiększania lub zmniejszania zmiennej indeksującej pętlę. Wszystkie składniki w nawiasie są opcjonalne, jednak muszą być zachowane średniki oddzielające je. for (i =1; i < 4; i=i+1) printf (�Jestem w pętli�); 1) i = 1 // Pętla wypisze 3 razy ten sam tekst: Jestem w pętli wartość i jest mniejsza od 4 wypisuje tekst: Jestem w pętli 2) i = i+1=1+1=2 wartość i jest mniejsza od 4 wypisuje tekst: Jestem w pętli 3) i = i+1=2+1=3 wartość i jest mniejsza od 4 wypisuje tekst: Jestem w pętli 4) i = i+1=3+1=4 wartość i nie jest mniejsza od 4 pętla zostaje zakończona for (i =1; i<4; i++) printf (�Jestem %d raz w pętli�, i); // 3 razy kolejno tekst: Jestem 1 raz w pętli Jestem 2 raz w pętli ostatni raz: Jestem 3 raz w pętli Praca pętli for wykonywana jest według nastepującego algorytmu: 1. wykonują się instrukcje inicjujące pętlę inst_inic. 2. Obliczana jest wartość wyrażenia wyr_war. Jeśli wartość tego wyrażenia jest równa zero, praca pętli jest przerywana. 3. Jeśli powyżej okazało się, że wyr_war jest != 0, wtedy wykonywana są instrukcja 4. Po wykonaniu instrukcji, obilczana jest wartość wyrażenia wyr_krok. Po czym powtarzany jest punkt 2. Wyrażeń: inst_ini, wyr_war, wyr_krok - może być kilka,wtedy rozdzielane są przecinkami. Pętlą równoważną pętli for jest while w postaci: instr_inic; while (instr1_warunkowa) { // instrukcje instr2; } for (i =1; i < 4; i=i+1) printf (�Jestem w pętli�); i=1; while (i<4){ printf (�Jestem w pętli�); i = i + 1; } Pętlami tzw. nieskończonymi są pętle: for( ; ; ) { while( 1) { // instrukcje } do { //instrukcje } //instrukcje } while (1); Program 1 #include <conio.h> #include <iostream.h> void main() { clrscr(); for ( int i = 1; i<24; i++){ // int i - deklaracja zmiennej tylko w C++ cout<<i<<" INFORMATYKA \n"; gotoxy (2*i, i); } getch(); } Program 2 #include <iostream.h> #include <conio.h> void main(){ for(int i = 1; i<24; cout<<++i <<"INFORMATYKA\n"); } Instrukcje: while (wyrażenie) instrukcja do instrukcja while wyrażenie for (inst_ini; wyr_war; wyr_krok) instrukcja; nazywamy instrukcjami iteracyjnymi.