Diskuze: Zjednodušení kódu

C++ C a C++ Zjednodušení kódu

Avatar
Jakub Klindera:

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. dubna 17:31
Avatar
Jozef
Člen
Avatar
Jozef:

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. dubna 18:21
I'm not afraid to die on a treadmill
Avatar
Odpovídá na Jozef
Jakub Klindera:

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. dubna 18:43
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na Jakub Klindera
Drahomír Hanák:

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. dubna 18:44
Avatar
Jakub Klindera:

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. dubna 20:53
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Jakub Klindera
Martin Dráb:

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í
+1 bodů
Řešení problému
Nahoru Odpovědět 15. dubna 22:02
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
Jakub Klindera:

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. dubna 22:19
Avatar
Jozef
Člen
Avatar
Odpovídá na Drahomír Hanák
Jozef:

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. dubna 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.