Rok akademicki 2011/2012, Pracownia nr 9 2/24 Informatyka 1 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr II, studia stacjonarne I stopnia Rok akademicki 2011/2012 Pracownia nr 9 (08/09.05.2012) dr inż. Jarosław Forenc Przykład - zaawansowanie operacji #include <winws.h> int i, koniec = 1000; Wykonano: 35% for (i=0; i<=koniec; i++) printf("\rwykonano: %3d%%", (int) (100*i/koniec)); Sleep(10); printf("\n"); Rok akademicki 2011/2012, Pracownia nr 9 3/24 Rok akademicki 2011/2012, Pracownia nr 9 4/24 Przykład - Wirująca kreska Pętla while #include <winws.h> for ( i<20; i++) printf("%c\b"," /-\\"[i%4]); Sleep(200); printf("\n"); / \ while () while (i<10) póki prawdziwy wykonuj instrukcję
Rok akademicki 2011/2012, Pracownia nr 9 5/24 Rok akademicki 2011/2012, Pracownia nr 9 6/24 Pętla while - złożona wykonanie w pętli while więcej niż jednej instrukcji wymaga umieszczenia ich w datkowych nawiasach klamrowych while ()... Przykład - 1 + 2 + +? < 100 int suma = 0, n = 0; Ilosc liczb: 13 Suma liczb: 91 while (suma < 100) n++; suma = suma + n; suma = suma - n; n--; printf("ilosc liczb: %d\nsuma liczb: %d\n",n,suma); Rok akademicki 2011/2012, Pracownia nr 9 7/24 Rok akademicki 2011/2012, Pracownia nr 9 8/24 Przykład skrócenie zapisu Przykład - parzystość liczb lub lub while (suma < 100) n++; suma = suma + n; lub while ((suma = suma + ++n) < 100) ; while ((suma += ++n) < 100) ; while (suma < 100) suma = suma + ++n; int x; while (scanf("%d",&x) == 1) if (x%2==0) printf("%d - liczba parzysta\n\n",x); else printf("%d - liczba nieparzysta\n\n",x);
Rok akademicki 2011/2012, Pracownia nr 9 9/24 Rok akademicki 2011/2012, Pracownia nr 9 10/24 Przykład - parzystość liczb Pętla while - break i continue Podaj liczbe (q - koniec): 3 3 - liczba nieparzysta Podaj liczbe (q - koniec): -4 int x; -4 - liczba parzysta while (scanf("%d",&x) == 1) Podaj liczbe (q - koniec): q if (x%2==0) printf("%d - liczba parzysta\n\n",x); else printf("%d - liczba nieparzysta\n\n",x); while (i<10) if (i%2==0) continue; if (i%5==0) break; - continue przerywa bieżącą iterację - break przerywa wykonywanie pętli Rok akademicki 2011/2012, Pracownia nr 9 11/24 Rok akademicki 2011/2012, Pracownia nr 9 12/24 Pętla while - błędy średnik na końcu while - pętla nieskończona: i = 0; while (i < 10) ; printf("%d ",i++); brak aktualizacji i pętla nieskończona: i = 0; while (i < 10) printf("%d ",i); 0 0 0 0 0 0 0 0 0 Pętla while - pętla nieskończona w pewnych sytuacjach celowo stosuje się pętlę nieskończoną: while (1)
Rok akademicki 2011/2012, Pracownia nr 9 13/24 Rok akademicki 2011/2012, Pracownia nr 9 14/24 Pętla while - zmienna kontrolna opuszczenie pętli można zrealizować wykorzystując tzw. zmienną kontrolną int stop = 0; while (!stop) if () stop = 1; Program sprawdzający rodzaj wciśniętego znaku na klawiaturze: litera, cyfra, znak odstępu, inny znak. Wprowadzaj znaki bez echa na ekranie - getch(). Wyświetl rodzaj znaku, sam znak i jego kod ASCII. Wyjście z programu powinno nastąpić po wciśnięciu litery q lub Q. Przykłady: Litera: k kod: 107 Cyfra: 7 kod: 55 Inny znak: * kod: 42 Rok akademicki 2011/2012, Pracownia nr 9 15/24 Rok akademicki 2011/2012, Pracownia nr 9 16/24 (ctype.h ctype.h) Zawiera funkcje zwracające wartość niezerową jeśli argument (znak) należy określonej kategorii: isalnum(znak) - litera lub cyfra isalpha(znak) - litera isdigit(znak) - cyfra isgraph (znak) znak drukowalny islower(znak) - mała litera isspace(znak) znak niedrukowalny (whitespace) isupper(znak) - wielka litera #include <conio.h> #include <ctype.h> int key; key = getch(); while (key!='q' && key!='q') if (isalpha(key)!=0) printf("litera: %c kod: %d\n",key,key);
Rok akademicki 2011/2012, Pracownia nr 9 17/24 Rok akademicki 2011/2012, Pracownia nr 9 18/24 if (isdigit(key)!=0) printf("cyfra: %c kod: %d\n",key,key); if (isspace(key)!=0) printf("znak odstepu: %c kod: %d\n",key,key); if (isalpha(key)==0 && isdigit(key)==0 && isspace(key)==0) printf("inny znak: %c kod: %d\n",key,key); key = getch(); if (isdigit(key)!=0) Litera: d kod: 100 printf("cyfra: %c kod: Cyfra: %d\n",key,key); 7 kod: 55 if (isspace(key)!=0) Litera: K kod: 75 printf("znak odstepu: %c Inny kod: znak: %d\n",key,key); \ kod: 92 if (isalpha(key)==0 && isdigit(key)==0 Znak odstepu: && isspace(key)==0) kod: 32 printf("inny znak: %c Inny kod: %d\n",key,key); znak: kod: 0 key = getch(); Inny znak: ; kod: 59 Inny znak: Ó kod: 224 Inny znak: ć kod: 134 Rok akademicki 2011/2012, Pracownia nr 9 19/24 Rok akademicki 2011/2012, Pracownia nr 9 20/24 Pętla while Pętla while - złożona while (); while (i<10); wykonuj instrukcję póki prawdziwy wykonanie w pętli while więcej niż jednej instrukcji wymaga umieszczenia ich w datkowych nawiasach klamrowych while ();
Rok akademicki 2011/2012, Pracownia nr 9 21/24 Rok akademicki 2011/2012, Pracownia nr 9 22/24 Pętla while - break i continue Porównanie pętli while i while while () while (); if (i%5==0) break; if (i%2==0) continue; while (i<10); - break przerywa wykonywanie pętli - continue przerywa bieżącą iterację Rok akademicki 2011/2012, Pracownia nr 9 23/24 Rok akademicki 2011/2012, Pracownia nr 9 24/24 Zastąpienie pętli for przez while Zastąpienie pętli while przez for for (wyr1; wyr2; wyr3) for (i=0; i<10; i++) while (wyr) for ( ; wyr ; ) wyr1; while (wyr2) i=0; while (i<10) wyr3;