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: Zjednodušení kódu

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

Aktivity
Avatar
Jakub Klindera:15.4.2016 17:31

Ahoj, chtěl bych se zeptat, jestli se dá nějak zjednodušit zvýrazněný kód.
Tento program háže šesti kostkama a musí hodit čísla, aby součet byl buď 15,16,17,18,19 a 20. Zajímá mě, jestli se to nedá napsat nějak jednodušeji, než takto:

(hodKostkou[0] + hodKostkou[1] + hodKostkou[2] + hodKostkou[3] + hodKostkou[4] + hodKostkou[5]) == 15 || 16 || 17 || 18 || 19 || 20

Pokud bych tam měl třeba rozmezí 100 - 300, tak ať to nemusím vypisovat 100 || 101 || 102 || ...

Přikládám celý kód:

#include <iostream>
#include <string>
#include <ctime>

using namespace std;

int main()
{
        srand(time(0));
        int hodKostkou[6];
        bool hazeni = true;
        int delkaPole = sizeof((hodKostkou)) / sizeof((hodKostkou[0]));
        int cisloHodu = 1;
        while (hazeni == true)

        {
                cout << cisloHodu << ". hod\t" << endl;
                for (int i = 0; i < delkaPole; i++) {
                        hodKostkou[i] = (rand() % 6) + 1;
                }
                for (int i = 0; i < delkaPole; i++) {
                        cout << hodKostkou[i] << " ";
                }
                **if ((hodKostkou[0] + hodKostkou[1] + hodKostkou[2] + hodKostkou[3] + hodKostkou[4] + hodKostkou[5]) == 15 || 16 || 17 || 18 || 19 || 20) {
                        break;
                }**
                cout << endl;
                cisloHodu++;
        }
        cout << "\n" << endl;
        cout << endl << "Pocet hodu: " << cisloHodu << endl;
        cin.get();
        cin.get();
}

Děkuji za každou radu :)

 
Odpovědět
15.4.2016 17:31
Avatar
Jozef
Člen
Avatar
Jozef:15.4.2016 18:21

Spravil by som to pomocou cyklu:

for(int i = START; i <= END; i++)
{
        if(hodKostkou[0] + hodKostkou[1] + hodKostkou[2] + hodKostkou[3] + hodKostkou[4] + hodKostkou[5] == i)
              break;
}

V tomto prípade by

START = 15;
END = 20;
Nahoru Odpovědět
15.4.2016 18:21
I'm not afraid to die on a treadmill
Avatar
Odpovídá na Jozef
Jakub Klindera:15.4.2016 18:43

Tento kód mi nefunguje

for (int i = 15; i <= 20; i++) {
                        if (hodKostkou[0] + hodKostkou[1] + hodKostkou[2] + hodKostkou[3] + hodKostkou[4] + hodKostkou[5] == i)
                                break;
                }
 
Nahoru Odpovědět
15.4.2016 18:43
Avatar
Odpovídá na Jakub Klindera
Drahomír Hanák:15.4.2016 18:44

Přečti si tady článek o základních podmínkách v C++ http://www.itnetwork.cz/…ni-if-switch Konkrétně by se mohly hodit operátory <, >

Jozef: Tohle je zbytečně složité. Navíc by to ani nefungovalo správně (v podstatě by ten kód nic neudělal - zamysli se, co se stane, když se splní ta podmínka)

 
Nahoru Odpovědět
15.4.2016 18:44
Avatar
Jakub Klindera:15.4.2016 20:53

Zkoušel jsem to vyřešit následovně, ale bohužel neúspěšně.

int rozmezi = 15;

        int i;
        i = (rozmezi >= 15) && (rozmezi <= 20);

a cyklus pomocí while

while (i) {
                        if ((hodKostkou[0] + hodKostkou[1] + hodKostkou[2] + hodKostkou[3] + hodKostkou[4] + hodKostkou[5])== i) {
                                break;
                        }
                        break;
                }
 
Nahoru Odpovědět
15.4.2016 20:53
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Jakub Klindera
Martin Dráb:15.4.2016 22:02

Ono také záleží na tom, zda potřebuješ znát jednotlivé hodky, nebo ti stačí jen informace, zda v daném šestihodu padl součet do požadovaného rozmezí.

int soucet = 0;
for (int i = 0; i < 6; ++i)
  soucet += (rand() % 6);

if (source >= 15 && soucet <= 20)
...

Sice jsi se na to neptal, ale jako větší problém mi přijde fakt, že si s C ještě moc nerozumíš (ani základně). Nebo na mě tvé příspěvky tak působí.

Třeba řádek

i = (rozmezi >= 15) && (rozmezi <= 20);

ti do i dostadí nenulovou hodnotu, pokud hodnota proměnné rozmezí leží v intervalu <15;20>, a nulovou hodnotu, pokud neleží. Třeba MSVS tady pod pojmem nenulová hodnota myslí jedničku, ale myslím, že jiné překladače tam mohou doplnit MAXINT. Nebo je to možná definováno v normě.

Myslím ale, že to, co dělá ten řádek, nechceš.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
15.4.2016 22:02
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
Jakub Klindera:15.4.2016 22:19

Děkuji za pomoc. Zbytek už doladím ve škole. Každopádně, existuje několik způsobů, jak to napsat, ale pokud by to nebyl interval <15;20>, ale třeba <25;100>, tak komu by se to chtělo psát pomocí ||

Máš pravdu, moc si C++ nerozumím, ale proto se to učím a chodím do školy. :)
Každopádně, základní znalosti mám (podmínky, cykly,...). Každý se splete :)

Jozef, Drahomír Hanák, Martin Dráb - Děkuji Vám za rady, moc si toho cením. :)

 
Nahoru Odpovědět
15.4.2016 22:19
Avatar
Jozef
Člen
Avatar
Odpovídá na Drahomír Hanák
Jozef:17.4.2016 13:11

Je mi jasné že by to nič nespravilo, kedže pomocou break * by som sa dostal iba z daného cyklu, nie z toho hlavného. Chcel som nechať ten môj cyklus prázdny, asi som tam to *break skopíroval spolu s podmienkou.
Viem, že je to zbytočne zložité na tento konrétny príklad, ale predstav si, že by si mal napr. zadané hodnoty, ktoré majú padnúť: {1,2,3,5,7,20­,23,....}, tak iba mierne upravíš cyklus.

Nahoru Odpovědět
17.4.2016 13:11
I'm not afraid to die on a treadmill
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 8 zpráv z 8.