Struktury a funkce

Struktura může být parametrem funkce. Místo tří parametrů pro název, cenu a počet dostane funkce jeden produkt:

#include <stdio.h>

typedef struct {
    char nazev[20];
    double cena;
    int pocet;
} Produkt;

double cena_polozky(Produkt polozka) {
    return polozka.cena * polozka.pocet;
}

int main(void) {
    Produkt mleko = {"Mléko", 24.9, 3};
    printf("%s: %.2f\n", mleko.nazev, cena_polozky(mleko));
    return 0;
}

Program vypíše:

Mléko: 74.70

Definice struktury Produkt musí být nad funkcí, protože funkce tento datový typ používá. Proto se struktury obvykle definují úplně nahoře v programu, hned pod #include.

Když zavoláte cena_polozky(mleko), dostane parametr polozka kopii celé struktury: všech jejích členů včetně textu v nazev. Je to stejné jako u parametru typu int a jiné než u pole, které funkce dostane bez kopírování. Když tedy funkce svůj parametr změní, změní jen kopii:

#include <stdio.h>

typedef struct {
    char nazev[20];
    double cena;
    int pocet;
} Produkt;

void prodej_kus(Produkt polozka) {
    polozka.pocet--;
    printf("Ve funkci: %d\n", polozka.pocet);
}

int main(void) {
    Produkt mleko = {"Mléko", 24.9, 3};
    prodej_kus(mleko);
    printf("V main: %d\n", mleko.pocet);
    return 0;
}

Program vypíše:

Ve funkci: 2
V main: 3

Funkce prodala jedno mléko, ale jen ze své kopie: mleko v main má pořád 3 kusy. V dalším cvičení uvidíte, jak může funkce změnit originál. Funkcím, které strukturu jen čtou, jako cena_polozky, kopie nevadí.

Struktura se zkopíruje i při přiřazení pomocí =. Po Produkt kopie = mleko; má proměnná kopie vlastní název, cenu i počet a změna kopie.pocet proměnnou mleko nezmění. Zkopíruje se i pole nazev, přestože samotné pole přiřadit nejde. Porovnat dvě struktury pomocí == ale nejde: mleko == kopie skončí chybou invalid operands to binary expression ('Produkt' and 'Produkt') (neplatné operandy). Porovnejte místo toho členy, které potřebujete, například mleko.cena == kopie.cena, a názvy pomocí strcmp.

Pokyny

Místo komentáře napište funkci double plocha(Mistnost mistnost), která vrátí plochu místnosti: její šířku krát délku.

V cyklu vypište u každé místnosti vedle jejího názvu plochu na dvě desetinná místa. Plochu získejte ze své funkce plocha. Program vypíše Kuchyň: 13.50 m2, Ložnice: 14.00 m2 a Chodba: 9.00 m2.

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

6/9