C++ kysymys

    • Ropomen
      Ropomen
      Bronze
      Joined: 06.06.2008 Posts: 809
      Terve. Tarviisin vähän apua erään c++ harkkatyön kanssa. Tarkotuksena tehä eräänlainen tietokilpailu.

      Ongelmana on se, että ohjelman pitäs toimia niin, että tulee 3 vihjettä(viiden-,kolmen- ja yhden pisteen) Jos syöttää oikean vastauksen, saa pisteitä sen verran, mitä vihje sallii ja hypätään seuraavaan kysymykseen. Jos syöttää väärän vastauksen, tulostetaan"väärin. sait 0 pistettä" ja hypätään seuraavaan kysymykseen.


      Sitten se probleema, jos käyttäjä laittaa vastaukseksi pelkkiä isspace merkkejä(esim välilyöntejä) ja painaa sitten entteriä, niin ohjelman tulisi tulkita se tyhjäksi riviksi ja antaa seuraava vihje.

      En millään käsitä, että mitenkä saan laitettua if:in ehtoihin sen, että jos rivi sisältää pelkkiä isspace merkkejä, eli jos joku osaa neuvoo, että miten sen ehdon teen, niin hyvä olis.

      Nyt oon yrittäny jotain tämmöstä, että se poistas käyttäjän antaman vastauksen edestä ja lopusta kaikki välilyönnit(ei siis mitään muita isspace merkkejä)

      string vastaus;
      getline(cin,vastaus);
      remove(vastaus.begin(),vastaus.end(),' ');

      Tässäkin vaan jokin kusee, koska nyt jos syöttää vaikka 3 kysymykseen vastaukseksi 9-välilyöntiä ja sen jälkeen oikean vastauksen vesirokko(9 kirjainta), niin se muuttaa käyttäjän antaman vastauksen tähän muotoon: vesirokkovesirokko.


      Eli jos joku osaa, niin kiitollinen olisin, alkaa pikkuhiljaa omat kyvyt ja hermot loppua kesken.
  • 12 replies
    • poupou
      poupou
      Bronze
      Joined: 08.09.2007 Posts: 7,210
      Mulla ei oo C++sta kokemusta, mut kiinnostaa, että mikä tossa mättää.

      Jos sä iffillä vertaat annettua vastausta (esim " (tähän kasa välejä) ") oikeeseen vastaukseen niin eikös se nyt ole väärin, jollon ohjelma antaa seuraavan vihjeen? Vai onko C++ssa joku, että jos syötät pelkkiä välejä niin se pyytää kirjottamaan uusiks tms?
    • Ropomen
      Ropomen
      Bronze
      Joined: 06.06.2008 Posts: 809
      Siis ohjelman tulee toimia näin:

      Oletetaan vaikka, että kysymyksen oikea vastaus on "kettu"

      Viiden pisteen vihje:"blaa blaa blaa"

      käyttäjä syöttää vastauksen:"kettu"

      "Oikein, sait 5 pistettä"

      --> Seuraava kysymys.


      Käyttäjä syöttää vastauksen"naali"

      "Väärin. sait 0 pistettä"

      -->> Seuraava kysymys.

      Käyttäjä syöttää vastaukseksi pelkän entterin

      -->> Seuraava vihje.

      Käyttäjä syöttää vastaukseksi 834 välilyöntiä, jonka jälkeen enter

      -->> Seuraava vihje.

      Sitten vika kohta, jonka tulkitsin uudelleen luettuani työohjeen:

      Käyttäjä syöttää vastaukseksi 666 välilyöntiä, jonka jälkeen "kettu"

      "Väärin. sait 0 pistettä"

      --> seuraava kysymys

      Tuo viimenen nyt poikkeaa siitä, minkä ekassa viestissä sanoin, mutta kuitenkin.

      Ongelma on siis se, että en saa toimimaan tuota käyttäjä syöttää 555 välilyöntiä, jonka jälkeen entter. Eli ohjelman pitäs antaa seuraava vihje, mutta mulla se tulostaa "väärin sait 0 pistettä"

      -Tikkari vähän editoi "typoja"
    • poupou
      poupou
      Bronze
      Joined: 08.09.2007 Posts: 7,210
      Tai sit vaihtoehtosesti heittää sen vastauksen jonkun tämmösen läpi?
      code:
      int valit(String vastaus) {
            if (vastaus == null) {
                return false;
            }
      
            int pituus = vastaus.length();
            for (int i = 0; i < pituus; i++) {
                if ((Character.isWhitespace(vastaus.charAt(i)) == false)) {
                    return false;
                }
            }
            return true;
      }

      Ja jos se palauttaa true niin annetaan seuraava vihje. Tai sit kääntää noi ja false on faillll. (En siis edelleenkään Ceetä osaa koodata, et korjaa accordingly :D )
    • poupou
      poupou
      Bronze
      Joined: 08.09.2007 Posts: 7,210
      Eli siis enttereillä ja väleillä tulee seuraava vihje, mutta väärällä vastauksella se loppuu. No pystyykö tommosen ulkosen funktion kautta tsekkaa et jos ei oo kirjaimia, niin anna uus vihje, ja jos on kirjaimia, tsekkaa onko se oikein?

      Onhan se aika kiertämistä, mut ei sen turhan hankalaa pitäs olla? :f_confused:

      edit: Eli, että siinä kohtaa kun vastaaja syöttää vastauksen, heitetään se ensin tommosen läpi, mikä tsekkaa onko siinä kirjaimii ollenkaan. (Aka "lisää vihjeitä? -funktio) Jos tää palauttaa false, eli siellä on kirjaimia, niin sit heitetään se tsekkaamaan, että menikö se oikein vai väärin.
    • Ropomen
      Ropomen
      Bronze
      Joined: 06.06.2008 Posts: 809
      Oon kokeillu jo vähän kaikkee, eikä meikä tietotaido vaan riitä tuon ratkasemiseen(eka kurssi ohjelmointia menossa)


      Nii tosiaan ja sen pitäs jotenkin ignorata muutkin "tyhjät" merkit. Ei pelkkiä välilyöntejä. Noita ilmeisesti on muitakin, mutta ei vaan tuu nyt mieleen. :D



      edit. Toi sun juttu muuten ehkä onnistus multa, mutta en tiiä mitenkä saan sen chekkaamaan, että onko siellä kirjaimia vai ei.
    • poupou
      poupou
      Bronze
      Joined: 08.09.2007 Posts: 7,210
      Tän mukaan



      ton komennon pitäs kattoo muutkin kun speissit.

      edit: eli ignore toi aiempi isWhitespace tms. (en oo ikinä tehny mitään ceellä :D )
    • ruotsalainen
      ruotsalainen
      Bronze
      Joined: 02.12.2007 Posts: 939
      Olen koodannut c:tä (tai c++) viimeksi 20 v sitten, en muista enää ko. kielen yksityiskohtia...

      Nykyään jos teen jotain sellaista mihin mulla ei ole manuaalia (tai vaikka oliskin manuaali), laitan sopivat hakusanat googleen, yleensä vastaus löytyy tämäntyyppisiin kysymyksiin aika nopeasti kun katsot joitain kiinnostavia hakutuloksia.

      googleta esim:

      c++ remove spaces
      tai
      c++ trim spaces

      Hakutuloksista löytyy aina monenlaisia valmiita esimerkkejä.
    • Ropomen
      Ropomen
      Bronze
      Joined: 06.06.2008 Posts: 809
      Olen koodannut c:tä (tai c++) viimeksi 20 v sitten, en muista enää ko. kielen yksityiskohtia... Nykyään jos teen jotain sellaista mihin mulla ei ole manuaalia (tai vaikka oliskin manuaali), laitan sopivat hakusanat googleen, yleensä vastaus löytyy tämäntyyppisiin kysymyksiin aika nopeasti kun katsot joitain kiinnostavia hakutuloksia. googleta esim: c++ remove spaces tai c++ trim spaces Hakutuloksista löytyy aina monenlaisia valmiita esimerkkejä.




      Kokeiltu on, mutta en löytäny ainakaan muutamista ensimmäisistä semmosia esimerkkejä, joita olisin ite osannu käyttää(Tiedetään, olen aika käsi vielä tässä touhussa) :D
    • mcine
      mcine
      Gold
      Joined: 02.01.2008 Posts: 173
      Voithan aina tarkistaa toisinpäin, että onko kirjaimia ja numeroita vastauksessa. Jos on, niin vastaus hyväksytään, jos ei niin vastausrivityhjennetään ?

      Pikagooglella löyty tämmönen funktio joka tekee juuri tuon: http://www.cprogramming.com/fod/isalnum.html

      Tällöin siis kaikki kummalliset merkit ignorataan ..
    • ruotsalainen
      ruotsalainen
      Bronze
      Joined: 02.12.2007 Posts: 939
      Googlettelin ja löysin tällaisen esimerkin, jota hiukan täydensin itse (jos syntaksissa on virheitä, korjaa tarpeen mukaan ;) ).

      Voi olla että ei toimi täysin suoraan (kun mulla ei ole c-kääntäjää, en pystynyt kokeilemaan).

      Esimerkissä tutkittava merkkijono on viety line[] nimiseen taulukkoon. For silmukassa tutkitaan onko taulukossa (eli merkkijonossa) välilyöntejä ja lasketaan niiden lkm ('\0' lienee enter/merkkijonon päättymismerkki c++:n merkkijonossa?). Lopuksi tutkitaan oliko välilyöntejä yhtä paljon kuin koko merkkijonossa merkkejä.

      int main()
      {
      int i,tyhjia;
      tyhjia = 0;
      char line[] = "Tämä on tutkittava merkkijono";

      for( i = 0; line[i] != '\0'; i++ )
      {
      if( line[i] == ' ' )
      tyhjia++;
      }

      if (i == tyhjia) {
      cout << "Merkkijono oli tyhjä"
      }
      else {
      cout << "Merkkijono ei ollut tyhjä"
      }

      }
    • Wlore
      Wlore
      Bronze
      Joined: 22.06.2009 Posts: 1,579
      En ole myöskään koodannut C++ pitkään aikaan ja viime aikoina kovin vähän c#-lakaan.

      tekisin itse jotenkin seuraavasti

      Vastaus sijoitetaan muuttujaan enterillä.

      Muuttujasta trimmataan ensin isspace-merkit alusta ja lopusta pois.

      C# puolella löytyy oma käskynsä, jolla sttringistä voi trimmata pois merkit alusta ja lopusta. C++ puolella voi löytyä vastaava.

      Jos ei ole vastaavaa, niin metodi pitää rakentaa niin, että se käy jokaisen vastauksen merkin läpi ja joko poistaa "ei sallitut"-merkit stringistä tai siirtää sallitut merkit omaan muuttujaansa. Tässä pitää huomioida sanojen välissä olevat välilyönnit, jos sallitaan useamman sanan vastaus.

      Palautetaan muokattu/uusi stringi kutsujalle. Tässä kohtaa voidaan myös tarkistaa jäikö muokattuun stringgiin merkkejä vaiko eikö ja palauttaa null, jos merkkejä ei ole. Tämän voi tehdä myös vasta palautuksen jälkeenkin. Oleellista on kuitenkin ennen seuraavaa vertailua tarkistaa ettei merkki jono ole tyhjä.

      Sitten tarkistat muokatun/uuden stringin oikeaa vastausta vastaan ja toiminta jatkuu kuten pitää.


      Katso koodissa myös, että kun syötät muuttujaan tietoa, niin se ei lisää itseensä mitään.

      Olet voinut jossain koodin kohdassa lisätä muuttujaan muuttujan itsensä ja siksi muuttuja on jossain kohtaa muuttunut "vesirokosta" -> "vesirokkovesirokko" muotoon.

      Itse syntaksissa en osaa auttaa, kun en muista noita enää, mutta voin vastaavan kirjoittaa illalla C#:lla
    • mcine
      mcine
      Gold
      Joined: 02.01.2008 Posts: 173
      Tuo että käyt koko stringin läpi aina on vähän tehotonta ja turhan monimutkasta.
      Käy for-looppia läpi niin kauan kunnes löytyy joku muu kuin välilyönti ja lopeta siihen. Jos menee loppuun asti, niin on pelkkää välilyöntiä ..

      Sit jos haluat trimmata, niin voit käyttää samaa indexiä / pointteria siihen, että trimmaat alulla olevat välit pois.. kopsaamalla strcpy:llä (toivottavasti muistan oikeen) toiseen stringiin mikä on sittten vastaus ..Tarvittaessa saman trimmauksen tehdä loppuun käymällä vastausta läpi lopusta alkuun ja viimesen välilyönnin kohdalle pistää '\0', jollonka stringi loppuu ..

      Eiköhän se jotenkin tohon suuntaan mene ... c-koodauksesta aikaa kyllä reilusti, mutta periaate toimii ... ainakin teoriassa 8)