Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Leetspeak asiaa taas

Azure [12.02.2006 17:15:17]

#

Aloitin taas vähän ohjelmoimaan, joten voisko joku neuvoa tästä koodista eteen päin?

#include <iostream>
using namespace std;

int main(void)

{
char taulukko[10];
cout << "Ole hyvä ja kirjoita!" << endl;
cin >> 'taulukko';
 if (taulukko = 'a') cout << "4";
 if (taulukko = 'l') cout << "1";
 if (taulukko = 'i') cout << "1";
}

Ohjelman on luettava jotenkin kentään syötetyt kirjaimet yksitellen ja tulostaa sitten ne määrätyinä arvoina. Eli jos kirjoitan ali niin se tulostaa 411 tai jos kirjoitan lalala niin se tulostaa 141414.

Olkaa hyviä ja älkää muuttako koodia kokonaan jos ei ole pakko.

Heikki [12.02.2006 18:14:59]

#

Ensinnäkin kannattaa käyttää C++:n stringejä jolloin ei tarvitse miettiä siitä kuinka pitkiä viestejä käsitellään:

#include <iostream>
#include <string>
using namespace std;

int main() {
 string teksti;
 cin >> teksti;
}

Sitten voit käydä jokaisen merkkijonon merkin läpi silmukalla:

for (int i=0; i<teksti.length(); i++) {
 // i:s kirjain on teksti[i]
}

teksti.length() palauttaa siis merkkijonon pituuden ja teksti[i] on i:s merkki. Sitten voit tämän merkin perustelella tulostaa mitä haluat.

Edit. Lisäksi koodissasi on sellainen virhe, että sinulla on merkkitaulukko (char taulukko[10]) ja sitten katsot esim. onko taulukko sama kuin merkki a. Ja sitähän se ei tietenkään ole, vaan yksi taulukon solu saattaa olla a (taulukko on itse asiassa vain osoitin tiettyyn kohtaan muistia).

os [12.02.2006 18:57:17]

#

Heikki kirjoitti:

Ensinnäkin kannattaa käyttää C++:n stringejä...

Ei kannata käyttää mitään C++:n hienouksia, kuten stringejä tai vectoreita ennen, kun ymmärtää, miten ne toimivat - varsinkin, jos on ongelmia muistikäsittelyn kanssa. Sen sijaan C++:n virtojen toimintaan kannattaa tutustua hieman tarkemmin:

#include <iostream>
using namespace std;

int main() {
  int c;
  do {
   c = cin.get();
   switch(c) {
    case 'a': cout << '4'; break;
    case 'i': cout << '1'; break;
    default: cout << (char)c; break;
   }
  } while(c!='\n');
  return 0;
}

Muistia ei siis tarvitse välttämättä varata ollenkaan.

kooderi [12.02.2006 20:33:01]

#

Ja sitten vielä jos välttämättä haluat ottaa syötettä charritaulukkoon, laita sille sen verran reilusti kokoa ettei heti tarvitse pelätä ylivuotoa. Kirjoittamassasi esimerkissä taulukko voisi olla vähintään sen 255 merkkiä, siihen voi runoilla jo ihan jonkin verran huoletta.

Metabolix [12.02.2006 20:57:00]

#

Kaikkein paras asia voisi olla taas Putkan C-oppaan lukeminen, kun koodissa ei ole tälläkään kertaa liiaksi järkeä syntaksin puolesta (vaikkakin se on jo hieman parempi kuin aiemmilla kerroilla, kun Azure on jotakin C:llä tehnyt).

Vastaus

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

Tietoa sivustosta