Anglická verze
logolink

< Zpět na seznam lekcí

Pole

AlgoritmyObsah lekce:

  • Charakteristika datového typu pole
  • Definice datového typu pole
  • Naplnění a výpis pole
  • Zadání libovolného počtu prvků pole
  • Program výplaty

Charakteristika datového typu pole

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

  • řádek čtverečkovaného papíru, kde v každém políčku může být napsáno nějaké celé číslo (pole s prvky typu integer)
  • řada šuplíků, kde v každém může být napsán na papíře nějaký text (pole s prvky typu string)

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:

  • Do prvního políčka (políčko s indexem 0) napiš číslo 5.
  • Do druhého políčka (políčko s indexem 1) napiš číslo 8.
  • Do třetího políčka (políčko s indexem 2) napiš číslo 7889.
  • ...
  • Do desátého políčka (políčko s indexem 9) napiš číslo 2.

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

Definice datového typu pole

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í:

Definice pole celých čísel o 10 prvcích
  int p[10];

Naplnění a výpis pole

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:

Vložení hodnoty do pole
 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).

Vložení hodnoty do 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.

Vložení hodnot do pole
 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:

Vložení hodnot do pole
 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.

Naplnění a výpis pole
#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;
}

Naplnění a výpis pole se zadáním počtu vkládaných prvků s kontrolou

Naplnění a výpis pole se zadáním počtu vkládaných prvků
#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;
}

Naplnění a výpis pole se zadáním počtu vkládaných prvků s kontrolou a konstantou

Naplnění a výpis pole se zadáním počtu vkládaných prvků
#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;
}

Program výplaty

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.

Program výplaty
#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.

Program výplaty verze 2

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).

Další čtení

Odkazy

Otázky

  1. Co rozumíte v jazyce C pod pojmem pole?
  2. Pokuste se ilustrovat, jak datová struktura pole vypadá?
  3. Jak se deklaruje datový typ pole?
  4. Jaké jsou výhody datového typu pole?
  5. Napište kód, který naplní pole o n n prvcích hodnotami od uživatele.
webdesign, xhtml, css, php - Mgr. Michal Mikláš