Potae a programovn 1 pro obor EST KPC
Počítače a programování 1 pro obor EST KPC 1 E TUTORIÁL 3 OSNOVA: a) Příkazy pro cykly II. b) Příkazy pro řízení přenosu c) Příkazy – příklad d) Řetězce v C e) Funkce stdio. h pro řetězce f) Funkce string. h pro řetězce h) Řetězce – příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně
Příkazy pro cykly II. (1/4) • Cyklus while(test) statement; float temp[31]={-1. 1, -0. 3, -7. 6, -2. 7, -1. 2, -2. 6, -3. 3, … … 2. 4 }; //day temperatures in January unsigned int day = 1; while(temp[day– 1]<=0) // pass the loop while temp<=0 day++; printf("%d. January temperature ovecomes 0, it was %3. 1 f deg. C!n", day, temp[day-1]); return 0; • Princip totožný s for (inicializace a inkrementace mimo hlavičku) Příklad: KPC 1 E_Ex 23. c
Příkazy pro cykly II. (2/4) • while
Příkazy pro cykly II. (3/4) • Cyklus do - while do statement; while(test); int code; // number for password do { printf("Insert access code: n"); scanf("%d", &code); //number from stdin to variable code } while(code != 12345); // test of proper password 12345 printf("nn. Access allowed"); printf("nn. Insert <space>+ENTER for exit"); do //exit after <space> insertion c=getchar(); while (c!=' '); return 0; Příklad: KPC 1 E_Ex 24. c
Příkazy pro cykly II. (4/4) • do - while
Příkazy pro přenos řízení (1/3) • Příkazy continue a break • Použití: – těla cyklů (for, do, while) – tělo přepínače (switch). • Přerušení vykonávaného iteračního cyklu: – break: vystoupení z celého cyklu – continue: pokračování další iterací for/do/while/switch-case { …; if(…) break; if(…) continue; …; }
Příkazy pro přenos řízení (2/3) • break – př. test vstupního hesla s omezeným počtem testů char c; int code, test, n=3; // n is the number of trials do { printf("Insert access code: n"); scanf("%d", &code); //number from stdin to variable code n--; //decrementation of the number of trials test=(code == 12345); // test of proper password ” 12345” if((test==0)&&(n==0)) break; // if no proper // code and 3 trials done - acces denied } while(!test); // in test is info about access, // 0 means denied, 1 means allowed Příklad: KPC 1 E_Ex 25. c
Příkazy pro přenos řízení (3/3) • continue – př. hledání dělitelů int num; //input number int test, n, m=0; printf("Input number: "); scanf("%d", &num); //number from stdin to variable num for(n=2; n<=100; n++) //loop for n from 2 to 100 { test = (num%n==0); //test if n is divider if(!test) continue; //if not, next n printf("n%d", n); //if yes, print n m++; //number of dividers – incr. } printf("Number of dividers: %dn", m); Příklad: KPC 1 E_Ex 26. c
Příkazy – příklad (1/4) • Sestavte program pro simulaci dopravní situace. Ze simulované světelné křižovatky (z jednoho příjezdu) odjede každou minutu rcars automobilů, v proměnné wcars je počáteční stav čekajících aut, v poli ncars je uveden počet aut, které každou minutu přijedou ke křižovatce a v proměnné mcars je maximální počet aut čekajících před křižovatkou, aniž by došlo ke kolapsu (auta by zůstali stát v předcházející křižovatce). V proměnných hours a mins je aktuální čas počátku simulace. Simulátor nechť zobrazuje graficky i číselně stav aut stojících před křižovatkou a současně určuje, zda nedošlo ke kolapsu a nebo došlo kolapsu a kdy. int main() { int rcars = 10; int wcars = 5; int ncars[30] = {7, 8, 8, 9, … 5, int mcars = 95; int hours = 7; //start is at 7: 50 int mins = 50; int inc = 30; 6};
Příkazy – příklad (2/4) int i, j; for(i=0; i<inc; i++) { wcars += ncars[i] - rcars; if(wcars<0) wcars = 0; mins++; if(mins==60) { mins = 0; hours++; if(hours==24) hours = 0; }
Příkazy – příklad (3/4) if(mins>=10) printf("%d: %d ", hours, mins); else printf("%d: 0%d ", hours, mins); for(j=0; j<wcars; j++) printf("%c", 219); printf(" %dn", wcars); if(wcars>mcars) { printf("Traffic breakdown arises at %d: %d. n", hours, mins); break; } } if(wcars<=mcars) printf("Traffic breakdown will not arise. n"); return 0; }
Příkazy – příklad (4/4) • Výstup dopravní simulace: Příklad: KPC 1 E_Ex 27. c
Řetězce v C (1/9) • Řetězec: pole znaků (v paměti: 1 byte/znak – kód ASCII) zakončený terminátorem null (ASCII hodnota 0) • ASCII kódy znaků v rozsahu 0 až 127 celosvětově standardizované • ASCII kódy znaků v rozashu 128 až 255 (unsigned) nebo záporné (signed) závislé na aktuálně nastavené znakové sadě (národní znaky apod. UTF-8, Windows-1250, ISO-8859 -x) – tzv. Extended ASCII • Znaky pro číslice mají ASCII kódy 48 až 57, tj. hexadecimálně 0 x 30 až 0 x 39, postup pro vygenerování znaku: char ch; int num=5; ch = num|0 x 30; //or ch = num+0 x 30; printf("%d %c", ch);
Řetězce v C (2/9) • písmena velké anglické abecedy jsou uspořádaně od kódu 65, hexadecimálně 0 x 41 • písmena malé anglické abecedy jsou uspořádaně od kódu 97, hexadecimálně 0 x 61 (rozdíl vůči stejným velkým písmenům je 32 nebo-li hexadecimálně 0 x 20)
Řetězce v C (3/9) • Př. Tisk všech tisknutelných znaků včetně Extended ASCII int main(void) { unsigned char c; printf("Actual character set: nn"); for(c=32; c<=255 && c>=32; c++) printf("ASCII code %d = character %cn", c, c); scanf("%c", &c); return 0; } • Extended znaky jsou dány nastavením OS (Win), std. UTF-8
Řetězce v C (4/9) • Výpis na obrazovku: Příklad: KPC 1 E_Ex 28. c
Řetězce v C (5/9) Způsoby deklarace: • char str. A[5] = {’A’, ’B’, ’C’, ’D’, ’ ’}; – 4 znaky + znak null • char str. B[5] = ”ABCD”; – 4 znaky, znak null vložen automaticky - na stejném principu se definuje řetězec v parametru printf() – počet prvků nemusí být uveden, kompilátor sám dopočítá • char *str. C = ”ABCD”; - ukazatel na první znak, první znak ukazuje na následující, atd. až do null (nedoporučeno – možné kolize v paměti)
Řetězce v C (6/9) • Př. Převrácení textu, malá písmena => velká písmena char S[7], T[7], c; char R[7]="ABCDEF"; int n; for(n=0; n<6; n++) S[5 -n] = R[n]; // last -> first, R[n] != ’ ’ //or S[5 -n] = *(R+n); S[6]='