C++ problém

Programovacie jazyky, rady, poradňa...
sliziky
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 223
Registrovaný: 29 júl 2012, 13:22

C++ problém

Príspevok od používateľa sliziky »

Zdravím, potrebujem poradiť,robím taký jednoduchý "program " v ktorom si môžte vybrať vypočítať,obsah,objem,plochu telesa atď. No a pri objeme mám ten problém ,že keď si chcem zvoliť 5) Objem ,tak musím napísať 5.0 namiesto 5 a v pri 6) Prevod jednotiek
už musím tri číslice zadať,tj,600 pod seba aby mi to išlo,ďakujem za radu :)) :

Kód: Vybrať všetko

 cout << "1.Kalkulacka \n";
    cout << "2.Obsah \n";
    cout << "3.Obvod \n";
    cout << "4.Povrch \n";
    cout << "5.Objem \n";
    cout << "6.Prevod jednotiek \n";
    cin >> hh; ]
 
[ if (hh==5) {cout << "1.Objem kocky \n";
    cout << "2.Objem kvadra \n";
    cout << "3.Objem gule \n";
    cout << "4.Objem ihlana \n";
    cout << "5.Objem valca \n";
    cout << "6.Objem guloveho odseka \n";
    cout << "7.Objem kuzela \n";
}
    cin >> be;] 
..tu je výsek z toho kódu,ak budete ešte niečo potrebovať ,tak kľudne doložím ..
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8217
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: C++ problém

Príspevok od používateľa harrison314 »

1. kod patri do tagov code
2. predpokladam ze hh je typu double alebo float, zmen ju na int
sliziky
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 223
Registrovaný: 29 júl 2012, 13:22

Re: C++ problém

Príspevok od používateľa sliziky »

Zabudol som na to ,je zadefinovaná ako int :)
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ problém

Príspevok od používateľa BX »

Pošli celý kód
sliziky
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 223
Registrovaný: 29 júl 2012, 13:22

Re: C++ problém

Príspevok od používateľa sliziky »

Je to trošku dlhšie,tak si to radšej stiahni :)) http://www.upnito.sk/subor/e1760791424e ... 8442e.html
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ problém

Príspevok od používateľa BX »

Do prílohy prosím, alebo aj do CODE (ak to má menej ako 150 riadkov, môžeš kľudne do code)
sliziky
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 223
Registrovaný: 29 júl 2012, 13:22

Re: C++ problém

Príspevok od používateľa sliziky »

Má to viac než 150 :P
Prílohy
Thebestthis.rar
(1.86 KiB) 68 stiahnutí
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ problém

Príspevok od používateľa BX »

Už keď si napísal, že to má viac ako 150 riadkov som cítil istú nevôľu otvoriť to. Potvrdilo sa. Ten kód je hrozný.

Najmä teda jedna rada: Nemusíš si pre každú hlúposť vytvárať svoju premennú. Máš ich tam snáď 50, stačili by ti tak tri.
Keď toto opravíš, kód sa trochu skrášli a môžeš niečo porobiť aj s tými nekonečnými podmienkami.
sliziky
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 223
Registrovaný: 29 júl 2012, 13:22

Re: C++ problém

Príspevok od používateľa sliziky »

Ja viem že to je hrozné,aj že tam je veľa premenných,viem,vyznie to hlúpo,ale aj ja v tom mám problém niekedy sa vyznať:D A s tými podmienkami čo sa dá spraviť?
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ problém

Príspevok od používateľa BX »

V prvom rade je treba si uvedomiť, že premenná je na to, aby sa menila (lebo je premenná).

V druhom rade je na toto vhodný switch a funkcie, takže takúto konštrukciu by som tam chcel vidieť viac krát

Kód: Vybrať všetko

int vyber;

...
cin >> vyber;
switch( vyber )
{
   case 1: Kalkulacka(); break;
   case 2: Obsah() break;
   atd...
}
No a funkcie budú obaľovať danú rutinu, takže pred main dáš ešte

Kód: Vybrať všetko

void Kalkulacka()
{
 int vyber;
 cin >> vyber;
 switch( vyber )
 {
   ... atd
 }
}
Takto môžeš do funkcií rozbiť úplne všetko a každá funkcia bude mať zmysluplný názov a jednoduchý kód, ktorý vykoná. Takto sa to bežne robí.
Pri takýchto jednoduchších veciach, ako sčítaj dva čísla ale môžeš napísať priamo do switch

Kód: Vybrať všetko

int vyber, n1, n2;
cin >> vyber;
switch( vyber )
 {
   case 1: cin >> n1; cin >> n2; cout << n1+n2; break;
 }
Nejdem ti to tu viac písať, nemám teraz čas :D Skús sa nad týmto zamyslieť a skús to spraviť takýmto spôsobom.
Potom to pošli znovu a uvidíme, ako ti to išlo :)
sliziky
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 223
Registrovaný: 29 júl 2012, 13:22

Re: C++ problém

Príspevok od používateľa sliziky »

Takto môže byť??
Prílohy
Swithc.rar
(724 Bajtov) 53 stiahnutí
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ problém

Príspevok od používateľa BX »

nie nie nie nie nie.

Kód: Vybrať všetko

 switch (vyber) {
        case 1 :
             cout << "1.Spocitavanie " << endl;
             cout << "2.Odpocitavanie "<< endl;
             cout << "3.Nasobenie " << endl;
             cout << "4.Delenie " << endl;
             cin >> kalk;
                 break; 
}
Toto je na čo? Na nič. Switch je na to, aby si mal všetky možnosti pekne pokope. Nie že tu mám jednu a o 50 riadkov nižšie druhú.
Používaj funkcie. Či sa ti páčia, alebo nie. Čím skôr im prídeš na chuť, tým skôr prenikneš do skutočného programovania.

A znova, používaj čo najmenej premenných a používaj zmysluplné názvy (kludne aj dlhšie, stále lepšie ako nejaké divné skratky)
sliziky
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 223
Registrovaný: 29 júl 2012, 13:22

Re: C++ problém

Príspevok od používateľa sliziky »

A asi tak názorne že ako to má vyzerať??
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ problém

Príspevok od používateľa BX »

Kód: Vybrať všetko

#include <iostream>
using namespace std;

/// ziadne globalne premenne, zbytocne!

/// tato funkcia urobi vsetko potrebne pre vyber 'sucet dvoch cisel' v kalkulacke
void sucet2()
{
    int a,b;
    cout << "Zadaj dva cisla\n";
    cin >> a >> b;
    cout << a << " + " << b << " = " << a+b << "\n";
}

/// tato funkcia urobi vsetko potrebne pre vyber 'sucin dvoch cisel' v kalkulacke
void sucin2()
{
    int a,b;
    cout << "Zadaj dva cisla\n";
    cin >> a >> b;
    cout << a << " * " << b << " = " << a*b << "\n";
}

/// tato funkcia urobi vsetko potrebne pre vyber "kalkulacka"
void kalkulacka()
{
    /// Chovam sa tu, akoby sa nic pred tym nestalo.
    /// Kazda funkcia ma "svoj vlastny piesocek" (anglicky sa to nazyva 'scope').
    /// To vyuzivam a s kludom si pisem podprogram rovnako, ako by to bolo v main.
    /// Ved aj main je len funkia.

    int vyber; /// tato premenna nema nic spolocne s premennou vyber vo funkcii main(),
               /// ani inou premennou. Kazda funkcia ma vlastny 'scope'.
    cout << "1. Sucet dvoch cisel\n";
    cout << "2. Sucin dvoch cisel\n";
    cin >> vyber;

    switch( vyber )
    {
        case 1: sucet2(); break; /// znovu zavolam podprogram
        case 2: sucin2(); break; /// znovu zavolam podprogram
        default: cout << "Nezadal si spravnu volbu. Program konci.\n";
    }
}

/// tato funkcia urobi vsetko potrebne pre vyber "obsah stvorca"
void obsahStvorca()
{
    int a;
    cout << "Zadaj stranu stvorca\n";
    cin >> a;
    cout << "Obsah stvorca je " << a*a << "\n";
}

/// tato funkcia urobi vsetko potrebne pre vyber "obsah obdlznika"
void obsahObdlznika()
{
    int a, b;
    cout << "Zadaj strany obdlznika\n";
    cin >> a >> b;
    cout << "Obsah obdlznika je " << a*b << "\n";
}

/// tato funkcia urobi vsetko potrebne pre vyber "obsah kocky"
void obsahKocky()
{
    int a;
    cout << "Zadaj stranu kocky\n";
    cin >> a;
    cout << "Obsah kocky je " << a*a*a << "\n";
}

int main()
{
    /// tu zacina funkcia main, ktora sa vola ako prva.
    int vyber;
    cout << "1. Kalkulacka\n";
    cout << "2. Obsah stvorca\n";
    cout << "3. Obsah obdlznika\n";
    cout << "4. Obsah kocky\n";
    cin >> vyber;

    switch(vyber) /// podla vyberu si zavolam odpovedajuci podprogram
    {
        case 1 : kalkulacka(); break;
        case 2 : obsahStvorca(); break;
        case 3 : obsahObdlznika(); break;
        case 4 : obsahKocky(); break;
        default: cout << "Nezadal si spravnu volbu. Program konci.\n";
    }
    return 0;
}
Takto by to malo vyzerať, aby to bolo pekne napísané.
Ide o to, že main by typicky mal byť čo najkratší a všetko podstatné by sa malo diať v podprogramoch (funkciách). Pri krátkych a jednoduchých programoch to nevadí, ale pri dlhších už sa to pýta.
Pretože miesto toho, aby som písal všetko za sebou, tak pomocou takéhoto písania si môžem rozdeliť program na viacero menších podprogramov a tak mám o pár starostí menej. Zrazu nepíšem jeden veľký program, ale 6 menších. A to je jednoduchšie.

A teda s tými premennými, takto by to mohlo vyzerať bez podprogramov (funkcií)

Kód: Vybrať všetko

#include <iostream>
using namespace std;

int main()
{
    int vyber;
    int a,b; /// stacia mi dve pomocne premenne

    cout << "1. Kalkulacka\n";
    cout << "2. Obsah stvorca\n";
    cout << "3. Obsah obdlznika\n";
    cout << "4. Obsah kocky\n";
    cin >> vyber;

    if( vyber == 1 )
    {
        cout << "1. Sucet dvoch cisel\n";
        cout << "2. Sucin dvoch cisel\n";
        cin >> vyber; /// Premenna vyber uz je mi na nic, uz viem, ze bola zadana volba 'kalkulacka'.
                      /// Mozem si ju kludne prepisat.

        /// switch pouzijem len na jednoduchsie veci.
        /// case by typicky nemal mat viac ako 5 riadkov, potom uz to vyzera divne.
        /// Pri dlhsich kodoch pouzijem radsej if.
        switch( vyber ) /// vyber na zaklade novej volby
        {
            case 1: cout << "Zadaj dva cisla\n";
                    cin >> a >> b;
                    cout << a << " + " << b << " = " << a+b << "\n";
                    break;

            case 2: cout << "Zadaj dva cisla\n";
                    cin >> a >> b;
                    cout << a << " * " << b << " = " << a*b << "\n";
                    break;

            default: cout << "Nezadal si spravnu volbu. Program konci.\n";
        }
    }
    else /// vdaka 'else if' sa mi vzdy chyti len jediny vyber.
         /// nemusim sa preto bat prepisat premennu 'vyber'.
    if( vyber == 2 )
    {
        cout << "Zadaj stranu stvorca\n";
        cin >> a;
        cout << "Obsah stvorca je " << a*a << "\n";
    }
    else
    if( vyber == 3 )
    {
        cout << "Zadaj strany obdlznika\n";
        cin >> a >> b;
        cout << "Obsah obdlznika je " << a*b << "\n";
    }
    else
    if( vyber == 4 )
    {
        cout << "Zadaj stranu kocky\n";
        cin >> a;
        cout << "Obsah kocky je " << a*a*a << "\n";
    }
    else
        cout << "Nezadal si spravnu vlbu. Program konci";

    return 0;
}

Keďže vždy sa vykoná len jedna vetva if( vyber == ...), tak môžem premenné a,b kľudne recyklovať a používať všade.
sliziky
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 223
Registrovaný: 29 júl 2012, 13:22

Re: C++ problém

Príspevok od používateľa sliziky »

What about this?? Myslím že tých premenných tam je stále trošku naviac ,ale stále som neprišiel na to ako ich obmedziť,aj keď si mi to sem písal,nejak sa bojím používať tie isté,radšej použijem viac a iné ,tých funkcií tam taktiež nie je nejako moc ,alebo je to v pohode ?? :) Teraz som si všimol,že tam vlastne namiesto e,d,f kľudne a,b :))
Prílohy
Jajedna.rar
(719 Bajtov) 55 stiahnutí
Fabo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6810
Registrovaný: 16 nov 2007, 17:23
Bydlisko: 's Chravenhache
Kontaktovať používateľa:

Re: C++ problém

Príspevok od používateľa Fabo »

-na prvy vyber mozes pouzit tiez case, takisto ako na druhy vyber kde si ho pouzil.
-na druhy vyber ti staci jedna premenna, nemusis na kazdy vysledok z prvej volby pouzit inu premennu. Eventuelne ked uz chces... tak v zaujme citatelnosti skus pouzit enumy.

-minimalne miesto d mozes kludne pouzit e alebo f. plus vyber v druhom "kole".

-nauc sa lepsie narabat s indentaciou, blbo sa to cita.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++ problém

Príspevok od používateľa BX »

Už je to trošku lepšie, ale poprosím znovu a bez globálnych premenných.
Prečítaj si najprv trocha teórie k premenným, globálnym premenným a k funkciám (hlavne global vs. local scope)
sliziky
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 223
Registrovaný: 29 júl 2012, 13:22

Re: C++ problém

Príspevok od používateľa sliziky »

Pozriem sa na to ešte aj na tie premenné,aj na funkcie ,potom poprípade ak dačo by som "vytvoril" tak pošlem ,diky :))
Fabo
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6810
Registrovaný: 16 nov 2007, 17:23
Bydlisko: 's Chravenhache
Kontaktovať používateľa:

Re: C++ problém

Príspevok od používateľa Fabo »

sliziky v sukromnej sprave napísal: Čau,prosím ťa čo je tá/to enumy? Hľadal som ale nejak som tomu nepochopil :))
Enum je akysi, povedal by som, zastupny typ. Dobry je na to, ze sa pri kompilacii spracuje a pocas behu programu funguje ako int, ale pri pisani miesto toho pouzivas citatelne nazvy, ktore si zadefinujes v definicii enumu.

Priklad:

Kód: Vybrať všetko

static enum FARBY
{
   CERVENA,
   ZELENA,
   MODRA
};
a dalej v kode pri pouziti

Kód: Vybrať všetko

cout << "Zvolte si oblubenu farbu. 1. cervena 2. zelena 3. modra;
FARBY vyber; //mozes kludne pouzit aj int vyber
cin >> vyber;
switch(vyber)
{
   case CERVENA: ...
   case ZELENA: ...
   case MODRA: ...
}

V tvojom pripade by si si napr. urobil pre prvy vyber enum kde by si mal cleny ako VZORCE OBSAH OBVOD, potom by si pouzil switch na input a case VZORCE: potom case OBSAH: atd.
V dalsej urovni by si mal napr. enum vyber_vzorce s clenmi SUCET SUCIM ROZDIEL PODIEL a v switchi by si volal nieco ako case SUCIN: sucin(); case SUCET: sucet();
sliziky
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 223
Registrovaný: 29 júl 2012, 13:22

Re: C++ problém

Príspevok od používateľa sliziky »

Aha,hmmm...nevyzerá to zle,len to bude chcieť praxe trošku,akurát taká drobná otázka to "static" tam má akú úlohu?:)
Napísať odpoveď