Rok akademicki 2011/2012, Pracownia nr 8 2/30 Informatyka 1 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr II, studia stacjonarne I stopnia Rok akademicki 2011/2012 Pracownia nr 8 (25.04/04.05.2012) dr inż. Jarosław Forenc Pętla for for (inicjalizacja; test; aktualizacja) instrukcja; for (i=1; i<=10; i=i+1) instrukcja; instrukcja zostanie wykonana 10 razy inicjalizacja fałsz test prawda instrukcja aktualizacja Rok akademicki 2011/2012, Pracownia nr 8 3/30 Rok akademicki 2011/2012, Pracownia nr 8 4/30 Przykład - wyświetlenie tekstu Przykład - wyświetlenie tekstu int i; int i; for (i=1; i<=5; i=i+1) printf("\n"); for (i=1; i<=5; i=i+1) printf("\n");
Rok akademicki 2011/2012, Pracownia nr 8 5/30 Rok akademicki 2011/2012, Pracownia nr 8 6/30 Pętla for Pętla for for (i=1; i<=10; i=i+1) 1 2 3 4 5 6 7 8 9 10 for (i=1; i<=10; i=i+2) 1 3 5 7 9 for (i=0; i<10; i=i+1) 0 1 2 3 4 5 6 7 8 9 for (i=10; i>0; i=i-1) 10 9 8 7 6 5 4 3 2 1 for (i=0; i<10; i=i+1) printf("%d ",i+1); 1 2 3 4 5 6 7 8 9 10 for (i=-9; i<=9; i=i+3) -9-6 -3 0 3 6 9 Rok akademicki 2011/2012, Pracownia nr 8 7/30 Rok akademicki 2011/2012, Pracownia nr 8 8/30 Przykład - suma liczb 1+2+ +10 #define N 10 int i, suma=0; for (i=1; i<=n; i=i+1) suma = suma + i; Suma 10 liczb to 55 printf("suma %d liczb to %d\n", N, suma); Przykład - suma liczb 1+2+ +1000 #define N 1000 int i, suma=0; for (i=1; i<=n; i++) suma += i; Suma 1000 liczb to 500500 printf("suma %d liczb to %d\n", N, suma);
Rok akademicki 2011/2012, Pracownia nr 8 9/30 Rok akademicki 2011/2012, Pracownia nr 8 10/30 Operator inkrementacji (++) Operator inkrementacji (++) ++x lub x++ zwiększa wartość zmiennej o 1 ++x x++ - operator preinkrementacji - operator postinkrementacji ++x; x++; x = x + 1; operator jednoargumentowy może być stosowany tylko do zmiennych (nie wolno stosować do wyrażeń) int x = 1, y; int x = 1, y; y = 2 * ++x; ++x x = 2 y = 2 * x++; 2 * x 2 * 1 2 * ++x 2 * 2 y = 2 * x y = 2 y = 2 * ++x y = 4 x++ x = 2 x = 2, y = 4 x = 2, y = 2 Rok akademicki 2011/2012, Pracownia nr 8 11/30 Rok akademicki 2011/2012, Pracownia nr 8 12/30 Operator dekrementacji (--) --x x-- - operator predekrementacji - operator postdekrementacji zmniejsza wartość zmiennej o 1 --x; x--; x = x - 1; Operatory ++ i -- x = x++; x = ++x; x = x--; x = --x; wartość powyższych instrukcji jest nieokreślona nie należy stosować operatorów ++, -- do zmiennych pojawiających się w wyrażeniu więcej niż jeden raz
Rok akademicki 2011/2012, Pracownia nr 8 13/30 Rok akademicki 2011/2012, Pracownia nr 8 14/30 Skrócone operatory przypisania wyr1 = wyr1 op wyr2 wyr1 op= wyr2 x = x + 10; x += 10; y = y 2.5; y = 2.5; a = a * 14.3; a *= 14.3; b = b / 20.12; b /= 20.12; operatory: +, -, *, /, %, <<, >>, &, ^, Operatory bitowe Pętla for - instrukcja złożona wykonanie w pętli for więcej niż jednej instrukcji wymaga umieszczenia ich w dodatkowych nawiasach klamrowych for (wyr1; wyr2; wyr3) instrukcja1; instrukcja2;... Rok akademicki 2011/2012, Pracownia nr 8 15/30 Rok akademicki 2011/2012, Pracownia nr 8 16/30 Przykład - średnia arytmetyczna Przykład - średnia arytmetyczna int i, x, suma = 0; float srednia; for (i=0; i<10; i++) printf("liczba %02d: ",i+1); scanf("%d",&x); suma += x; srednia = suma / 10.0f; printf("srednia: %.2f\n",srednia);
Rok akademicki 2011/2012, Pracownia nr 8 17/30 Rok akademicki 2011/2012, Pracownia nr 8 18/30 Przykład - średnia arytmetyczna Przykład - rezonans prądów srednia = suma / 10.0f; printf("srednia: %.2f\n",srednia); Liczba 01: 34 Liczba 02: 78 Liczba 03: 56 Liczba 04: 23 Liczba 05: 1 Liczba 06: 95 Liczba 07: 73 Liczba 08: 56 Liczba 09: 23 Liczba 10: 78 Srednia: 51.70 Obwód elektryczny ma następujące parametry: R = 15 Ω, L = 0,125 H, C = 0,254 mf. Wyznacz pulsację rezonansową (rezonans prądów) obwodu jeśli jego admitancja zastępcza określona jest poniższym wzorem: Y = R 2 R + X 2 C + C ( 2 2 R + X C Wskazówka: zbadaj pulsację w zakresie od 100 do 500 rad/s z krokiem 0,1 rad/s. j X 1 X L ) Rok akademicki 2011/2012, Pracownia nr 8 19/30 Rok akademicki 2011/2012, Pracownia nr 8 20/30 Przykład - rezonans prądów Przykład - rezonans prądów #include <math.h> double R = 15.0; double L = 0.125; double C = 0.254e-3; double XL, XC; double Im, ImMin, w, wmin; wmin = 100.0; XL = wmin*l; XC = 1.0/(wMin*C); ImMin = fabs(xc/(r*r+xc*xc)-1.0/xl); for (w=100.1; w<=500; w+=0.1) XL = w*l; XC = 1.0/(w*C); Im = fabs(xc/(r*r+xc*xc)-1.0/xl); if (Im<ImMin) ImMin = Im; wmin = w; printf("pulsacja: %g\n",wmin); printf("im(y): %g\n",immin);
Rok akademicki 2011/2012, Pracownia nr 8 21/30 Rok akademicki 2011/2012, Pracownia nr 8 22/30 Przykład - rezonans prądów Pętla for - błędy for (w=100.1; w<=500; w+=0.1) Pulsacja: 240.9 Im(Y): 2.37284e-006 XL = w*l; XC = 1.0/(w*C); Im = fabs(xc/(r*r+xc*xc)-1.0/xl); if (Im<ImMin) ImMin = Im; wmin = w; printf("pulsacja: %g\n",wmin); printf("im(y): %g\n",immin); średnik na końcu pętli for: for (i=1; i<=10; i++) ; 11 przecinki zamiast średników w pętli for: for (i=1, i<=10, i++) błąd kompilacji Rok akademicki 2011/2012, Pracownia nr 8 23/30 Rok akademicki 2011/2012, Pracownia nr 8 24/30 Pętla for - błędy błędny warunek - brak wykonania instrukcji: for (i=1; i>=10; i++) błędny warunek - pętla nieskończona: for (i=1; i>0; i++) 1 2 3 4 5 6 7 8 9 Pętla for - pętla niekończona for (wyr1; wyr2; wyr3) instrukcja; wszystkie wyrażenia w pętli for są opcjonalne for ( ; ; ) instrukcja; - pętla nieskończona w przypadku braku wyr2 przyjmuje się, że jest ono prawdziwe
Rok akademicki 2011/2012, Pracownia nr 8 25/30 Rok akademicki 2011/2012, Pracownia nr 8 26/30 Instrukcja break break - przerywa wykonywanie pętli for Instrukcja continue continue - przerywa bieżącą iterację i przechodzi do kolejnej for (i=0; i<10; i++) if (i%5==0) break; printf( %d\n,i); for (i=0; i<10; i++) if (i%5==0) continue; printf( %d\n,i); Rok akademicki 2011/2012, Pracownia nr 8 27/30 Rok akademicki 2011/2012, Pracownia nr 8 28/30 Instrukcja goto goto - bezwarunkowy skok do etykiety stosowanie tej instrukcji nie jest zalecane for (i=0; i<10; i++) if (i%5==0) goto dalej; printf( %d\n,i); dalej: printf( koniec\n ); - można skoczyć do dowolnego miejsca w programie - etykieta musi poprzedzać instrukcję Zagnieżdżanie pętli for jako instrukcja występuje kolejna pętla for for (i=1; i<=3; i++) for (j=1; j<=2; j++) printf( i=%d, j=%d\n,i,j); dla i = 1 for (j=1; j<=2; j++) printf( i=%d, j=%d\n,i,j); dla i = 2 for (j=1; j<=2; j++) printf( i=%d, j=%d\n,i,j); dla i = 3 for (j=1; j<=2; j++) printf( i=%d, j=%d\n,i,j); - pętla zewnętrzna - pętla wewnętrzna i=1, j=1 i=1, j=2 i=2, j=1 i=2, j=2 i=3, j=1 i=3, j=2
Rok akademicki 2011/2012, Pracownia nr 8 29/30 Rok akademicki 2011/2012, Pracownia nr 8 30/30 Przykład - tabliczka mnożenia int i, j; for (i=1; i<11; i++) for (j=1; j<11; j++) printf("%2d ", i*j); printf("\n"); Przykład - tabliczka mnożenia 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 int i, j; 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 for (i=1; i<11; 7 i++) 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 for (j=1;j<11;j++) 9 18 27 36 45 54 63 72 81 90 printf("%2d 10 20 ",i*j); 30 40 50 60 70 80 90 100 printf("\n");