6. cvičení

Ukázali jsme si, jak pomocí pole reprezentovat vektory a jak provádět různé matematické operace (sčítání, odčítání, skalární součin atd).

Kromě procvičení programování a algoritmizace je na příkladu níže také to, že nemůžeme vracet vektor jako návratovou hodnotu funkce. Návratový typ by totiž musel být double*, čili ukazatel na adresu 0. prvku pole v paměti počítače. Jenže pole vytvořená v nějaké funkci jsou lokální proměnné, které přestanou existovat, jakmile daná funkce skončí. Ve vnější funkci bychom pak pracovali s neplatnou adresou (paměť použitá pro pole se mezitím mohla přepsat jinými hodnotami) a program by nefungoval správně. Místo toho ve funkcích používáme tzv. výstupní parametry, kterými funkci řekneme, kam má zapsat výsledek.

#include <iostream>

using namespace std;

void vypis_vektor(double* v, int n)
{
    for (int i = 0; i < n; i++) {
        cout << v[i] << " ";
    }
    cout << endl;
}

void secti_vektory(int n, double* v1, double* v2, double* v3)
{
    for (int i = 0; i < n; i++) {
        v3[i] = v1[i] + v2[i];
    }
}

void odecti_vektory(int n, double* v1, double* v2, double* v3)
{
    for (int i = 0; i < n; i++) {
        v3[i] = v1[i] - v2[i];
    }
}

double skalarni_soucin(int n, double* v1, double* v2)
{
    // nerekurzivni zpusob:
    double soucin = 0;
    for (int i = 0; i < n; i++) {
        soucin += v1[i] * v2[i];
    }
    return soucin;
}

int main()
{
    int n = 4;

    double vektor1[n];  // vstupni
    double vektor2[n];  // vstupni
    double vektor3[n];  // vystupni

    // inicializace
    for (int i = 0; i < n; i++) {
        vektor1[i] = 0;
        vektor2[i] = 0;
    }

    // nacteni prvku od uzivatele
    cout << "Zadej hodnoty pro vektor1:" << endl;
    for (int i = 0; i < n; i++) {
        cin >> vektor1[i];
    }
    cout << "Zadej hodnoty pro vektor2:" << endl;
    for (int i = 0; i < n; i++) {
        cin >> vektor2[i];
    }


    cout << "Vyber operaci: +, -, ." << endl;
    char operace;
    cin >> operace;

    if (operace == '+') {
        secti_vektory(n, vektor1, vektor2, vektor3);
        cout << "soucet je:" << endl;
        vypis_vektor(vektor3, n);
    }
    else if (operace == '-') {
        odecti_vektory(n, vektor1, vektor2, vektor3);
        cout << "rozdil je:" << endl;
        vypis_vektor(vektor3, n);
    }
    else if (operace == '.') {
        cout << "skalarni soucin je "
             << skalarni_soucin(n, vektor1, vektor2) << endl;
    }
    else {
        cout << "neznama operace: " << operace << endl;
    }

    return 0;
}