CVIČENIE 3/13 (SW2) Programovanie v jazyku C - pole treba poorat... PrednaskaB: Operátory, pravidla vyhodnocování PrednaskaZ: Číselné typy, operátory, typové konstrukce, pole a struktury About zadefinovanie pojmu pole a jeho zakladne vlastnosti, jednorozmerne a viacrozmerne polia, staticke a dynamicke polia TODO: Priklad: Vypsat text tak, aby první písmeno každého slova bylo velké a místo více mezer mezi slovy vypsat jen jednu mezeru int main(int argc, char** argv) int c; int lastc = EOF; int veslove = 0; while( (c = getchar())!= EOF) if( c == ' ') // mezery if( lastc!= ' ') putchar( ' '); else // nemezera if( veslove) putchar( c); else putchar( toupper( c)); veslove = 1; if(! isalnum( c)) veslove = 0; lastc = c; return 0; // zacatek slova // zapamatuj znak
Priklad: Vypsat text tak, aby první i poslední písmeno každého slova bylo velké a místo mezer mezi slovy vypsat jen jednu mezeru POMOCÍ PŘEDCHOZÍHO PŘÍKLADU (minimální změnou předchozího příkladu) #include <ctype.h> int vyhled = EOF; // globalni promenna int get( void) // funkce nacte znak a vrati predchozi nacteny znak int c = vyhled; vyhled = getchar(); return c; int main(int argc, char** argv) int c; int lastc = EOF; int veslove = 0; get(); while( (c = get())!= EOF) // c je znak, ktery se zpracovava if( c == ' ') // mezery if( lastc!= ' ') putchar(' '); else // nemezera if( veslove && isalnum(vyhled)) // prostredek slova putchar( tolower(c)); else // zacatek nebo konec slova putchar( toupper( c)); veslove = 1; if (!isalnum( c)) veslove = 0; lastc = c; return 0; // zapamatuj znak
Basic knowledge pole je datova struktura zlozena z prvkov rovnakeho typu. niekolko vlastnosti: prvky pola sa VZDY indexuju od 0 prvky pola su VZDY rovnakeho typu, pricom typ moze byt jednym zo zakladnych (int, char, float, double) ale aj strukturovane (vlastne definovane typy, smerniky,...) priklad pouzitia: TYP x[pocet]; priklad staticky alokuje blok pamati pre pocet objektov typu TYP, pricom rozsah indexov je od 0 do pocet-1. Jednorozmerne pole jednorozmerne pole sa da inac nazvat vektor (premenna(a1, a2, a3,..) ) priklad pouzitia: int x[10]; x[0] = 5; x[9] = 7; x[10] = 1; // chyba - 10 nie je posledny prvok pola #define MAX 10 int x[max], y[max * 2], z[max + 1]; priklady definicii: int pole1[5] = 2, 4, 6, 8, 10 ; int pole2[] = 2, 4, 6, 8, 10 ; float pole3[5] = 1.2, 2.5, 8.4, 6.0, 4.7 ; double pole4[] = 1.2, 2.5, 8.4, 6.0, 4.7 ; specifickym typom jednorozmerneho pola je retazec - jednorozmerne pole typu char obsahujuce ako prvky pola znaky tvoriace retazec. retazec, pokial ma byt vypisany na obrazovku alebo ma pracovat s funkciami na pracu s retazcom, je potrebne ukoncit znakom '\0'. pre pouzitie osobitych funkcii pre pracu s retazcami sa pouziva kniznica string.h.
priklady pouzitia: char mesto[50]; char meno[] = "janko\0"; char meno2[] = 'b', 'a', 't', 'm', 'a', 'n', '\0' ; printf( "%s\n", meno ); Dvojrozmerne pole dvojrozmerne pole sa da prirovnat ku tabulke alebo ku matici. tabulka aj matica je specificka riadkami a stlpcami, preto dva rozmery (dvojrozmerne pole), ktore sa zadavaju, sa daju interpretovat ako riadok a stlpec. syntax: TYP x[riadky][stlpce]; priklad pouzitia: int tabulka[5][4]; int a[2][3] = 22,1,16,112,0,4 ; int b[][2] = 22,1,16,112,0,4 ; Examples Ex. 1: nacitat zo vstupu N cisiel a vypisat najvacsie z nich. #define MAX 100 int pole[max]; int pocet, i, cislo, najvacsi; printf( "zadaj pocet nacitavanych cisiel: " ); scanf( "%d", &pocet ); for( i = 0; i < pocet; i++ ) printf( "zadaj %d cislo: ", i+1 ); scanf( "%d", &cislo ); pole[i] = cislo; najvacsi = 0; /* zistit najvacsi */ printf( "najvacsi prvok je: %d\n", najvacsi ); getchar();
Ex. 2: modifikovat vysledny program z Ex. 1 a vypisat cisla v opacnom poradi. Ex. 3: nacitat zo vstupu obsah matice a vypisat ju a na konci kazdeho riadku vypisat jeho sucet. #define MAX 100 int matica[max][max+1]; int i, j; int riadkov, stlpcov, prvok; printf( "zadaj pocet riadkov a stlpcov matice: " ); scanf( "%d %d", &riadkov, &stlpcov ); // najprv maticu nacitame zo vstupu for( i = 0; i < riadkov; i++ ) for( j = 0; j < stlpcov; j++ ) printf( "zadaj prvok [%d][%d]: ", i+1, j+1 ); scanf( "%d", &prvok ); matica[i][j] = prvok; */ /* vyratame sucet kazdeho riadku a zapiseme ho do posledneho stlpca // vypiseme vysledok for( i = 0; i < riadkov; i++ ) for( j = 0; j < stlpcov+1; j++ ) printf( "%d ", matica[i][j] ); printf( "\n" ); getchar();getchar();
Ex. 4: zistite velkost nacitaneho retazca zo vstupu. #define MAX 100 char retazec[max]; int dlzka; printf( "napis retazec: " ); scanf( "%s", retazec ); dlzka = 0; /* zistime dlzku retazca */ printf( "dlzka retazca je: %d\n", dlzka ); getchar();getchar(); Ex. 5: zo vstupu nacitajte retazec. vypiste na obrazovku pocet znakov v tomto retazci a pocet cislic, ktore sa v tomto retazci nachadzaju.
Homework nepovinna implementacia Hangman-a. ukazka implementacie : #include <string.h> #define MAX 50 char slovo[] = "jahodka"; char uhadnute[max] = ""; char koniec = 'n', nasiel = 'n'; char tip; int tvoja_smrt = 5, i, pozicia; // nakreslime podtrhnitka na zaklade dlzky slova for( i = 0; i < strlen(slovo) - 1; i++ ) uhadnute[i] = '_'; // hlavna slucka while( (koniec == 'n') && (tvoja_smrt!= 0) ) // vypiseme uhadnute a nacitame hracov tip printf( "%s\npocet pokusov: %d\ntvoj tip: ", uhadnute, tvoja_smrt ); tip = getchar();getchar(); // zistime, ci nieco nasiel nasiel = 'n'; for( i = 0; i < strlen(slovo); i++ ) if( slovo[i] == tip ) nasiel = 'a'; uhadnute[i] = tip; // ak nic nenasiel, znizime mu zivot if( nasiel == 'n' ) tvoja_smrt--; // co ak uz uhadol secko? if( strcmp( uhadnute, slovo ) == 0 ) koniec = 'a'; // poplasne spravy na koniec if( tvoja_smrt == 0 ) printf( "je mi luto - si trapny. slovo bolo %s\n", slovo ); else printf( "gratulujem - si to zvladol\n" ); getchar(); getchar();