#include <iostream>
#include <string>
using namespace std;

// globalni datove typy:
    enum TZnacka { samsung, apple, xiaomi, nokia };
    struct TMobil {
        TZnacka znacka;
        unsigned int cena;
        string id;
    };

// funkce pro vystup, parametr je volany hodnotou (jen ho predam funkci)
void output (TMobil m) {
        switch(m.znacka) {
            case samsung: cout << "Samsung\t"; break;
            case apple:   cout << "Apple\t"; break;
            case xiaomi:  cout << "Xiaomi\t"; break;
            case nokia:   cout << "Nokia\t"; break;
            default: cout << "Noname\t";
        }
        cout << m.cena << '\t' << m.id << endl;
}

// funkce pro vstup od uzivatele, parametr je volany odkazem s vyuzitim reference (od funkce si vyzvedavam vysledek)
void input(TMobil &m) {
    int i;
    cout << "Znacka (0=samsung, 1=apple, 2=xiaomi, 3=nokia): ";
    cin >> i;
    m.znacka = (TZnacka)i;
    cout << "Cena: ";
    cin >> m.cena;
    cout << "ID:   ";
    cin >> m.id;
}

int main()
{
    TMobil *produkty, *produkt;
    unsigned int delka;
    
    cout << "Pocet produktu? ";
    cin >> delka;
    
    if (delka<=0) {
        cout << "Pocet musi byt vetsi nez 0!";
        return 1;
    }
    
    produkt = new TMobil;   // nepouzivam, je tu jen pro demonstraci prikazu "new"
    produkty = new TMobil [delka];
    
    produkty[0].znacka = samsung;
    produkty[0].cena = 20000;
    produkty[0].id = "qwert789";
    
    for (TMobil *p = &produkty[1]; p<=&produkty[delka-1]; p++) 
        input(*p);
    
    cout << endl;
    for (TMobil *p = produkty; p<=&produkty[delka-1]; p++) 
        output(*p);
    
    
    delete produkt;     // cokoliv vytvorim pomoci "new", musim znicit pomoci "delete"
    delete[] produkty;
    produkt = NULL;     // zaparkuji pointer
    produkty = NULL;

    return 0;
}
