Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++-keltanokka ottaisi neuvoja vastaan

Sivun loppuun

Turmelo [20.02.2010 16:45:06]

#

Olen nyt jonkin aikaa kirjoittanut toista ohjelmaani, lisäillyt aina kaikkea pikkukivaa ajankuluksi.

Ohjelma on olevinaan osto-/myyntiohjelmakokeilu johonkin peliin, jonka voisin taitojeni kehittyessä ehkä vielä joskus tehdä. Ohjelmassa ostetaan tavaraa ja myydään sitä tarvittaessa (tyyliin: haarniskasankari täyttää varastonsa tämän tyypin kaupassa sitten).

Ostat tavaraa, menetät rahaa ja tavaran hinta kaupassa nousee. Myyt tavaraa, saat osan rahoista takaisin ja rahat menevät pankkitilille, josta voi nostaa vasta kun rahaa on alle 15$ (pikkukiva lisäys) - älkää kysykö, ohjelmassa ei ole järkeä, saatikka tavoiteltavaa!!!!!

Anteeksi kun innostuin kertomaan, mutta koin tarpeelliseksi kertoa miten ohjelma tarkemmin toimii, MUTTA siihen itseasiaan:

Tarkoitus olisi kokeneemmilta saada tietää olisiko jotain voinut tehdä helpommin tai jotain minkä tein väärin. DEV C++ ei nillitä mistään, mutta se ei myöskään kerro paremmista/vakaammista ratkaisuista.. kai..?

#include <iostream>
#include <math.h>

using namespace std;

int main () {

    float rahat = (5000);
    float taulukko[6][1] = { {300},
                           {250},
                           {2000},
                           {15},
                           {120} };

    int Water, Cigars, Booze, Candle, Battery;
        Water = Cigars = Booze = Candle = Battery = 0;

    char valinta;
    float rahat2 =(0000);
    do {
        int Balance = (int) rahat; // Tämä tekee desimaaleista kokonaislukuja
        int taulukkoA = (int) taulukko[0][0];
        int taulukkoB = (int) taulukko[1][0];
        int taulukkoC = (int) taulukko[2][0];
        int taulukkoD = (int) taulukko[3][0];
        int taulukkoE = (int) taulukko[4][0];
        int MUSTI = (int) rahat2;


         cout << endl << endl;
         cout << "     SHOP   " << endl << endl << "Balance: " << Balance << "$" << endl << "Bank: "<< MUSTI << "$ " << " *You can withdraw only if your balance is less than 15$!!*" <<endl << endl;
         cout << "        A. " << taulukkoA << "$" << "   Bottle of Water" << "     [" << Water << "]"  <<  " <F. SELL" << endl;
         cout << "        B. " << taulukkoB << "$" << "   Pack of Cigarettes" << "  [" << Cigars << "]" << " <G. SELL" << endl;
         cout << "        C. " << taulukkoC << "$" << "  Bottle of Booze" <<  "     [" << Booze << "]"<< " <H. SELL" << endl;
         cout << "        D. " << taulukkoD << "$" << "    Candle" << "              [" << Candle << "]"<< " <I. SELL" << endl;
         cout << "        E. " << taulukkoE << "$" << "   Battery" << "             [" << Battery << "]"<< " <J. SELL" << endl;
         cout << endl <<"                                         K. Bank withdrawal "<<endl  <<"                                         L. Exit store" << endl << endl << "What would you like to buy?" << endl<< endl;

              // OSTAMINEN

              cin >> valinta;

              if (!( valinta != 'A' && valinta != 'a')) {
              if (taulukkoA < Balance) {                                        //Estää rahojen menemistä miinukselle
                        rahat = rahat - taulukko[0][0], Water++, taulukko[0][0] += taulukko[0][0] * 0.0005   ;
                        }
              } else if (!( valinta != 'B' && valinta != 'b')) {
                     if (taulukkoB < Balance) {
                        rahat = rahat - taulukko[1][0], Cigars++, taulukko[1][0] += taulukko[1][0] * 0.00025   ;
                        }
              } else if (!( valinta != 'C' && valinta != 'c')) {
                     if (taulukkoC < Balance) {
                        rahat = rahat - taulukko[2][0], Booze++, taulukko[2][0] += taulukko[2][0] * 0.0005   ;
                        }

              } else if (!( valinta != 'D' && valinta != 'd')) {
                     if (taulukkoD < Balance) {
                        rahat = rahat - taulukko[3][0], Candle++, taulukko[3][0] += taulukko[3][0] * 0.007   ;
                        }
              } else if (!( valinta != 'E' && valinta != 'e')) {
                     if (taulukkoE < Balance) {
                        rahat = rahat - taulukko[4][0], Battery ++, taulukko[4][0] += taulukko[4][0] * 0.0005   ;
                        }
              } else if (!( valinta != 'K' && valinta != 'k')) {
                     if (Balance < 15 ) {
                        rahat = rahat + rahat2, rahat2 = 0    ;
                        }
              // MYYMINEN

              } else if (!( valinta != 'F' && valinta != 'f')) {
                     if (Water >= 1) {                                          //Estää tavaran menemästä miinukselle
                        rahat2 = rahat2 += taulukko[0][0] * .87, Water -= 1   ;
                        }

              } else if (!( valinta != 'G' && valinta != 'g')) {
                     if (Cigars >= 1) {
                        rahat2 = rahat2 += taulukko[1][0] * .92, Cigars -= 1  ;
                        }

              } else if (!( valinta != 'H' && valinta != 'h')) {
                     if (Booze >= 1) {
                        rahat2 = rahat2 += taulukko[2][0] * .77, Booze -= 1   ;
                        }

              } else if (!( valinta != 'I' && valinta != 'i')) {
                     if (Candle >= 1) {
                        rahat2 = rahat2 += taulukko[3][0] * .95, Candle -= 1   ;
                        }

              } else if (!( valinta != 'J' && valinta != 'j')) {
                     if (Battery >= 1) {
                        rahat2 = rahat2 += taulukko[4][0] * .90, Battery -= 1   ;
                        }

             // LOPETUS  /  KIERTO

              } else if (!( valinta != 'L' && valinta != 'l')) {
                     return 0;
              } else {
                cout << "That option does not exist yet" << endl; }
              } while (valinta = 1) ;
}

Hei joo sitten seassa voi olla muuttujia joille ei ole edes käyttöä (muutoksia on tehty PAAALJON) niistäkin saa mainita jos niitä löytyy.

Kiitokset jo etukäteen, lupaan kiittää myös jälkeenkin.

vehkis91 [20.02.2010 16:49:48]

#

kooditagit... (mod. lisäsi)

Turmelo [20.02.2010 16:54:49]

#

vehkis91 kirjoitti:

kooditagit... (mod. lisäsi)

Ah joo, kato mä en tollasia osaa. Eli mitä merkkejä jatkossa skrivaan ennen ja jälkeen koodin?

Macro [20.02.2010 16:56:59]

#

https://www.ohjelmointiputka.net/ohje.php?tunnus­=kohjeet

Turmelo [20.02.2010 17:01:16]

#

Macro kirjoitti:

https://www.ohjelmointiputka.net/ohje.php?tunnus­=kohjeet

Tämä selvä, tack. Mutta se itse aihe sitten?

Jokotai [20.02.2010 17:57:56]

#

endl saa kätevämmin \n. Koodi on hyvä.
:D

Turmelo [20.02.2010 18:18:22]

#

Itse tykkään käyttää endl :P

os [20.02.2010 18:37:52]

#

Jokotai: väärin meni, endl:ssä ei ole mitään vikaa, mutta koodissa on muuten reilusti parantamisen varaa.

Turmelo: Ihan ensimmäisenä voisit tutustua loogiseen tai-operaatioon, jota merkitään C++:ssa ||. Seuraavaksi kannattaa miettiä, miten saat koodin toimimaan (mielellään runsaasti olioita tai tietueita käyttäen) siten, että jokaiselle tarvikkeelle ei ole erillistä muuttujaa, joita käsitellään erikseen mutta samalla tavalla (koodin kopiointi). Tai jopa siten, että voit lisätä uusia tuotteita ajon aikana, mikä on vain käyttöliittymäkysymys, jos ratkaisit edellisen kohdan hyvin.

Turmelo [20.02.2010 19:24:12]

#

os kirjoitti:

Jokotai: väärin meni, endl:ssä ei ole mitään vikaa, mutta koodissa on muuten reilusti parantamisen varaa.

Turmelo: Ihan ensimmäisenä voisit tutustua loogiseen tai-operaatioon, jota merkitään C++:ssa ||. Seuraavaksi kannattaa miettiä, miten saat koodin toimimaan (mielellään runsaasti olioita tai tietueita käyttäen) siten, että jokaiselle tarvikkeelle ei ole erillistä muuttujaa, joita käsitellään erikseen mutta samalla tavalla (koodin kopiointi). Tai jopa siten, että voit lisätä uusia tuotteita ajon aikana, mikä on vain käyttöliittymäkysymys, jos ratkaisit edellisen kohdan hyvin.

Olisiko ideoita mihin väliin || käyttäisin tai miten soveltaisin tietueiden käyttöä? Ehkä esimerkkiä antaa tai vihjettä miten jälkimmästä käyttäisin. Itselläni leikkaa tyhjään ja pahasti. Valmista vastausta toivon vähiten.

trilog [20.02.2010 19:29:52]

#

Esim.:

struct tuote {
    const char* nimi;
    int hinta; // float olisi tosin fiksumpi tietotyyppi
};

Turmelo [20.02.2010 20:01:21]

#

Kiitän trilog, tästä tajusin. Ja myöskin tuhannet kiitokset os:lle palautteesta.

Metabolix [20.02.2010 20:49:11]

#

Ja tuosta ||-operaattorista:

if (!(valinta != 'J' && valinta != 'j')) {...} // Omituinen.
if (valinta == 'J' || valinta == 'j') {...}    // Selkeämpi.

trilogin esimerkistä korvaisin const char* -tyypin standardikirjaston std::string-oliolla. Lähtökohta on kuitenkin aivan oikea. Laita aluksi tuollaisia tuotetietueita vaikka taulukkoon tai std::vector-rakenteeseen. Kaupassa oleva tuote voisi sisältää tiedon myös lukumäärästään, jolloin käypä hinta laskettaisiin absoluuttisen arvon ja lukumäärän perusteella jollain kaavalla. Toisin sanoen tallennettua hinta- tai arvotietoa ei koskaan muutettaisi.

Turmelo [20.02.2010 21:12:39]

#

"Trilogin esimerkistä korvaisin const char* -tyypin standardikirjaston std::string-oliolla." - Mutta miksi? Tämä tosiaan on toinen ohjelmani jälkeen Hello Worldin, käsitystä itselläni asioista ei kummoisemmin siis ole. Tällä hetkellä pänttään juuri sinun opastasi, Metabolix. Menossa on osa 5

Metabolix [20.02.2010 21:49:50]

#

Koska string-olioon on helppo esimerkiksi lukea käyttäjältä tuotteen nimi (jos nyt teet käyttöliittymän myös tuotteiden lisäämiseen). Aiheesta kerrotaan hieman opassarjan 4. osassa. Valitettavasti opassarja on yhä kesken, eikä luokista (omista tai valmiista) ole vielä kerrottu tarkemmin.

User137 [25.02.2010 22:50:20]

#

Sitten voisit muuttaa valinta muuttujan heti luvun jälkeen pikkukirjaimiksi jotta sinun ei tarvitse verrata kahta kirjainkokoa joka if-lauseessa. En tiedä miten tehään C++:ssa, joku LowerCase/LCase?

Toiseks, onko pilkulla erottaminen ihan tavallinen käytäntö?

rahat2 = rahat2 += taulukko[4][0] * .90, Battery -= 1   ;

Luulin että käskyt lopetetaan aina ; merkkiin.

Metabolix [25.02.2010 23:25:10]

#

Pilkkua en tosiaan suosittele lausekkeen osana. Mistä olet edes keksinyt sen? Suuri osa ohjelmoijista ei edes tiedä sen käytöstä tuossa merkityksessä, ja siitä on hyvin harvoin hyötyä – sen sijaan koodin selkeyteen se vaikuttaa haitallisesti.

Myöskään useampaa erilaista sijoitusta ei kannata laittaa samalle riville; luultavasti tuokin meni vain tuurilla oikein, ja ainakaan rivi ei ole kovin selkeä.

Koodia ei kannata koskaan lyhentää kikkailuilla, vaan paras lyhennystapa on järkevä suunnittelu, tässä tapauksessa siis erilaisten esineiden tallentaminen järkevään tietorakenteeseen. Pieniä ohjelmia tekevät aloittelijat harvoin ajattelevat asiaa tai uskovat toisten sanoja, mutta sanon silti: epäselvä ja kommentoimaton koodi on jo muutaman viikon jälkeen inhottavaa luettavaa, ja vuoden kuluttua korjauksia tehdessä voi olla jo nopeampaa kirjoittaa kaikki uudestaan kuin yrittää ymmärtää vanhaa koodia.

vehkis91 [25.02.2010 23:26:42]

#

no esim

int a = 0, b = 1, c = 2;

on ihan normaali käytäntö.

eq [26.02.2010 00:00:18]

#

vehkis91 kirjoitti:

no esim

int a = 0, b = 1, c = 2;

on ihan normaali käytäntö.

Pienessä ohjelmassa tai yksinkertaisessa funktiossa menettelee; usein ei kuitenkaan ole tarpeellista edes esitellä useita muuttujia yhdellä rivillä tai yhdessä lausekkeessa.

--

AP:n koodi on kyllä aikamoista huttua, alkaen tarpeettomista sulkeista vakioidedn ympärillä ja kaksiuloitteisen taulukon käytöstä yksiulotteisen tiedon säilömiseen ja erityisesti tuon pilkkuoperaattorin käytön vuoksi (kyllä, muitakin kummallisuuksia on). (Varsinkin viimeiseen kohtaan:) Miksi ihmeessä?


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta