Obsah lekce:
Pole si můžeme představit jako proměnnou, která nám umožní uložit posloupnost hodnot (nikoli jen jednu).
Jde o datovou strukturu, která nám umožní uložit posloupnost hodnot. Prázdné pole bychom si mohli představit například takto:
Jak vidíme, tak pole je prázdné (přihrádky nic neobsahují). Před použitím pole je proto nutné nastavit výchozí hodnoty pole. Kdybychom v opačném případě k jednotlivým prvkům pole například přičítali hodnotu, program by skončil chybou. Proto je vhodné nastavit všechny prvky pole na výchozí hodnotu, například 0. Potom bude pole vypadat takto:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Takovou datovou strukturu bychom mohli například naplnit čísly:
5 | 8 | 7889 | 1 | 29 | 9 | 126 | 6656 | 778 | 2 |
Jedná se vlastně o strukturu, která obsahuje nějaký počet míst pro uložení hodnot. Dobrou analogií je například
Předchozí pole v programu figuruje jako jedna jediná proměnná, která obsahuje 10 čísel. Jak pole naplnit a používat?
Použijme naši analogii se čtverečkovaným papírem. Uvažujme, že máme k dispozici vystřižený řádek čtverečkovaného papíru o deseti čtverečcích. Chceme po někom (po programu), aby do správných čtverečků na papíře napsal správná čísla (naplnil pole hodnotami). Řekneme tedy třeba něco jako:
Vidíme, že každé políčko má své pořadové číslo. Takovému číslu budeme říkat index. Jak je patrné z výše uvedeného příkladu, je tento index číslován od 0. První políčko má tedy číslo 0. Pomocí indexu a daného pole lze jednoznačně říci, o který prvek se jedná. Situaci ilustruje následující obrázek, kde například na pozici 5 je v poli prvek 29.
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
hodnota | 5 | 8 | 7889 | 1 | 29 | 9 | 126 | 6656 | 778 | 2 |
Pokud budeme chtít ve svém programu používat pole, je nutné jej nejprve nadefinovat. Při definici pole postupujeme podobně jako u běžné proměnné s tím rozdílem, že za názvem proměnné uvedeme v hranatých závorkách počet prvků pole. Definice pole celočíselných hodnot o 10 prvcích je tedy následující:
int p[10];
Chceme-li vložit do pole p na některou pozici i (index) nějakou hodnotu, pak to provedeme následujícím způsobem:
p[i] = hodnota;
Předchozí zápis říká, že na i-tou pozici v poli p vložíme hodnotu. Příklad vložení hodnoty 5 do pole na pozici 0 (číslovanou od 0, tj. 1. prvek pole).
int p[10];
p[0] = 5;
Pokud bychom chtěli naplnit celé pole zadanými hodnotami, tak bychom museli každé pozici v poli přiřadit požadovanou hodnotu.
int p[10];
p[0]=5;
p[1]=8;
p[2]=7889;
p[3]=1;
p[4]=29;
p[5]=9;
p[6]=126;
p[7]=6656;
p[8]=778;
p[9]=2;
Jaké jsou nevýhody předcházejícího postupu? Nedovoluje zadat hodnoty uživateli, ale jen programátorovi. Pokud chceme, aby si hodnoty zadal uživatel sám, pak můžeme přepsat program takto:
int p[10];
scanf("%d", &p[0]);
scanf("%d", &p[1]);
scanf("%d", &p[2]);
scanf("%d", &p[3]);
scanf("%d", &p[4]);
scanf("%d", &p[5]);
scanf("%d", &p[6]);
scanf("%d", &p[7]);
scanf("%d", &p[8]);
scanf("%d", &p[9]);
Tento postup má nevýhodu v tom, že uživatel nemůže zadat libovolné množství hodnot. A představme si situaci, jak by program vypadal, kdybychom chtěli zadat například 100 hodnot... Druhý problém vyřešíme elegantně pomocí cyklu FOR.
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int i;
int p[10];
for (i = 0; i < 10; i++)
{
scanf("%d", &p[i]);
}
for (i = 0; i < 10; i++)
{
printf("%d\n", p[i]);
}
fflush(stdin);
getchar();
return 0;
}
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int i, pocet;
int p[5000];
printf("Zadejte pocet vkladanych prvku: ");
scanf("%d", &pocet);
while (pocet < 1 || pocet > 5000)
{
printf("Zadej znovu: ");
scanf("%d", &pocet);
}
for (i = 0; i < pocet; i++)
{
scanf("%d", &p[i]);
}
for (i = 0; i < pocet; i++)
{
printf("%d", p[i]);
}
fflush(stdin);
getchar();
return 0;
}
#include "stdafx.h"
#define N 5000
int _tmain(int argc, _TCHAR* argv[])
{
int i, pocet;
int p[N];
printf("Zadejte pocet vkladanych prvku (1 - %d): ", N);
scanf("%d", &pocet);
while (pocet < 1 || pocet > N)
{
printf("Zadej znovu: ");
scanf("%d", &pocet);
}
for (i = 0; i < pocet; i++)
{
scanf("%d", &p[i]);
}
for (i = 0; i < pocet; i++)
{
printf("%d", p[i]);
}
fflush(stdin);
getchar();
return 0;
}
Napište program pro zadání výplat zaměstnanců firmy. Program by měl načítat zadané platy od uživatele tak dlouho, dokud uživatel nezadá číslo 0 (to bude znamenat konec zadávání). Po zadání poslední výplaty program uživateli vypíše zadané výplaty, jejich počet.
#include "stdafx.h"
#define N 1000
int _tmain(int argc, _TCHAR* argv[])
{
int i, pocet, vyplata;
int p[N];
printf("Zadejte pocet vkladanych prvku (1 - %d): ", N);
scanf("%d", &pocet);
while (pocet < 1 || pocet > N)
{
printf("Zadej znovu: ");
scanf("%d", &pocet);
}
for (i = 0; i < pocet; i++)
{
scanf("%d", &p[i]);
}
printf("Zadejte vyplaty (0 konci zadavani):\n");
vyplata=1;
i=1;
while (vyplata!=0)
{
scanf("%d",&vyplata);
p[i-1] = vyplata;
i = i + 1;
}
pocet=i-2;
printf("Zadane vyplaty:\n");
for (i = 0; i < pocet; i++)
{
printf("%d\n", p[i]);
}
printf("Pocet zadanych vyplat je %d\n",pocet);
fflush(stdin);
getchar();
return 0;
}
Předchozí program není napsán zcela správně. Zkuste jeho chyby odhalit a vyřešit.
Napište program pro zadání výplat zaměstnanců (max. 100). Program následně všechny zadané výplaty vypíše, spočítá aritmetický průměr platů a vypíše největší a nejnižší výplatu. Program také vypíše celkovou sumu peněz, která je potřebná k proplacení výplat. Výpis zadaných výplat upravte tak, aby byly vypsané platy odděleny čárkou a mezerou (pozor na poslední výplatu - za ní by měla ve výpisu následovat tečka).