NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Vyjímka v podmínce

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jakub Šittich:21.10.2016 15:02

Zdravím jsem začátečník a mám otázku.Mám cyklus který vytáhne z pole nejvyšší hodnotu.To dělám přes if ale když chci najít duhou nejmenší opět přes if jde dát jako parametr podmínky aby vynechal tu hodnotu z předhozího ifu ? Děkuji za odpověď

 
Odpovědět
21.10.2016 15:02
Avatar
Erik Šťastný:21.10.2016 15:34

Zdravím, řekl bych, že ne tak přesně jak to říkáš, pokud máš zavedenou metodu co vrací největší číslo z pole, tak těžko vytáhne jen tak sama od sebe druhé nejvyšší ať jí dáš co chceš :) Budeš muset sáhnout do té metody a upravit ji samotnou.

Pokud myslíš vynecháním jen to, že ti to nevrátí z pole nic, tak si můžeš vytvořit proměnou kam uložíš to co jsi vytáhl a do podmínky dáš, že když se vytáhnutí největšího čísla rovná tomu co jsi vytáhnul předtím (v té proměnné) tak nevrátí nic :)

 
Nahoru Odpovědět
21.10.2016 15:34
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Jakub Šittich
DarkCoder:21.10.2016 17:08

Samozřejmě že to jde a nemusíš být omezen pouze na jednu hodnotu - hodnotu největšího prvku. Co třeba vytvořit druhé pole o stejné velikosti, kam si budeš zapisovat příznak, že hodnota už byla vyhodnocena a tento příznak kontrolovat při procházení pole, ze kterého hledáš aktuálně nejvyšší prvek? Nebo lépe příznak nahradit přímo hodnotou představující kolikátý že to je nejvyšší prvek. Je třeba si ale uvědomit, že každou další pozici získáš opětovným procházením celého pole a počet těchto procházení si musíš poznamenávat. Půjdeš-li hodně "hluboko", je třeba zvážit, zda-li už se Ti nevyplatí rovnou celé pole setřídit. To vše je ale stále pouze příznak. Budeš-li chtít vyhledat v poli prvek, který je n-tý nejvyšší v pořadí, musel bys stále sekvenčně procházet pole příznaků a porovnávat index pole. Prvek může být na začátku ale i u konce a nebo také jeho pozici nemusíš vůbec zjistit. Zde pak si pole naplňuješ hodnotami postupně nebo elegantněji, pole si postupně naplňuješ ukazateli na konkrétní prvek z důvodu rychlosti, neboť prvkem může být komplexní datový typ jako třeba struktura. Shrnutí: Index v poli příznaků Ti dá informaci o tom, kolikátý v pořadí dle velikosti že to daný prvek je. Index v poli ukazatelů Tě odkazuje na prvek, který je právě n-tý nejvyšší v pořadí dle velikosti.

Nahoru Odpovědět
21.10.2016 17:08
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Jakub Šittich
ostrozan:24.10.2016 8:40

Já bych šel přes Sort() a k prvkům přistupoval podle indexů
nejvyšší hodnota bude na [0],druhá nejvyšší na [1] atd

 
Nahoru Odpovědět
24.10.2016 8:40
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Jakub Šittich
ostrozan:25.10.2016 0:03

Jelikož se nezmiňuješ o tom, o co se vlasně pokoušíš, tak můžu jen odhadovat, že se snažíš setřídit pole podle hodnot od nejvyšší k nejnižší.
Takže klasická začátečnická chyba - vymýšlí se "kolo".

s polem se dá dělat spousta věcí za pomocí k tomu určených metod
nemůže to být ale obyčejné pole - musí být o něco chytřejší a to v C++ reprezentuje vector a list

vyhrabal jsem pro ilustraci kód, kde jsem si s vectorem trochu hrál

int main()
{
        int num =0;
        vector<string> zvirata = { "pes","kocka","zajic","andulka","jelen" };
        vector<string> zvirata_puvodni = zvirata;
        vector<int> hodnoty = { 46, 28, -333, 13,12, 193, 132, -114  };
        vector<int> hodnoty_kopie = hodnoty;

             //serazeni a vypis zvirat
            sort(zvirata.begin(), zvirata.end());
            for each (string str in zvirata)cout << str << "  ";
                cout << "\n  stav pred upravami:\n";
                for each (string str in zvirata_puvodni)cout << str << "  ";

                //serazeni a vypis hodnot
        cout <<"\n\n vypis sestupne:\n";
                sort(hodnoty.rbegin(), hodnoty.rend());
                for each (int num in hodnoty)cout << num << "  ";
                cout << "\n vypis vzestupne:\n";
                sort(hodnoty.begin(), hodnoty.end());
                for each (int num in hodnoty)cout << num << "  ";
                //pridani cisla
                cout << "\n pridej cislo:";
                cin >> num;
                hodnoty.push_back(num);
                cout << "\n novy stav:\n";
                for each (int num in hodnoty)cout << num << "  ";

                //zjisteni hodnoty na urcenem indexu
                cout << "\n vem hodnotu z indexu:";
                cin >> num;
                //validace zadaneho cisla
                if(num>hodnoty.size()-1)cout << "\n out of range - priste lepe :)\n";
                else cout << "\n na indexu:"<<num<<"je cislo "<<hodnoty.at(num)<<"\n";

                //smazani urceneho poctu cisel
                cout << "\n pocet cisel ke smazani:";
                cin >> num;
                hodnoty._Pop_back_n(num);
                cout << "\n novy stav:\n";
                for each (int num in hodnoty)cout << num << "  ";
                cout << "\n  stav pred upravami:\n";
                for each (int num in hodnoty_kopie)cout << num << "  ";
        while (1);

}

snad je z kódu jasné, co která metoda třídy vector dělá

 
Nahoru Odpovědět
25.10.2016 0:03
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.