Pole v C a C# V kapitole je vysvětlen pojem pole v programování, jeho deklarace, inicializace a přístup k prvkům pomocí indexu v jazycích C a C#. Je také ukázána práce s řetězci (v jazyku C# existuje typ string). Na závěr je ukázána práce s vícerozměrnými poli a jsou uvedeny časté chyby při práci s poli. Kapitola je doplněna řadou příkladů. Klíčové pojmy: Pole, řetězce, index, deklarace, inicializace, vícerozměrná pole, typ string.
Pojem pole v programování Pole je množina prvků stejného typu, jdoucích v paměti za sebou. Každý prvek pole nemá své vlastní jméno, nýbrž pole je pojmenováno jako celek. Prvky pole jsou indexovány (označeny čísly) kvůli rychlému a snadnému přístupu. K prvkům pole přistupujeme prostřednictvím jména pole a indexu. Index je pořadové číslo prvku v rámci pole, uváděné v hranatých závorkách: Jmeno[index] V jazycích C i C# jsou prvky pole číslovány od nuly. Pole je vhodné pro zpracování cyklem – indexem bývá řídící proměnná cyklu. Použití pole Pole je vhodné použít, chceme-li všechny prvky zpracovat stejným způsobem pomocí cyklu. Jak souvisí pole s řetězcem znaků V jazyku C je řetězec je speciální typ pole, obsahující znaky (typ char), ukončený nulovým znakem: '\0'. V jazyku C# můžeme pracovat s polem znaků, ale navíc existuje datový typ string, který umožňuje pracovat s proměnnými tohoto typu.
Deklarace pole Deklarace v C: Typ jmeno_pole[pocet_prvku];
2.11.11
Pole v C a C#
1/38
Příklad: int X[3]; Deklarace v C#: Typ []jmeno_pole=new int[pocet_prvku]; Příklad: int []X=new int[3];
Typ – platný datový typ v C/C# jmeno_promenne – platný identifikátor v C/C# pocet_prvku = maximální počet prvků v poli
Příklad: Deklarujte pole, které je schopné přijmout 3 prvky typu int a vložte do nich čísla 1,2,3. Potom hodnoty všech prvků vypište! jméno pole X
1
2
3
index prvku
0
1
2
Řešení v C: int X[3]; int i; X[0]=1; X[1]=2; X[2]=3; for(i=0;i<3;i++)printf("%d ",X[i]); Řešení v C#: int []X=new int[3]; int i; X[0]=1; X[1]=2; X[2]=3; for(i=0;i<3;i++) Console.Write("{0} ",X[i]); Jméno pole (identifikátor) Identifikátory jsou jména, která dáváme například proměnným, funkcím a typům. 2.11.11
Pole v C a C#
2/38
Identifikátor se musí lišit od kteréhokoliv klíčového slova. Identifikátor je tvořen posloupností alfanumerických znaků a podtržítka, přičemž musí být splněny následující podmínky: prvním symbolem smí být písmeno nebo podtržítko následuje libovolná kombinace písmen, číslic a podtržítek Jazyk C/C# v identifikátorech rozlišuje malá a velká písmena (je tzv. „case sensitive“)
Inicializace pole Inicializace je počáteční nastavení hodnot prvků pole. Pokud nastavujeme počáteční hodnoty prvků pole v rámci deklarace, můžeme vynechat počet prvků – nechat [ ] prázdné. Překladač doplní počet prvků podle skutečného počtu prvků v [ ] . Příklad inicializace v C: char rim[]={'I','V','X','L','C','D','M'}; int arab[]={1,5,10,50,100,500,1000}; int X[]={1,2,3};
Příklad inicializace v C#: char []rim={'I','V','X','L','C','D','M'}; int []arab={1,5,10,50,100,500,1000}; int []X={1,2,3};
Co je to index Index je pořadové číslo prvku v rámci pole. Prvky jsou číslovány od nuly. Přístup k prvkům pole pomocí indexu Namísto jména jednoduché proměnné použijeme jméno pole a v hranatých závorkách index pole:
Příklady: Výpis prvního prvku pole znaků rim: V C: printf("%c\n", rim [0]);
2.11.11
Pole v C a C#
3/38
V C#: Console.WriteLine("{0}", rim[0]);
Jako index lze použít i název proměnné typu int. V C: int i = 5; printf("%c\n",z[i]);
V C#: int i = 5; Console.WriteLine("{0}", rim[i]);
Velikost pole Velikost pole v bytech určíme podle vzorce: Počet prvků * počet bytů, které zabírá příslušný datový typ Lze vypsat: V C: printf("%c",sizeof(rim)); printf("%d",sizeof(arab));
V C#: Console.WriteLine("{0}", rim.Length*sizeof(char)); Console.WriteLine("{0}", arab.Length*sizeof(int));
Načtení prvků pole V cyklu pomocí indexu, který je současně řídící proměnnou cyklu. Je inicializován na hodnotu 0 a mění se s krokem 1. Podmínka trvání cyklu je, že hodnota řídící proměnné musí být menší, než maximální počet prvků pole. V C: int X[3]; for(i=0;i<3;i++)scanf("%d",&X[i]);
V C#: int []X=new int[3]; for (i = 0; i < 3; i++) X[i]=Convert.ToInt32(Console.ReadLine());
2.11.11
Pole v C a C#
4/38
Výpis prvků pole V cyklu pomocí indexu, který je současně řídící proměnnou cyklu. Je inicializován na hodnotu 0 a mění se s krokem 1. Podmínka trvání cyklu je, že hodnota řídící proměnné musí být menší, než maximální počet prvků pole. V C: for(i=0;i<5;i++)printf("%d ",X[i]);
V C# for (i = 0; i < 5; i++)Console.WriteLine("{0}", X[i]);
V C# kromě cyklu for existuje cyklus foreach, který je vhodný pro práci s prvky pole. Má tvar: foreach(int a in X)Console.WriteLine("{0}",a);
Příkaz foreach prochází všechny prvky pole X. Při každé iteraci nejprve umístí hodnotu načteného prvku do proměnné a, a pak vykoná všechny příkazy v těle cyklu – v našem příkladě výpis hodnoty proměnné a.
Řetězce V jazyku C je řetězec je pole znaků (typu char) ukončené nulovým znakem. int i; char z[10]; scanf("%s",&z); // lze pouz. gets(z); for (i=0;z[i] !='\0';i++) printf("%c\n",z[i]);
V jazyku C# existuje klíčové slovo string, které umožňuje deklarovat a definovat řetězce. int i; string z; z=Console.ReadLine(); for(i=0;i
Deklarace řetězce V C musíte deklarovat pole znaků, do kterého se vejde řetězec o 1 byte delší než požadovaná velikost (řetězec je ukončený nulovým znakem). 2.11.11
Pole v C a C#
5/38
VC char ret[pocet];
V C# char []ret=new char[pocet]; string retezec;
Načtení řetězce V C: gets(ret); scanf("%s",ret);
V C#: string retezec; retezec = Console.ReadLine();
Výpis řetězce V C: puts(ret); printf("%s",ret);
V C#: Console.WriteLine(retezec);
Určení délky řetězce V C: char ret[]="Nazdar"; int n; n=strlen(ret);
Pro použití funkce strlen
je třeba vložit hlavičkový soubor string.h.
V C#: string retezec="Nazdar"; int n; n = retezec.Length;
2.11.11
Pole v C a C#
6/38
Přístup k znakům řetězce V C: Pomocí jména řetězce a indexu – pořadového čísla znaku v řetězci – číslování je od 0. Čtení znaku: scanf("%c",&ret[i]); Výpis znaku: printf("%c",ret[i]);
V C#: V proměnné typu string nemůžeme měnit jednotlivé znaky – pouze obsah řetězce jako celku. Znaky můžeme měnit v poli znaků a tímto polem znaků můžeme inicializovat řetězec: string retezec; char []ret=new char[8]; for (int i = 0; i < 8; i++) ret[i]=Convert.ToChar(Console.ReadLine()); retezec = new string(ret); Console.WriteLine(retezec);
Nejdůležitější funkce pro práci s řetězci v C V jazyku C jsou 4 nejdůležitější funkce pro práci s řetězci: strcpy(cil, zdroj); kopírování strcat(cil, zdroj); připojení strcmp(cil, zdroj); porovnání strlen(str); vrací délku řetězce Hlavičkový soubor pro použití funkcí pro práci s řetězci v C Chceme-li použít funkce pro práci s řetězci, musíme vložit hlavičkový soubor string.h Kopírování řetězců v C: char zdroj[]="Dobry den", cil[40]; strcpy(cil, zdroj); kopírování puts(cil);
v C#: zdroj.CopyTo(OdIndexZdroj, cíl, OdIndexCíl, PočetZnaků); int i; string z;
2.11.11
Pole v C a C#
7/38
char[] PoleZnaku = "Pardubice".ToCharArray(); z=Console.ReadLine(); z.CopyTo(3, PoleZnaku, 0, 5); Console.WriteLine(PoleZnaku); Bratislava tislabice
Spojování řetězců v C: char zdroj[]="Dobry den", cil[]=" Ahoj"; strcat(cil, zdroj); //připojení puts(cil);
v C#: V C# lze řetězce spojit pomocí operátoru + . string zdroj = "Dobry den"; string cil=" Ahoj"; cil+=zdroj;
//připojení
Console.WriteLine(cil);
Porovnání řetězců v C: if(!strcmp(cil, zdroj))printf("stejne"); else printf("ruzne");
1.
Hádání řetězce – porovnání dvou řetězců v C: int j; char rt[10],rt1[10]; printf("Zadej retezec: "); scanf("%s",rt); system("cls"); for (j=1;j<strlen(rt)+1;j++) printf("-"); printf("\nHadej retezec: "); scanf("%s",rt1); if (strcmp(rt,rt1)) printf("Neuhodls \n"); else printf("Uhodls \n");
2.11.11
Pole v C a C#
8/38
v C#: V C# lze řetězce porovnat pomocí relačního operátoru == . int j; string rt1; string rt2; Console.WriteLine("Zadej retezec: "); Console.ForegroundColor = ConsoleColor.White; rt1=Console.ReadLine(); Console.Clear(); Console.ForegroundColor = ConsoleColor.Black; for (j = 0; j < rt1.Length; j++) Console.Write("-"); Console.WriteLine("\nHadej retezec: "); rt2 = Console.ReadLine(); if (rt1 == rt2) Console.WriteLine("Uhodls \n"); else Console.WriteLine("Neuhodls \n");
2.
Převedení řetězce na racionální, celé a dlouhé celé číslo
v C: Aby bylo možné použít dále uvedené funkce, je třeba vložit hlavičkový soubor: stdlib.h.
int n; long l; float f; char str[] = "12345.67";
// Převod na celé číslo n = atoi(str); printf("string = %s integer = %d\n", str, n);
// Převod na dlouhé celé číslo l = atol(str); printf("string = %s long = %d\n", str, l);
// Převod na racionální číslo f = atof(str); printf("string = %s float = %f\n", str, f);
Vypíše se: string = 12345.67 integer = 12345 string = 12345.67 long = 12345 string = 12345.67 float = 12345.670000
Po převodu řetězců na čísla lze s nimi provádět aritmetické operace.
2.11.11
Pole v C a C#
9/38
#include <stdlib.h> #include <stdio.h> #include
int main(void) { int a,b; char str1[80] ; char str2[80] ; gets(str1); a=atoi(str1); gets(str2); b=atoi(str2); printf("%d",a+b); getch(); return 0; }
Pro racionální čísla: float a,b; char str1[80]; char str2[80]; gets(str1); a=atof(str1); gets(str2); b=atof(str2); printf("%f",a+b);
v C#: Převody načtených řetězců provádíme pomocí konverzních funkcí třídy Convert: int i1,i2; string str1; string str2; str1=Console.ReadLine(); str2=Console.ReadLine(); i1 = Convert.ToInt32(str1); i2 = Convert.ToInt32(str2); Console.WriteLine(i1+i2); float f1, f2; str1=Console.ReadLine(); str2=Console.ReadLine(); f1 = (float)Convert.ToDouble(str1); f2 = (float)Convert.ToDouble(str2);
2.11.11
Pole v C a C#
10/38
Console.WriteLine(f1+f2); long l1, l2; str1=Console.ReadLine(); str2=Console.ReadLine(); l1 = Convert.ToInt64(str1); l2 = Convert.ToInt64(str2); Console.WriteLine(l1+l2);
3.
Nalezení prvního výskytu zadaného znaku v řetězci
Dále uvedený program načte řetězec a hledaný znak. V cyklu for prochází zadaným řetězcem a porovnává jeho znaky se zadaným znakem. Pokud je znak na příslušné pozici v řetězci totožný se zadaným znakem, vyskočí z cyklu příkazem break. Za cyklem program otestuje hodnotu řídící proměnné, a pokud je větší, nebo rovná délce řetězce, vypíše se, že znak nebyl nalezen. Pokud je hodnota řídící proměnné menší, než délka řetězce, vypíše se její hodnota, co je také pozice hledaného znaku v řetězci. v C: int i; char ret[80]; char c; printf("Zadej retezec:"); gets(ret); printf("Zadej hledany znak:"); c=getchar(); for(i=0;i<strlen(ret);i++) if(ret[i]==c)break; if(i>=strlen(ret))printf("Znak nenalezen\n"); else printf("Pozice prvniho vyskytu zadaneho znaku je: %d\n",i);
v C#: int i; string ret; char c; Console.WriteLine("Zadej retezec:"); ret=Console.ReadLine(); Console.WriteLine("Zadej hledany znak:"); c =Convert.ToChar(Console.ReadLine());
2.11.11
Pole v C a C#
11/38
for(i=0;i= ret.Length) Console.WriteLine("Znak nenalezen\n"); else Console.WriteLine("Pozice prvniho vyskytu zadaneho znaku je: {0}\n", i);
Příklady: 1.
Čtení řetězce po znacích
Program čte jednotlivé znaky v cyklu do – while a ukládá je do řetězce ret. Cyklus končí zadáním konce řádku ('\n'). Nakonec musíme řetězec ukončit nulovým znakem (přidat '\0'). int i=0; char ret[80]; do{ scanf("%c", &ret[i]); }while(ret[i++]!='\n'); ret[--i]='\0'; // Na konec řetězce přidáme nulový znak puts(ret);
Komunikace programu s uživatelem: Josef Novak Josef Novak Press any key to continue
2.
Hádání řetězce po znacích – hledání znaku v řetězci
char ret[]="nejneobhospodarovatelnejsi"; char pokus[40],z; int i,n; n=strlen(ret); for(i=0;ret[i];i++) pokus[i]='-'; pokus[i]='\0'; printf("\n"); do{ puts(pokus); z=getch(); for(i=0;i
2.11.11
Pole v C a C#
12/38
3.
Tajné čtení řetězce
V uvedeném programu čteme znaky v cyklu do-while a místo načteného znaku se vypíše '*'. Cyklus končí po zadání Enter (kód 13). Za cyklem přidáme do řetězce nulový znak ('\0')..a řetězec vypíšeme funkcí puts(ret). v C: int i=0; char ret[80]; do{ ret[i]=getch(); if((int)ret[i]==13)break; putchar('*'); }while((int)ret[i++]!=13); ret[i]='\0'; // Na konec řetězce přidáme nulový znak puts("\n"); puts(ret);
v C#: Má-li metoda ReadKey(true), načtený znak se nevypíše na obrazovku. int i=0; char []ret=new char[80]; do{ ret[i]=(char)Console.ReadKey(true).KeyChar; if((int)ret[i]==13)break; Console.Write('*'); }while((int)ret[i++]!=13); ret[i]='\0'; // Na konec řetězce přidáme nulový znak Console.WriteLine(); Console.WriteLine(ret);
Kódy znaků můžeme zjistit, když po čtení znaku zařadíme výpis jeho kódu: printf("%d",(int)ret[i]);
4.
Hádání tajně načteného řetězce
int i=0; char ret[80],ret2[80]; do{ ret[i]=getch();
2.11.11
Pole v C a C#
13/38
putchar('*'); }while((int)ret[i++]!=13); ret[--i]='\0'; // Na konec řetězce přidáme nulový znak puts("\n"); puts("Hadej retezec: "); gets(ret2); if(!strcmp(ret,ret2))puts("Uhodls"); else puts("Neuhodls");
5.
Hádání řetězce po znacích
v C: int i=0,n; char pokus[40],z; char ret[80]; do{ ret[i]=getch(); putchar('*'); }while((int)ret[i++]!=13); ret[--i]='\0'; // Na konec řetězce přidáme nulový znak puts("\n"); n=strlen(ret); for(i=0;ret[i];i++) // Vypomlčkování pokus pokus[i]='-'; pokus[i]='\0'; printf("\n"); do{ puts(pokus); // vypsání pokus z=getch(); // čtení hádaného znaku for(i=0;i
v C#: int i=0,n; char [] pokus=new char[40]; char [] ret = new char[40]; char z; do{ ret[i] = (char)Console.ReadKey(true).KeyChar;
2.11.11
Pole v C a C#
14/38
Console.Write('*'); }while((int)ret[i++]!=13); ret[--i]='\0'; // Na konec řetězce přidáme nulový znak Console.WriteLine(); n=ret.Length; for(i=0;ret[i]!='\0';i++) // Vypomlčkování pokus pokus[i]='-'; pokus[i]='\0'; Console.WriteLine(); do { Console.WriteLine(pokus); // vypsání pokus z = (char)Console.ReadKey(true).KeyChar;// čtení hádaného znaku for(i=0;i
Vícerozměrná pole Jazyky C a C# umožňují používat i pole vícerozměrná. Deklarují se obdobně jako jednorozměrná pole: 1.
Práce s dvojrozměrným polem čísel
Hodnoty jednotlivých prvků dvojrozměrného pole matice se počítají jako součin čísla odpovídajícího řádku na sloupce.
v C: int i,j; float matice[3][4]; for (i = 0; i < 3; i++) for (j = 0; j < 4; j++) matice[i][j] = (i+1) * (j+1);// postupné procházení a naplnění pole for (i = 0; i < 3; i++){ for (j = 0; j < 4; j++) printf("%.2f ",matice[i][j]); printf("\n"); }
Tady jsme deklarovali dvourozměrné pole, první rozměr je 3, druhý 4. Je to vlastně matice o třech řádcích a čtyřech sloupcích. Na tuto deklaraci je také možno hledět jako na pole tří polí, z nichž každé má čtyři prvky typu float. 2.11.11
Pole v C a C#
15/38
Výstup programu: 1.00 2.00 2.00 4.00 3.00 6.00 Press any
3.00 4.00 6.00 8.00 9.00 12.00 key to continue
v C#: int i,j; float [,]matice=new float[3,4]; for (i = 0; i < 3; i++) for (j = 0; j < 4; j++) matice[i,j] = (i+1) * (j+1);// postupné procházení a naplnění pole for (i = 0; i < 3; i++){ for (j = 0; j < 4; j++) Console.Write("{0} ",matice[i,j]); Console.WriteLine();
Uložení vícerozměrného pole v paměti Logická představa: 0
1
2
3
Skutečnost: Prvky pole jsou uloženy v paměti lineárně za sebou.
Velikost pole a počet prvků pole Použití operátoru sizeof: int i,j; float matice[3][4]; printf("%d\n",sizeof matice); // vypisuje se velikost v bajtech, tedy // 12 * 4 = 48 //(velikost typu float je 4 byty) printf("%d\n",sizeof matice[0]); // vypisuje se velikost "prvního //řádku", tedy 4 * 4 = 16 printf("%d\n",sizeof matice[i][j]); // vypisuje se velikost jednoho
2.11.11
Pole v C a C#
16/38
// prvku pole
Inicializace dvourozměrného pole v C: Inicializace vícerozměrných polí se provádí obdobně jako jednorozměrných: int pole[2][3] = { {0, 1, 2}, {3, 4, 5} };
v C#: float[,] matice = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
Připomíná "pole polí". Vnější složené závorky jakoby začínají inicializaci pole dvou prvků, tyto jsou ale zase pole. Toto uspořádání kódu nemusíte dodržovat a můžete vše napsat na jednom řádku. Je možné deklarovat pole i více než dvourozměrná - přidáme další pár hranatých závorek s dalším rozměrem.
Časté chyby při práci s poli
Index je mimo rozsah pole Název pole je konstantní adresa, kterou nelze měnit Velikost pole musí být známa při překladu U dvourozměrného pole je třeba uvést počet prvků v sloupci
char a[5]; a[5]=1; // rozsah je od 0 do 4 int a[5]; a=1; // a je konstantní adresa, kterou nelze měnit vel=x*y; char a[vel];
//velikost pole musí být známa při překladu
char a[][]={{1,2},{3,4}}; // není uveden počet prvků v sloupci
2.11.11
Pole v C a C#
17/38
Řešené úlohy na pole 1.
Co se vypíše po provedení programu: int cis1[]={10,5,12,3,15,0},i; int cis2[]={100,54,123,13,125,1}; int cis3[6]; for(i=0;i<6;i++) cis3[i]=cis1[i]+cis2[i]; for(i=0;i<6;i++) printf("%d ",cis3[i]);
Vypíší se součty čísel na odpovídajících si pozicích v polích cis1 a cis2. 2.
Co se vypíše po provedení programu: int cis1[]={10,5,12,3,15,0},i,a=0; for(i=0;i<6;i++) a+=cis1[i]; // a printf("%d ",a);
= a+cis1[i];
//Ukončení cyklu lze zapsat i jinak: for(i=0;cis1[i];i++) a+=cis1[i]; // a = a+cis1[i];
Vypíše se součet čísel v poli cis1. 3.
Co se vypíše po provedení programu: char ret[80]; int i; for(i='A';i<'A'+10;i++) ret[i-'A']=i; ret[i-'A']=0; printf("%s ",ret); // puts(ret);
Vypíše se: ABCDEFGHIJ
4.
Co se vypíše po provedení programu: char ret[80]; int i; gets(ret); for(i=0;ret[i];i++) printf("%c %d\n",ret[i],ret[i]);
2.11.11
Pole v C a C#
18/38
Vypíší se jednotlivé znaky zadaného řetězce a jejich kódy. 5.
Stáří Nováků Vytvořte program, který bude mít v poli Novak roky narození 3 Nováků. Nechť po zadání aktuálního roku program vypíše, kolik je jim let. Zadej aktualni rok: 2010 Stari Novaku: 1. Novak ma 80 let 2. Novak ma 50 let 3. Novak ma 20 let Press any key to continue
v C: int Novak[]={1930,1960,1990}; int i,rok; printf("Zadej aktualni rok: "); scanf("%d",&rok); printf("Stari Novaku:\n"); for(i=0;i<3;i++) printf("%d. Novak ma %d let\n",i+1,rok-Novak[i]);
v C#: int []Novak={1930,1960,1990}; int i,rok; Console.WriteLine("Zadej aktualni rok: "); rok=Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Stari Novaku:\n"); for(i=0;i<3;i++) Console.WriteLine("{0}. Novak ma {1} let", i + 1, rok - Novak[i]); Console.WriteLine();
V C/C# a většině ostatních jazyků indexy začínají od 0. S prvky pole lze pracovat jako s jinými proměnnými: Lze jim přiřazovat hodnoty Lze získávat jejich hodnoty K prvkům pole se přistupuje pomocí indexu v hranatých závorkách. Indexy určují pozici prvku od počátku pole. Je třeba si uvědomit, že index posledního prvku je o 1 menší než horní mez pole, uvedená v definici pole to znamená, jestliže máme deklarované pole int X[3]; na pozici X[3] nemůžeme přistupovat. 2.11.11
Pole v C a C#
19/38
6.
Program pro převod arabských číslic na římské a opačně. Index 0 1 2 3 4 5 6
ARAB 1 5 10 50 100 500 1000
RIM I V X L C D M
Vytvořte program, který vypíše výše uvedenou tabulku arabských a římských číslic.
v C: char rim[]={'I','V','X','L','C','D','M'}; int arab[]={1,5,10,50,100,500,1000}; int i; printf(" Index\tARAB\tRIM\n"); for (i=0;i<7;i++) printf(" %d\t%d\t%c\n",i,arab[i],rim[i]);
v C#: char []rim={'I','V','X','L','C','D','M'}; int []arab={1,5,10,50,100,500,1000}; int i; Console.WriteLine(" Index\tARAB\tRIM"); for (i=0;i<7;i++) Console.WriteLine(" {0}\t{1}\t{2}",i,arab[i],rim[i]);
Vytvořte program, který pro zadanou arabskou číslici vypíše její římský ekvivalent.
v C: char rim[]={'I','V','X','L','C','D','M'}; int arab[]={1,5,10,50,100,500,1000}; int i; int a; printf("Zadej arabske cislo:"); scanf("%d",&a); for (i=0;i<7;i++)if (a==arab[i]) break; if(i>6)printf("\nZadane cislo neni v tabulce\n");
2.11.11
Pole v C a C#
20/38
else printf(" %c\n",rim[i]);
Program by bylo možné zacyklit pro opakované zadávání arabského čísla:
v C: char rim[]={'I','V','X','L','C','D','M'}; int arab[]={1,5,10,50,100,500,1000}; int i; int a; do { printf("Zadej arabske cislo (0 - konec):"); scanf("%d",&a); for (i=0;i<7;i++)if (a==arab[i]) break; if(i>6)printf("\nZadane cislo neni v tabulce\n"); else printf(" %c\n",rim[i]); }while(a!=0);
v C#: char []rim={'I','V','X','L','C','D','M'}; int []arab={1,5,10,50,100,500,1000}; int i,a; do{ Console.WriteLine("Zadej arabske cislo (0 - konec):"); a=Convert.ToInt32(Console.ReadLine()); for (i = 0; i < 7; i++) if (a == arab[i]) break; if (i > 6) Console.WriteLine("\nZadane cislo neni v tabulce"); else Console.WriteLine("{0}", rim[i]); }while (a != 0);
Vytvořte program, který pro zadanou římskou číslici vypíše její arabský ekvivalent.
v C: const char rim[]={'I','V','X','L','C','D','M'}; const int arab[]={1,5,10,50,100,500,1000}; int i; char c; printf("Zadej rimskou cislici:"); scanf("%c",&c); for (i=0;i<7;i++)if (c==rim[i]) break; if(i>6)printf("\nZadane cislo neni v tabulce\n");
2.11.11
Pole v C a C#
21/38
else printf(" %d\n",arab[i]);
Zacyklení programu pro opakované zadávání římských číslic:
v C: const char rim[]={'I','V','X','L','C','D','M'}; const int arab[]={1,5,10,50,100,500,1000}; int i; char c; do { printf("Zadej rimskou cislici (k - konec): "); scanf("%c",&c); fflush(stdin); for (i=0;i<7;i++)if (c==rim[i]) break; if(i>6)printf("\nZadane cislo neni v tabulce\n"); else printf(" %d\n",arab[i]); }while(c!='k');
v C#: char []rim={'I','V','X','L','C','D','M'}; int []arab={1,5,10,50,100,500,1000}; int i; char c; do{ Console.WriteLine("Zadej rimskou cislici (k - konec): "); c = Convert.ToChar(Console.ReadLine()); for (i = 0; i < 7; i++) if (c == rim[i]) break; if (i > 6) Console.WriteLine("\nZadane cislo neni v tabulce\n"); else Console.WriteLine("{0}", arab[i]); }while (c != 'k');
7.
Nalezení maxima v poli. Hodnoty prvků pole jsou zadané v definici pole. V cyklu for jsou jednotlivé prvky pole porovnávány s dosud nalezenou maximální hodnotou. Pokud aktuální prvek pole je větší, než dosud nalezené maximum, je uložen jako nové maximum. Řídící proměnná cyklu je současně indexem pole. Za cyklem se vypíše nalezená maximální hodnota.
2.11.11
Pole v C a C#
22/38
v C: int cisla[]={123,98,45,65,45,12,789,89,87,102}; int i,max; max=cisla[0]; for(i=1;i<sizeof(cisla)/sizeof(int);i++) if(cisla[i]>max)max=cisla[i]; printf("%d\n",max);
v C#: int []cisla={123,98,45,65,45,12,789,89,87,102}; int i,max; max=cisla[0]; for(i=1;imax)max=cisla[i]; Console.WriteLine("{0}", max);
8.
Hádání zadaných čísel
v C: int n1,n2,i; char str1[20],str2[20]; puts("Zadej prvni tajne cislo: "); i=0; do{ str1[i]=getch(); i++; }while((int)str1[i-1]!=13); str1[i-1]=0;
//'\0' nebo NULL
puts("Zadej druhe tajne cislo: "); i=0; do{ str2[i]=getch(); i++; }while((int)str2[i-1]!=13); str2[i-1]=0;
//'\0' nebo NULL
n1 = atoi(str1); n2 = atoi(str2); printf("soucet je: %d\n", n1+n2); printf("rozdil je: %d\n", n1-n2);
2.11.11
Pole v C a C#
23/38
Komunikace s programem: Zadej prvni tajne cislo: Zadej druhe tajne cislo: soucet je: 579 rozdil je: -333 Press any key to continue
v C#: int n1,n2,i; char []str1 = new char[20]; char []str2 = new char[20]; Console.WriteLine("Zadej prvni tajne cislo: "); i=0; do{ str1[i] = (char)Console.ReadKey(true).KeyChar; i++; }while((int)str1[i-1]!=13); str1[i-1]='\0';
//'\0' nebo NULL
Console.WriteLine("Zadej druhe tajne cislo: "); i=0; do{ str2[i] = (char)Console.ReadKey(true).KeyChar; i++; }while((int)str2[i-1]!=13); str2[i - 1] = '\0';
//'\0' nebo NULL
n1 = Convert.ToInt32(new string(str1)); n2 = Convert.ToInt32(new string(str2)); Console.WriteLine("soucet je: {0}", n1 + n2); Console.WriteLine("rozdil je: {0}", n1 - n2);
9.
Formátový zápis do řetězce
v C: sprintf(retezec,"formatove specifikace",seznam prom. nebo konst.);
Proměnné a konstanty v seznamu se podle formátových specifikací zapíší do řetězce. //sprintf - zápis do řetězce char ret[80]; const float PI=3.1415926535897932384626433832795; sprintf(ret, "Priblizna hodnota Pi je %f\n", PI); puts(ret);
2.11.11
Pole v C a C#
24/38
v C#: const double PI=Math.PI; string ret = "Priblizna hodnota Pi je: " + PI.ToString("F2"); Console.WriteLine(ret);
10. Formátové čtení z řetězce
v C: sscanf(retezec,"formatove specifikace",seznam adres prom.);
Řetězec se rozloží do proměnných podle formátových specifikací. // Čtení z řetězce // Funkce atof funguje stejnì char ret[80]; const float PI=3.1415926535897932384626433832795; float pi; sprintf(ret, "%f", PI); puts("Vypis retezce ret:"); puts(ret); // Z retezce je precteno cislo do promenne pi sscanf(ret,"%f",&pi); puts("Vypis racionalni promenne pi:"); printf("%f\n",pi); // Prevod retezce na racionalni cislo pomoci funkce atof pi=atof(ret); puts("Vypis cisla, prevedeneho funkci atof:"); printf("%f\n",pi);
Výpis na obrazovku: Vypis retezce ret: 3.141593 Vypis racionalni promenne pi: 3.141593 Vypis cisla, prevedeneho funkci atof: 3.141593
v C#: string ret; const double PI=3.1415926535897932384626433832795; float pi; ret= PI.ToString(); Console.WriteLine("Vypis retezce ret:"); Console.WriteLine(ret); pi = (float)Convert.ToDouble(ret); ret= pi.ToString();
2.11.11
Pole v C a C#
25/38
Console.WriteLine(ret);
11. Čítač dolů Realizujte na obrazovce čítač směrem dolů. Při nulové hodnotě počítání končí a začne pro další hodnotu z pole typu int.
v C: int od[]={10,5,12,3,15,0},i=0,j; while(od[i]){ for(j=od[i];j>-1;j--){ system("cls"); printf("%d",j); Sleep(200); } i++;
v C#: using System; using System.Threading; class Program{ static void Main(){ int []od={10,5,12,3,15,0}; int i=0,j; while (od[i]!=0) { for (j = od[i]; j > -1; j--) { Console.Clear(); Console.Write(j); Thread.Sleep(200); } i++; Console.ReadLine(); } } }
2.11.11
Pole v C a C#
26/38
12. Kódovací a dekódovací program Napište program, který představuje jednoduché kódovací zařízení. Převádí napsané znaky z pole znaků do kódovaného tvaru tak, že ke každému písmenu přičte 1. To znamená, že z ´A´ se stane ´B´ atd. Zakódovaný řetězec vypište.
v C: char text[80]; int i,k; do{ gets(text); for(i=0;i<strlen(text);i++) text[i]=text[i]+1; puts(text); }while((k=getch())!=27);
v C#: char []text=new char[80]; string ret; int i; do{ ret=Console.ReadLine(); for(i=0;i
13. Dekódovací program Napište program, který bude dekódovat znaky, zakódované předchozím způsobem!
v C: char text[]="Pufd!Tzo!Evdi!Twbuz"; int i,k; for(i=0;i<strlen(text);i++) text[i]=text[i]-1; puts(text);
v C#: char []text=new char[80]; string ret="Pufd!Tzo!Evdi!Twbuz";;
2.11.11
Pole v C a C#
27/38
int i; for(i=0;i
14. Test, zda zadané číslo je prvočíslo Napište program, který zjistí, zda zadané přirozené čísla v poli celých čísel jsou prvočísla. Pole celých čísel je ukončeno 0.
v C: int X[]={4,5,39,13,40,1,33,11,41,40,7,4,8,5,49,51,0},i=0,j; while(X[i]){ for(j=2;j<X[i];j++) if(!(X[i]%j))break; if(j>(X[i]-1))printf("Cislo %d je prvocislo\n",X[i]); else printf("Cislo %d neni prvocislo\n",X[i]); i++; getch(); }
v C#: int []X={4,5,39,13,40,1,33,11,41,40,7,4,8,5,49,51,0}; int i=0,j; while(X[i]!=0){ for(j=2;j<X[i];j++) if((X[i]%j)==0)break; if (j > (X[i] - 1)) Console.WriteLine("Číslo {0} je prvočíslo", X[i]); else Console.WriteLine("Číslo {0} není prvočíslo", X[i]); i++; }
2.11.11
Pole v C a C#
28/38
15. Odstranění znaků z řetězce Vytvořte program, který zajistí přesun znaků v řetězci dle obrázku:
od
od+pocet
Programu se zadá řetězec (s), počáteční pozice odstraňované podmnožiny znaků (od) a počet odstraňovaných znaků (pocet).
v C: char s[80]; int od, pocet,i,delka; puts("Zadej retezec: "); gets(s);delka=strlen(s); puts("Zadej pozici a pocet mazanych znaku: "); scanf("%d %d",&od,&pocet);od--; for(i=0;i<delka;i++) s[od+i]=s[od+pocet+i]; s[od+i+1]='\0'; puts(s);
v C#: char []s=new char[80]; int od, pocet,i,delka; Console.Write("Zadej retezec: "); s=Console.ReadLine().ToCharArray(); delka=s.Length; Console.WriteLine("Zadej pocatecni pozici mazanych znaku: "); od = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Zadej pocet mazanych znaku: "); pocet = Convert.ToInt32(Console.ReadLine()); for(i=od;i<delka-pocet;i++) s[i]=s[pocet+i]; for(int j=i;j<delka;j++)s[j]='\0'; Console.WriteLine(s);
2.11.11
Pole v C a C#
29/38
16. Výpočet hodnot do pole Definujte 2 pole typu float. První pole inicializujte a do druhého vypočtěte druhé mocniny odpovídajících prvků prvního pole. float cis1[]={10,5,12,3,15,0}; float cis2[6]; int i; for(i=0;i<6;i++) // cyklus pro výpočet cis2[i]=cis1[i]*cis1[i]; for(i=0;i<6;i++) // cyklus pro výpis printf("%.2f ",cis2[i]);
17. Zápis průměru odpovídajících si prvků dvou polí do třetího pole Definujte a inicializujte 2 celočíselná pole, do kterých zadáte známky dvou studentů z 10 předmětů. Deklarujte 1 pole racionálních čísel, do kterého zapíšete průměry známek z jednotlivých předmětů! int cis1[]={1,5,2,3,1,4,2,3,3,4}; int cis2[]={2,4,3,2,3,3,1,2,4,3}; float prum[10]; int i; for(i=0;i<10;i++) // cyklus pro výpočet prum[i]=(cis1[i]+cis2[i])/2.; for(i=0;i<10;i++) // cyklus pro výpis printf("%.2f ",prum[i]);
18. Výpis prvků pole osmičkově, desítkově a šestnáctkově Definujte a inicializujte pole, obsahující 10 celých čísel. Vypište je osmičkově, desítkově a šestnáctkově! int cis1[]={10,15,20,30,11,44,22,35,38,421}; int i; for(i=0;i<10;i++) printf("%o %d %x\n",cis1[i],cis1[i],cis1[i]);
19. Minimum a maximum v poli Definujte a inicializujte pole racionálních čísel a napište program, který stanoví maximální a minimální hodnotu tohoto pole a vypíše je! float cis1[]={11,44,22,35,38,421,10.1,15.2,20.5,30.5}; int i; float max,min;
2.11.11
Pole v C a C#
30/38
max=min=cis1[0]; for(i=1;i<10;i++){ if(cis1[i]>max)max=cis1[i]; if(cis1[i]<min)min=cis1[i]; } printf("%.2f %.2f\n",min,max);
20. Výpis obrazce v dvourozměrném poli const int S=14; char obraz[][S]={ {" * {" *** {" ***** {" ******* {" ********* {" ***********
"}, "}, "}, "}, "}, "}};
int i; for(i=0;i<sizeof(obraz)/S;i++) printf("%s\n",obraz[i]); }
21. Kreslení V pomocí 2 jednorozměrných polí int i,j; int prvni[]={0,1,2,3,4,5,6,7,8,9,10,11,12}; int druhe[]={24,22,20,18,16,14,12,10,8,6,4,2,0}; for(i=0;i<sizeof(prvni)/sizeof(int);i++){ for
(j=0;j<prvni[i];j++) printf(" ");
printf("*"); for
(j=0;j
printf("*\n"); }
22. Výpis dvourozměrného pole znaků int i; char text[][20]={"Josef Novak","Petr Novotny","Marek Svoboda"}; for (i=0;i<3;i++) puts(text[i]);
23. Výpis přísloví const int N=4;
2.11.11
Pole v C a C#
31/38
int i; char prislovi[][80]={"Kdo druhemu jamu kope, sam do ni padne.", "Jak se do hory vola, tak se z hory ozyva.", "Do te doby se chodi se dzbanem pro vodu, dokud se nerozbije.", "Pycha predchazi pad, domyslivost klopytnuti."}; for (i=0;i
24. Animovaný výpis #include <stdio.h> #include #include <stdlib.h> #include <windows.h> int main(){ const int N=3; int i; char obrazec1[][80]={ "*", " *", "
*"
}; char obrazec2[][80]={ "
*",
" *", "*" }; while(!kbhit()){ system("cls"); for (i=0;i
25. Mrkací domeček #include <stdio.h> #include
2.11.11
Pole v C a C#
32/38
#include <stdlib.h> #include <windows.h> int main(){ const int N=22; int i; char obrazec1[][80]={" *", " * *", " * *", " * *", " * *", " * *", " * *", " * *", " * Mrkaci domecek*", " * *", " * *", " ***********************", " * *", " * *", " * **** **** *", " * **** * * *", " * **** **** *", " * ***** *", " * * * *", " * * * *", " * * * *", " *********************", }; char obrazec2[][80]={" " * *", " * *", " * *", " * *", " * *", " * *", " * *", " * Mrkaci domecek*", " * *", " * *", " ***********************", " * *", " * *", " * **** **** *", " * * * **** *", " * **** **** *", " * ***** *", " * * * *", " * * * *", " * * * *", " *********************", };
*",
while(!kbhit()){ system("cls"); for (i=0;i
2.11.11
Pole v C a C#
33/38
Sleep(100); system("cls"); for (i=0;i
26. Výpis obrazce v dvourozměrném poli #include <stdio.h> int main(){ const int S=14; char obraz[][S]={ {" * "}, {" *** "}, {" ***** "}, {" ******* "}, {" ********* "}, {" *********** "}}; int i; for(i=0;i<sizeof(obraz)/S;i++) printf("%s\n",obraz[i]); return 0; }
27. Animace trojúhelníků #include <stdio.h> #include #include <stdlib.h> #include <windows.h> int main(){ const int N=5; int i; char obrazec1[][80]={ " *", " ***", " *****", " *******", " *********", }; char obrazec2[][80]={ " *", " ***", " *****", " ***", " *", }; char obrazec3[][80]={ " *********", " *******", " *****", " ***", " *",
2.11.11
Pole v C a C#
34/38
}; char obrazec4[][80]={ " *", " ***", " *****", " ***", " *", }; while(!kbhit()){ system("cls"); for (i=0;i
28. Animace C++ #include <stdio.h> #include #include <stdlib.h> #include <windows.h> int main(){ const int N=14; int i; char obrazec1[][80]={ " ", " ", " ", " +++", " +++++", " ++ ++", " ++ ++", " ++ + +", " ++ ++++++", " ++ + +", " ++ ++", " ++ ++", " +++++", " +++", };
2.11.11
Pole v C a C#
35/38
char obrazec2[][80]={ " ", " ", " ", " +++", " +++++", " ++ ++", " ++ ++", " + + ++ ", "++++++ ++ ", " + + ++ ", " ++ ++", " ++ ++", " +++++", " +++", }; while(!kbhit()){ system("cls"); for (i=0;i
29. Křížovka PRG #include <stdio.h> #include <string.h> #include int main(){ char tajenka[]="Jeden z predmetu na skole je..."; char odp[20]; char texty[][40]={"Nejlepsi pritel cloveka", "Co programujeme","Jeden z umeleckych slohu"}; char spravne[][11]={" pes "," program ", " gotika "}; char uhod[][11]={"---|xx----","--x|xxxxx-", "---|xxxxx-"}; char odpovedi[][11]={"pes","program", "gotika"}; int i,j; printf("%s\n\n",tajenka); for(i=0;i<3;i++)printf("%s\n",uhod[i]); for(i=0;i<3;i++){ printf("\n%s\n",texty[i]); gets(odp); if(!strcmp(odp,odpovedi[i]))strcpy(uhod[i],spravne[i]); for(j=0;j<3;j++)printf("%s\n",uhod[j]);
2.11.11
Pole v C a C#
36/38
} getch(); return 0; }
30. Třídění čísel v poli Na obrázku je znázorněna metoda bublinkového třídění. Jednotlivá čísla se porovnávají se všemi čísly napravo. Pokud se najde menší číslo, dojde k jejich prohození. V důsledku tohoto postupu se nejmenší čísla dostanou na pozici nejvíc vlevo.
const int N=6; int i,j,pom,a[]={3,2,5,7,2,8}; for(i=0;ia[j]){ pom=a[j]; a[j]=a[i]; a[i]=pom; } } for(i=0;i
2.11.11
Pole v C a C#
37/38
Shrnutí: V kapitole je vysvětlen pojem pole v programování, ilustrovaný řadou příkladů v jazycích C a C#. Je také ukázána práce s řetězci jako polem znaků (v jazyku C# existuje typ string). Pro jazyk C# je vysvětleno použití cyklu foreach na prvky pole. Na závěr je ukázána práce s vícerozměrnými poli a jsou uvedeny časté chyby při práci s poli.
2.11.11
Pole v C a C#
38/38