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;
}