Olen aloittelija ja koitan tehdä sellaista ohjelmaa, joka kertoo mikä päivä huomenna on, kun käyttäjä ensiksi syöttää tämän päivän. QBasicilla osasin tehdä sen, mutta C++ ei tunnu onnistuvan. Eli haluisin harjoittelun vuoksi pistää ehtolauseet funktioon... siis esim JOS tänään = "maanantai" NIIN huomenna on "tiistai", mutta ei onnistu. Pistäkää koodivinkkiä, niin katson mikä meni vikaan.
Laitas mieluummin se oma koodisi tänne niin katsotaan yhdessä mikä oikeasti meni vikaan.
En nyt suoralta käsin osaa sanoa miten tuo kannattaa tehdä mutta tutustu ihmeessä ctime otsikkotiedoston antiin. Siitä löytyy juuri noita ajankäsittelyyn liittyvää settiä.
Eikös se mene näin:
if (tanaan=="maanantai") huomenna="tiistai";
Tapoja on monia.
Nyt äkkiseltään tulee mieleen toteuttaa toi joko ehtorakenteilla, switch() vois olla aika kätevä tai vaikka pistää päivät taulukkoon tyyliin
string VkPaivat[7]; Taulukko[0]="Maanantai"; Taulukko[1]="Tiistai"; //Kaikkia alkiot läpi
Käyttää voi esim.
int Paiva; Paiva=1;//Tiistai cout<<"Tanaan on "<<VkPaivat[Paiva]<<endl; cout<<"Huomenna on "<<VkPaivat[Paiva+1]<<endl;
Tuohon lisäksi on toki hyvä säätää tarkistukset että ei mennä rajojen ohi esim. jos eletään sunnuntaita niin tuo pätkä ei varmasti näytä maanantaita;)
Char-tauluja ei voi vertailla ==-operaattorilla. Tutustu strcmp-funktioon (string.h). Muutenkaan char-taulut eivät toimi alkuunkaan noin yksinkertaisesti (esim =-operaattori).
Jos et jaksa opetella niiden käyttöä, ota C++:n string tai siirry Pascaliin, niin ei tarvitse säätää noilla.
Jos taas jaksat, niin vihjeenä sprintf ja strcmp.
Ei onnistu tuolla:
#include <iostream> using namespace std; int main() { char tanaan; char huomenna; cout << "Mikä päivä tänään on? "; cin >> tanaan; if (tanaan=="maanantai") { huomenna="tiistai"; } cout << huomenna; cin.get(); return 0; }
E: Ja tässä vielä ohimenne kysäisen mikä "end1;" on? Kun yksi kirja tunkee sen kaikkien cout lauseiden perään (no ei ihan kaikkien.. läheskään)... ei muuten mutta ei mene läpi sen kanssa, otan sen pois niin sitten toimii.
char on vain yhden merkin kokoinen, eli siihen ei voi laittaa merkkijonoa. Putkan
c-oppaassa on tästä. Metabolixen viesti yllä kertoo lisää...
Edit:Säätöä
EditEdit: Tuossa edellisessä viestissä pääs käymään kömmähdys.
Nimesin ensin taulukon Taulukko[7]; mutta muutin mieleni ja muutin sen
nimeksi VkPaivat[7]; Unohtu vaan muuttaa noi sijoituksetki.
Eli näin sen pitäisi olla
string VkPaivat[7]; VkPaivat[0]="Maanantai"; VkPaivat[1]="Tiistai"; //Kaikkia alkiot läpi
Ja käyttäisit kooditageja, saa paremmin selvää
Edit3: endl tarkoittaa rivinvaihtoa
cout<<"Rivi1"<<endl<<"Rivi2"<<endl; cout<<"Rivi3"; /*Tulostaa Rivi1 Rivi2 Rivi3 */
Voit myös käyttää \n tekstin seassa esim.
cout<<"Rivi1 \nRivi2 \nRivi3";//Tulostaa saman kuin ylläoleva
Mikäs nyt on vialla?
#include <iostream> using namespace std; int main() { char tanaan; char huomenna; string paivat[7]; paivat[0]="Maanantai"; paivat[1]="Tiistai"; paivat[2]="Keskiviikko"; paivat[3]="Torstai"; paivat[4]="Perjantai"; paivat[5]="Lauantai"; paivat[6]="Sunnuntai"; cout << "Mikä päivä tänään on?"; cin >> paivat; int paivat; paivat = 1; cout << "Tänaan on siis" << paivat; cout << "ja huomenna on " << paivat[paivat + 1] "\n"; cin.get(); cin.get(); return 0; }
Nopsasti katottuna
#include <iostream> //Puuttuu kirjasto <string> jossa toi string tyyppi on using namespace std; int main() { // char tanaan; näitä et tarvi ku et käytäkkään // char huomenna; string paivat[7]; paivat[0]="Maanantai"; paivat[1]="Tiistai"; paivat[2]="Keskiviikko"; paivat[3]="Torstai"; paivat[4]="Perjantai"; paivat[5]="Lauantai"; paivat[6]="Sunnuntai"; cout << "Mikä päivä tänään on?"; cin >> paivat; /*tässä yrität kirjoittaa käyttäjän syötteen paivat taulukon osoitteeksi muistissa jos olen väärässä niin saa oikaista.*/ int paivat; //sinulla on jo muuttuja nimeltä paivat, nimittäin toi string paivat //tässävaiheessa on jo kaksi samanimistä muuttujaa joten hankala neuvoa paivat = 1; cout << "Tänaan on siis" << paivat; cout << "ja huomenna on " << paivat[paivat + 1] "\n";// puuttuu << paivat[paivat + 1] ja "\n" välistä cin.get(); cin.get(); return 0; }
Ja jotta voit käyttää tuota paivat taulukkoa sinun tulee muuntaa käyttäjän syöttämä päivä numeroksi
ja sitä numeroa käyttää indexinä taulukon käytössä.
Mutta oikeestaan suosittelisin sua kertaamaan oppaasi ja opetteleen asian kerrallaan, ei norsuakaan kannata kerralla syödä ja sulatella vaan pienissä paloissa kuten joku joskus jossain täällä putkassa totesi.
No en saa toimimaan.
E: No tän hitaampaa en voi edetä; Olen "ohjelmoinut" viisi vuotta ja tässä ollaan. Noin karkeasti otettuna.
E2: Herjaa jotain tosta cin << paivat; mutta pitäähän jotenkin saada tietoon se mistä päivästä halutaan seuraava...
#include <iostream> #include <string> using namespace std; int main() { string paivat[7]; paivat[0]="Maanantai"; paivat[1]="Tiistai"; paivat[2]="Keskiviikko"; paivat[3]="Torstai"; paivat[4]="Perjantai"; paivat[5]="Lauantai"; paivat[6]="Sunnuntai"; cout << "Mikä päivä tänään on?"; cin >> paivat; paivat = 1; cout << "Tänaan on siis" << paivat; cout << "ja huomenna on " << paivat[paivat + 1] << "\n"; cin.get(); cin.get(); return 0; }
Ongelmasi on siinä, että sinulla on stringitaulukko paivat, ja yrität tämän taulukon arvoksi laittaa cinillä saadun syötteen. Käytä siis jotain erillistä muuttujaa, eli tyyliin
string paivat[7]; // --- int p; cin >> p; cout << "Tänään on " << paivat[p]; cout << " ja huomenna on " << paivat[p+1] << "\n";
Eli siis tässä cinillä kysytään viikonpäivän numero 0-6, tosin kutosella mennään taulukon yli, eli tähän pitäisi tehdä tarkistus.
Edit. nopein! \o/
Johtuu siitä, ettei cin-olio osaa lukea << :lla string-taulukkoa (joka tuo 'paivat' siis on). Tässä hommassa pitää käyttää kahta muuttujaa (tuo taulukko, ja int johon otat päivän järjstysnumeron.
strig paivat[7]; paivat[0]="maanantai"; // ... jne jne paivat[6]="sunnuntai"; /* Enää ei saa käyttää paivat-nimeä muuttujalle (käytössä). */ int mikapaiva = 0; cin >> mikapaiva; cout << paivat[mikapaiva] << endl;
Tuon pitäisi periaatteessa auttaa eteenpäin.
Edit: damn, 15 sek myöhässä -_-
Edit2: heh, 3 vastausta alle minuuttiin =P
Sinä käytät edelleen samaa 'paivat'-nimistä muuttujaa kolmeen eri tarkoitukseen ja lopputuloksena on koodi, jossa ei ole mitään järkeä.
1. Tee toinen (_toisen niminen_) muuttuja johon otat käyttäjän syötteen.
2. Etsi vertailemalla käyttäjän syötettä ja paivat taulukkoa, minkä päivän käyttäjä valitsi.
3. Tee mahdollisesti kolmas muuttuja (edelleen toisen niminen kuin kaksi edellistä), johon talletat löydetyn päivän numeron.
4. Lisää päivän numeroa yhdellä ja jos se 7, muuta se nollaksi.
Kokeile, jos näillä neuvoilla pääsisi eteenpäin.
Edit: Olinpas hidas :)
Jaa niin nyt tajusin.... ainakin luulen niin.
Noh nyt se silti sulkee ikkunan heti, kun olen kirjoittanut, mikä päivä tänää on. Olen koittanut tunkea cin.getiä joka paikkaan mutta ei auta x)
#include <iostream> #include <string> using namespace std; int main() { string paivat[7]; paivat[0]="maanantai"; paivat[1]="tiistai"; paivat[2]="keskiviikko"; paivat[3]="torstai"; paivat[4]="perjantai"; paivat[5]="lauantai"; paivat[6]="sunnuntai"; int tanaan = 0; cout << "Mikä päivä tänään on? "; cin >> tanaan; cout << "\nHuomenna on "; cout << paivat[tanaan] << "\n"; cin.get(); cin.get(); return 0; }
Okkei. Se näyttää nyt, että aina seuraava päivä on maanantai, niinkuin vähän arvelinkin. Tuolle "tanaan" muuttujaanhan annetaan arvoksi nolla. Sanokaas nyt gurut mitenkä tuo tehdään oikein.
Annanpa vinkin: Olet määrittänyt tanaan-muuuttujan kokonaislukuarvoiseksi. Vaihdapa se merkkijonoksi. Nyt voit määritellä kokonaislukumuuttujan paivanro, joka on 0 kun tanaan-muuttujan arvo on "maanantai", 1 jos tiistai jne. Nyt huomisen päivät numero on (paivanro+1)%7, joten mitä tapahtuukaan jos tulostat paivat[(paivanro+1)%7]?
Ensinnäkin: millä määritellää merkkijono, jo char ei käy. Tuolla oppaassa ainakin sanottiin vaan charista. Ja mitä tuo %7 tekee tuolla? ja muutenkin.. ei toimi tuo pätkä... Minun olisi paljon helpompi katsoa mikä on pielessä, jos korjaisitte tuon tekemäni - näköjään virheellisen - pohjan.
char = merkki, string = merkkijono, % tarkoittaa jakojäännöstä (mahdollistaa su -> ma -operaation)
Ensinnäkin, char ei ole merkkijono, se on merkki. char-taulukkoa voi jo kutsua merkkijonoksi. string on C++:n merkkijonoluokka. Jos siis käytät C++:ssaa (cout ja cin), niin käytä myös stringiä.
Kaikkia periaatteita vastaan laitan nyt valmista koodia:
int main(void) { string paivat[7] = { "maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai", "sunnuntai" }; string tanaan; bool valmis = false; // Toistetaan, kunnes ollaan valmiita while (!valmis) { // Kysytään. (Windowsissa kiva efekti, muualla ei varmaan toimi...) cout << "Nyt on _____________\rNyt on _"; cin >> tanaan; // Käydään kaikki 7 päivää läpi for (int i = 0; i < 7; i++) { // Tärppääkö? if (paivat[i] == tanaan) { // Tulostetaan vastaus cout << "Jos nyt on " << paivat[i] << " niin huomenna on " << paivat[(i+1) % 7] << ".\n"; // Merkitään, että ollaan valmiita valmis = true; // Mennään pois for-silmukasta break; } } // Jos mitään ei löytynyt, tulostetaan huomautus if (!valmis) cout << "Tuo ei kelpaa. Uusi yritys.\n"; } return 0; }
Keskityn vielä tohon omaan koodiini ja koitan todella saada sen toimimaan, mutta en älyä mikä vielä on pielessä. Muutin tanaan muuttujan stringiksi.. mitä vielä?
#include <iostream> #include <string> using namespace std; int main() { string paivat[7]; paivat[0]="maanantai"; paivat[1]="tiistai"; paivat[2]="keskiviikko"; paivat[3]="torstai"; paivat[4]="perjantai"; paivat[5]="lauantai"; paivat[6]="sunnuntai"; string tanaan = 0; cout << "Mikä päivä tänään on? "; cin >> tanaan; cout << "\nHuomenna on "; cout << (paivat+1)%7 cin.get(); cin.get(); return 0; }
Okei, okei, aloitan lukemaan opasta uudestaan, mutta silti...
Edit: Tuo koodi näyttää kyllä epäillyttävän lyhyltä...
Lue nyt edes kääntäjän virheet. Mikä järki tässä on: (paivat+1)%7 Ethän edes käytä siinä kysyttyä tietoa.
Ota kynä ja paperia ja kirjoita vaihe kerrallaan, mitä ohjelman pitäisi tehdä. Tarkempi parempi. Kirjoita myös koodiin kommentteja, vaikka joka rivin eteen, mitä niiden on tarkoitus tehdä.
Tällä hetkellä aikaansaannoksesi näyttävät siltä, että olet vain heittänyt mitä sattuu muuttujia vähän sinne tänne. Ei millään pahalla.
Voi ****. Teen just niinkun täällä neuvotaan. Koitin itse ennen tätä ja kun omat neuvot loppuivat, tulen tänne kysymään...
Edit: Noi virheet mitä tuo antaa on kyllä ihan hatusta vedettyjä. Nyt se valittaa esim tota cin.get(); tuolla lopussa vaikka se ei liity olennaisesti minnekkään, joten en jaksa kiinnittää niihin huomiota.
Edit2: Eli jos nyt vaan voisitte sanoa, mitä korjaan tuohon.
Edit3: Se itse ongelma on tässä: miten saan tanaan muuttujan jotenkin lonkattua paivat hommeliin, niin että siitä olis sitten helppo vaan lisäillä 1... vaikea selittää.
Laita se puuttuva puolipiste tuon jakojäännösrivin perään.
Lue tuo minun esimerkkini ajatuksella. Siinä on kaikki tarvittava ja oikein kommentitkin.
Ja "tehnyt juuri kuten sanotaan" ei oikein päde. Kun tuolta lukee aiemmat neuvot, joissa on hyvin selkeästi neuvottu, ja katsoo koodiasi, niin alle puolet vinkeistä on päässyt sinne asti.
Vaikkapa tämä:
Jaska kirjoitti:
Nyt voit määritellä kokonaislukumuuttujan paivanro, joka on 0 kun tanaan-muuttujan arvo on "maanantai", 1 jos tiistai jne. Nyt huomisen päivät numero on (paivanro+1)%7, joten mitä tapahtuukaan jos tulostat paivat[(paivanro+1)%7]?
Luetaan luetaan.. mutta sitä ennen:
sillain kyllä osaan tehdä, että käyttäjä syöttää numeron, joka vastaa jotain päivää (0 = ma, 1 = ti jne...) ja sitten se tulostaa mikä päivä huomenna on... eli lue itse se minun ongelma (edit3).
Edit: Enkös juuri tehnyt noin miten Jaska kirjoitti?... otin sen kyllä pois kun ei toiminut...
Metabolixin koodissahan se on ihan suoraan, eli siihen päivän kysymisen jälkeen vaikka:
for (int i=0; i<7; i++) { if (tanaan == paivat[i]) { cout << "Huomenna on " << paivat[(i+1)%7]; } }
i = o... ?, mikä i....
tiedäthän... en halua kirjoittaa koodia, mitä en itsekkään ymmärrä. Saisin tuon onnistumaan jos vaan saisin yhteen pikkiriikkiseen ongelmaan ratkaisun: Pitäisi lisätä (muka) merkkijonomuuttujaan 1 (huomenna = tanaan + 1) eli miten tuo onnistuu, kun tanaan on merkkijono...
Edit:
#include <iostream> // syöttö ja tulostus toiminnot ohjelman käyttöön #include <string> // käytetään stringiä using namespace std; // ohjauskäsky int main() // pääfunktio alkaa... { // funktion lohkon aloittava aaltosulku string paivat[7]; // taulukko... paivat[0]="maanantai"; // maanantai = 0 paivat[1]="tiistai"; // tiistai = 1 paivat[2]="keskiviikko"; // keskiviikko = 2 paivat[3]="torstai"; // torstai = 3 paivat[4]="perjantai"; // perjantai = 4 paivat[5]="lauantai"; // lauantai = 5 paivat[6]="sunnuntai"; // sunnuntai = 6 string tanaan; // määritellään merkkijonomuuttuja tanaan string huomenna; // määritellään merkkijonomuuttuja huomenna cout << "Mikä päivä tänään on? "; // käyttäjälle tulostetaan kysymys nykyisestä päivästä cin >> tanaan; // käyttäjä kirjoittaa nykyisen päivän muuttujaan tanaan for (int i=0; i<7; i++) { if (tanaan == paivat[i]) { cout << "Huomenna on " << paivat[(i+1)%7]; } } cin.get(); cin.get(); return 0; }
Homma onnistui tuolla koodilla (eikä kommentoinnissakaan pitäisi olla puutteita), mutta jos joku vois viellä kommentoida nuo for osan, kun se oli vaan suora kopio enkä tajua siitä kaikkea...
Kokonaislukumuuttujaan i sijoitetaan 0 (ei o). Sitä käytetään for-silmukassa, joka kasvattaa sen arvoa aina yhdellä, kunnes i<7 eli 6. i-muuttujan avulla haetaan paivat-stringtaulukosta kyseisen päivän nimi, ja jos se on sama kuin käyttäjän antama päivä, tulostetaan siitä seuraava päivä eli paivat[i+1]. Paivat-taulukosta haetaan siis merkkijono muuttujalla aivan samalla tavalla kuin vakionumerolla. Paljon yksinkertaisemmin en osaa selittää. :)
Kiitos.. en ole ennen tiennyt tota i juttua. Tai itseasiassa olen aina ihmetellyt mitä se tarkoittaa. Hmm... i avaa uusia ovia...
For-silmukka on varsin yksinkertainen. Alussa i=0. huomataan, että i<7. Jos tanaan on sama päivä kuin päivät-taulukon indeksissä i oleva alkio, tulostetaan huominen päivä. Muutoin laskurin arvo kasvaa ja aletaan suorittamaan sulmukkaa uudelleen.
Kun i=7, hypätään silmukasta pois. Lauseke (i+1)%7 tarkoittaa, että laskuria i kasvatetaan yhdellä ja otetaan jakojäännös modulo 7. Vieläkö ongelmia?
Noh, jos huomaatte kommentoinnissa jotain hämärää, niin sitten on (ongelmia).
#include <iostream> // syöttö ja tulostus toiminnot ohjelman käyttöön #include <string> // käytetään stringiä using namespace std; // ohjauskäsky int main() // pääfunktio alkaa... { // funktion lohkon aloittava aaltosulku string paivat[7]; // taulukko... paivat[0]="maanantai"; // maanantai = 0 paivat[1]="tiistai"; // tiistai = 1 paivat[2]="keskiviikko"; // keskiviikko = 2 paivat[3]="torstai"; // torstai = 3 paivat[4]="perjantai"; // perjantai = 4 paivat[5]="lauantai"; // lauantai = 5 paivat[6]="sunnuntai"; // sunnuntai = 6 string tanaan; // määritellään merkkijonomuuttuja tanaan cout << "Mikä päivä tänään on? "; // käyttäjälle tulostetaan kysymys nykyisestä päivästä cin >> tanaan; // käyttäjä kirjoittaa nykyisen päivän muuttujaan tanaan for (int i = 0; i < 7; i = i + 1) // silmukka pyörii 0 - 7 välillä (ma - su), laskuriin lisätään 1 { // silmukan lohkon aloittava aaltosulku if (tanaan == paivat[i]) // jos tänään -muuttuja on joku päivät -taulukon päivistä niin... { // iffin lohkon aloittava aaltosulku cout << "Huomenna on " << paivat[(i + 1)%7]; // tulostaa teksitä ja; silmukasta pois, jätetään jakojäännös johon lisätään 1 } // iffin lohkon lopettava aaltosulku } // silmukan lopettava aaltosulku cin.get(); // ohjelma pysähtyy suorituksen jälkeen ja jää odottamaan ENTERin painallusta cin.get(); return 0; // main() funktion lopettava lause } // funktion lohkon lopettava aaltosulku
Tiedän kyllä, että kommentoinnit on liijoiteltuja ;) mutta epäselvyyksiä ei ainakaan pitäisi olla.
Edit: poistin huomenna määrittelyn, kun eihän sitä tarvita...
Nyt näyttää jo paljon paremmalta. Ihan jokaista aaltosulkua nyt ei tarvitse välttämättä kommentoida :)
Välillä 0-6 tietenkin eikä 0-7, ja ei pelkästään "joku päivät-taulukon päivistä" vaan juuri se laskurin sillä hetkellä osoittama, jos nyt ihan pilkunviilaukseen mennään.
Siitä se lähtee :)
Mitenkähän nuo ääkköset saisi korjattua. Vai täytyiskö kirjoittaa englanniksi... en halua mitaan mika paiva tanaan on.
Edit: Näköjään aika tehokkaasti linkitetty noita ristiin jo :) Laitetaan sitten tänne ihan vastauskin:
lainaus:
Ääkköset pitää yleensä korvata vastaavilla escape-merkinnöillä:
å = \x86
ä = \x84
ö = \x94
Å = \x8f
Ä = \x8e
Ö = \x99
x:n eteen nolla (eli \x => \ox), jos ei meinaa toimia. Käyttö:
"T\x84ss\x84 lukee \x99rvel\x99!"
(eli "Tässä lukee ÖRVELÖ!")
Juuh, toimiihan se nyt.
Helpommalla pääsee kun tallentaa sen sorsafilun "oikealla" merkkikoodauksella. Windowsin konsoli-ikkuna ymmärtää oletuksena kaiketi MS-DOS -koodisivu 437:ää, joten kun tallentaa tiedostot tuolla merkkikoodauksella näkyvät ääkköset oikein ihan ilman eskapetuksia. Vimissä :set fenc=cp437
Aihe on jo aika vanha, joten et voi enää vastata siihen.