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.
kooditagit... (mod. lisäsi)
vehkis91 kirjoitti:
kooditagit... (mod. lisäsi)
Ah joo, kato mä en tollasia osaa. Eli mitä merkkejä jatkossa skrivaan ennen ja jälkeen koodin?
Macro kirjoitti:
Tämä selvä, tack. Mutta se itse aihe sitten?
endl saa kätevämmin \n. Koodi on hyvä.
:D
Itse tykkään käyttää endl :P
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.
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.
Esim.:
struct tuote { const char* nimi; int hinta; // float olisi tosin fiksumpi tietotyyppi };
Kiitän trilog, tästä tajusin. Ja myöskin tuhannet kiitokset os:lle palautteesta.
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.
"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
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.
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.
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.
no esim
int a = 0, b = 1, c = 2;
on ihan normaali käytäntö.
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ä?
Aihe on jo aika vanha, joten et voi enää vastata siihen.