Pole jako parametr funkce
Pokud použijeme pole jako parametr funkce, funguje vždy jako vstupně-výstupní parametr. To znamená, že hodnoty uložené v poli do funkce vstupují a zároveň, pokud se ve funkci změní, z funkce vystupují. Není potřebné je předávat z funkce přes návratovou hodnotu.
Vysvětlení: název pole je zároveň adresou pole. Po předání pole do funkce, pracuje funkce přímo na té adrese v paměti, kde jsou uložena data z pole.
1. Funkce pro výpis hodnot z pole
Budeme pracovat s polem reálných čísel. Funkce vypíše všechna čísla uložená v poli.
Vstupy do funkce: hodnoty pole (musíme vědět, jaké pole použijeme) a aktuální počet hodnot v poli (jinak bychom nevěděli, kolik je hodnot).
Výstupy z funkce (t.j. co se změnilo): funkce jenom hodnoty vypíše, nic se nemění. Funkce nemá žádný výstup, použijeme funkci typu void.
void vypis_pole(float pole[], int n) { if( n == 0 ) { printf("Nejsou zapsana zadna cisla\n"); return; } printf("\nV poli jsou zapsany hodnoty : \n"); for( i = 0; i < n; i++ ) { printf("%.2f, ", pole[i]); } printf("\n\n"); }
2. Funkce pro přidání hodnoty do pole
Budeme pracovat s polem reálných čísel. Funkce přidá do pole jedno číslo, které umístíme na konec pole (za všechny předchozí hodnoty). Hodnotu čísla načteme z klávesnice.
Vstupy do funkce: hodnoty pole (musíme vědět, do jakého pole přidáváme) a aktuální počet hodnot v poli (jinak bychom nevěděli, na kterou pozici přidáváme).
Výstupy z funkce (t.j. co se změnilo): hodnoty pole (přibylo jedno číslo) a aktuální počet hodnot.
Máme tedy 2 vstupní a 2 výstupní proměnné. Pokud tedy pole uvedeme jako parametr funkce, bude vstupem a zároveň výstupem. To samé ale potřebujeme i pro počet hodnot, který do funkce vstupuje a potřebuje ho taky vrátit z funkce, protože se změní. Aktuální počet hodnot bude určitě druhým parametrem funkce. Jeho výstup lze vyřešit 2 způsoby: vrátit změněný počet přes návratovou hodnotu funkce nebo použít pro počet ukazatel. Druhý způsob je přehlednější, ale možný až při znalosti práce s ukazateli.
//první varianta int pridej_do_pole1(float pole[], int n) { float cislo; if( n == MAX ) //testování na maximální rozsah pole { printf("Nelze dale vkladat cisla, prekrocen povoleny rozsah\n"); return -1; } printf("\nZadej cislo: "); scanf("%f", &cislo); pole[n] = cislo; n++; return n; }
//druhá varianta - nutná znalost práce s ukazatelem void pridej_do_pole2(float pole[], int *n) { int i; float cislo; if( *n == MAX ) //testování na maximální rozsah pole { printf("Nelze dale vkladat cisla, prekrocen povoleny rozsah\n"); return ; } printf("\nZadej cislo: "); scanf("%f", &cislo); pole[*n] = cislo; (*n)++; }
Použití funkcí ve funkci main():
int main() { int pocet = 0; float cisla[MAX]; ... //chci přidat jedno číslo do pole cisla pocet = pridej_do_pole1(cisla, pocet); // pridej_do_pole2(cisla, &pocet); ... //chci vypsat všechny hodnoty z pole cisla vypis_pole(cisla, pocet); ... }
Poznámka: pokud chceme použít jako parametr funkce vícerozměrné pole, nemůžeme v hlavičce funkce nechat u názvu pole jenom prázdné závorky, je třeba v nich uvést maximální rozměr pole.