Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Kaksi riivattua kysymystä C++:sta

ankzilla [23.11.2009 22:54:49]

#

Olen 2 viikkoa pähkäillyt näitä, ja nyt murruin.

1. Olen kokeillut seuraavaa ehtolausetta vaikka kuinka monessa muodossa, mutta se ei vain kerta kaikkiaan mene läpi:

if(chars[i - 97] == text.substr(-1, 1) || chars_caps[i - 97] == text.substr(-1, 1))
    SDL_Delay(50);

Elikkäs tein funktion, joka kirjoittaa muuttujaan tekstiä näppäimien painalluksesta.
Rumasti laitoin kirjaimet a-z chars-taulukkoon ja A-Z chars_caps-taulukkoon.
Joten ylläoleva koodi tarkistaa, onko viimeiseksi kirjoitettu kirjain sama kuin mitä nyt ollaan kirjoittamassa. -Jos on, niin odotetaan eeettttttteeeeeeiiiiii tulisi tuollaista tekstiä.

2. Oikeastaan en viitsi edes koodia tähän laittaa, koska en osaa selittää sitä. ^^
Sellainen kysymys vain olisi, että onko olemassa opassivua, missä kerrotaan suomeksi substr:stä, erasesta, jne. hyvin yksityiskohtaisesti, ettei minunlaiselleni urpolle jää mitään epäselväksi.
-Tätä pyydän vain, koska olen varmaan kuluttanu puolet C++-manuaalisivun manuskasta ymmärtämättä sen kaikkea tietoa.

Ja olen sitten ihan tosissani pari viikkoa pohtinut tuota ykköstä, ettette vain saisi sellaista käsitystä että ekan errorin jälkeen heti tänne ryntään. :D

Metabolix [23.11.2009 23:01:05]

#

1. Kannattaisi pelkän pohtimisen lisäksi katsoa, miten substr-funktio toimii. Ensimmäinen parametri on etumerkitön, joten -1 tuottaa muunnoksessa suurimman mahdollisen luvun. Olisit voinut myös ohjelman tulosteesta todeta, että tuloksena on std::out_of_range-tyyppinen poikkeus, mistä tiedätkin heti, että parametrit eivät ole sallitulla lukuvälillä.

terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::substr
Aborted

2. Funktioita tuskin on kovin hyvin suomeksi listattu, mutta http://www.cplusplus.com/reference/ ja http://www.cppreference.com/wiki/ sisältävät minusta varsin ymmärrettävät selitykset englanniksi. Useimmissa funktioissa ei ole yhtään mitään ihmeellistä. (Tarkoitus olisi joskus kirjoittaa noista Ohjelmointiputkaan, mutta on aika paljon tärkeämpääkin tekemistä.)

ankzilla [24.11.2009 15:46:41]

#

Metabolix kirjoitti:

1. Kannattaisi pelkän pohtimisen lisäksi katsoa, miten substr-funktio toimii. Ensimmäinen parametri on etumerkitön, joten -1 tuottaa muunnoksessa suurimman mahdollisen luvun. Olisit voinut myös ohjelman tulosteesta todeta, että tuloksena on std::out_of_range-tyyppinen poikkeus, mistä tiedätkin heti, että parametrit eivät ole sallitulla lukuvälillä.

terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::substr
Aborted

Kiitos. :)
Mutta, kuten sanoin, olen kokeillut tuota vaikka kuinka monessa muodossa, eli tällainenkaan viritys ei toimi:

text.substr(text.length() - 1, 1)

Metabolix kirjoitti:

2. Funktioita tuskin on kovin hyvin suomeksi listattu, mutta http://www.cplusplus.com/reference/ ja http://www.cppreference.com/wiki/ sisältävät minusta varsin ymmärrettävät selitykset englanniksi. Useimmissa funktioissa ei ole yhtään mitään ihmeellistä. (Tarkoitus olisi joskus kirjoittaa noista Ohjelmointiputkaan, mutta on aika paljon tärkeämpääkin tekemistä.)

Juu, juuri tuota referenceä olen selannut kuten mainitsin.
Ja vaikka olenkin kohtuullinen englannissa omasta mielestäni, sanoja menee sieltä täältä yli hilseen, eikä sanakirjat auta.

Joten tuohon ykköseen...
Näinkin nyypän kysymyksen joudun esittämään, että miten asetetaan muuttujan arvoksi toisen muuttujan viimeinen kirjain, kun tuo ylempi härpäkekkään ei toimi? :D
-Olen ihan tosissani kokeillut vaikka mitä tähän, mutta ei. :/

Kiitos. :)

Edit: Korjasin ajatukisssani kirjoittaneeni koodinpätkän.

os [24.11.2009 15:55:17]

#

Viimeinen kirjain on tyyppiä char, mutta substr-metodi palauttaa std::string-olion.

char c;
std::string mjono = "asdfg";

// Kaikki seuraavat asettavat c:hen mjono:n viimeisen kirjaimen
c = mjono[mjono.length()-1];
c = mjono.at(mjono.length()-1);
c = *--mjono.end();
c = mjono.substr(mjono.length()-1,1)[0];

ankzilla [24.11.2009 16:13:27]

#

Kiitos, os! :)

Tuo viimeinen näyttää ainoalta minkä suurimmaksi osaksi ymmärrän, mutta mitäs tuo lihavoitu osa tuossa tarkoittaa:
c = mjono.substr(mjono.length()-1,1)[0];

Mut pitääpä kokeilla... :)

Edit: Nyt sain toimimaan! Jeah! *mahtava fiilis* Kiitos Metabolix ja os! :D

tsuriga [24.11.2009 16:26:57]

#

Merkkijonot ovat merkkitaulukoita, joten tuossa [0] viittaa (substr-metodilta saadun) merkkijonon ensimmäiseen kirjaimeen. Ensimmäisessä vaihtoehdossa taasen viitataan suoraan (alkuperäisen) merkkijonon viimeiseen kirjaimeen.

Vastaus

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

Tietoa sivustosta