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)
{
int i;
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)
{
int i;
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
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.