Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: C-kielellä vokaalien laskeminen

Sivun loppuun

Maajo [29.12.2004 21:46:35]

#

Haluan käyttää eräässä ohjelmassa laskua, joka laskee annetun sanan vokaalit (a,e,i,o,u,y,ä,ö). Miten se tehdään c-kielellä?

Koodini on tällä hetkellä tässä jamassa:

#include <stdio.h>

int main(void)
{

(char[] = "sana"; sana[1] == 'a';)

  int sana;

  printf("Ohjelma laskee vokaalien määrän.\n");

  printf("Anna sana:");

  scanf("%s",sana);

  printf("Sanassa vokaaleja %s:");

  }

  return 0;
}

Eli siis annetun sanan vokaalien määrä pitäisi saada laskettua, mutta miten?

Metabolix [29.12.2004 21:56:06]

#

Mikähän kumma tämä on olevinaan?

(char[] = "sana"; sana[1] == 'a';)

Kannattaa määritellä char-taulukosta riittävän iso ja jättää nuo muut viritelmät pois:

char[80] sana;

Ennen return-riviä oleva }-merkki on ylimääräinen.

Ensin luet sen sanan char-taulukkoon. Sen jälkeen käytät for-looppia:

int i, maara;

for (i = maara = 0; sana[i] != 0; i++)
  if (sana[i] == 'a' || sana[i] == 'e') maara++;

Tuo käy läpi koko sanan. ASCII-0 on char-taulukon tekstin lopetusmerkki, joten jatketaan siihen asti. Jos kirjain on 'a' tai 'e', lisätään muuttujaa maara.

Suosittelen jonkin oppaan lukemista, vaikkapa Putkan oman C-opassarjan.

Ja sitten jos (kun) å, ä ja ö tuottavat vaikeuksia, muistathan käyttää hakua vaikkapa sanoilla "miten ääkköset saa korjattua?", ettei tarvitse sitä taas selostaa.

Maajo [29.12.2004 22:58:01]

#

Tässä on tämänhetkinen saavutus:

#include <stdio.h>

int main(void)
{

  char sana[80];

  int i, maara;

  for (i = maara = 0;
  sana[i] != 0; i++)
  if (sana[i] == 'a' || sana[i] == 'e') maara++;

  printf("Ohjelma laskee vokaalien määriä.\n");

  printf("Anna sana:");

  scanf("%s",sana);

  printf("Sanassa vokaaleja:");

  return 0;
}

Vaikka kuinka etsin ja tutkin "oppaita", niin en tunnu löytävän mitään järkevää tai aiheeseen liittyvää. Oppaassa oli vähän saman tyylinen tehtävä, mutta ei ratkaisua... ? Millaisella koodilla vokaalit saa laskettua?

Metabolix [29.12.2004 23:05:10]

#

No juurihan annoin tuossa koodin kirjainten laskemiseen. Lisäät vain siihen muutkin vokaalit kuin a:n ja e:n ja laitat sen oikeaan paikkaan. 8( Kyllähän viestissäni lukee aivan selvästi: "Ensin luet sen sanan char-taulukkoon. Sen jälkeen...". Miten minä en näe koodissasi sanan lukemista ennen for-looppia?
Jos et vielä ymmärtänyt, muuttuja sana on se char-taulukko.
Jos et vielä ymmärtänyt, vokaalien määrä tulee muuttujaan maara.
Oppasta saat selville, miten sen voi tulostaa ruudulle tuon viimeisen printf-komennon avulla.

Hassua, että tungit vain koodinpätkäni tuonne väliin miettimättä yhtään, mitä se tekee, tai edes lukematta viestistäni kohtaa, jossa mainitaan, että se laskee a- ja e-kirjainten yhteismäärän.

Maajo [29.12.2004 23:20:11]

#

Miten lisään ne vokaalit sinne? En ymmärrä nyt ollenkaan... :(

Maajo [29.12.2004 23:25:03]

#

lainaus:

Hassua, että tungit vain koodinpätkäni tuonne väliin miettimättä yhtään, mitä se tekee, tai edes lukematta viestistäni kohtaa, jossa mainitaan, että se laskee a- ja e-kirjainten yhteismäärän.

No, kun en ymmärrä koko pätkää... :( Yritin kyllä sitä ymmärtää, mutta kun ei ymmärrä niin ei ymmärrä...

Antti Laaksonen [29.12.2004 23:39:45]

#

Ohjelma koostuu siis kolmesta vaiheesta:
1. Merkkijonon lukeminen
2. Vokaalien määrän laskeminen
3. Vokaalien määrän tulostaminen

Vokaalien määrä lasketaan niin, että merkkijonon kaikki kirjaimet käydään läpi yksi kerrallaan ja laskurimuuttujaa kasvatetaan kirjaimen ollessa vokaali. Tarvitset siis silmukan, jonka sisällä voidaan tutkia erikseen kutakin merkkiä. Merkkijono ajatellaan taulukkona, jonka viimeisen merkin jälkeen tulee nollamerkki. Yksinkertainen silmukan pohja tulee tässä:

i = 0;
while (sana[i] != 0) {
    i++;
}

Ehto on niin kauan tosi, kuin taulukon alkion sisältö ei ole nolla eli merkkijonon loppu. Ensin i:n arvo on 0, sitten 1, sitten 2 jne. kunnes merkkijono päättyy.

Tämän jälkeen tarvitaan enää koodi, joka tarkistaa, onko merkki vokaali, ja kasvattaa tarvittaessa laskuria. Tarkistuksen voi tehdä vaikkapa switch-lauseella. Jos tutkittava merkki on joku vokaaleista, muuttujan arvo kasvaa yhdellä. Muuten siirrytään vain tutkimaan seuraavaa merkkiä tekemättä mitään.

switch (sana[i]) {
    case 'a': case 'e': case 'i': case 'o': case 'u':
    case 'y': case 'å': case 'ä': case 'ö':
        vokaalit++;
}

Näistä palasista muodostuu toimiva ohjelma:

#include <stdio.h>

int main(void) {
    char sana[80];
    int i = 0, vokaalit = 0;

    printf("Kirjoita sana:");
    scanf("%s", sana);

    while (sana[i] != 0) {
        switch (sana[i]) {
            case 'a': case 'e': case 'i': case 'o': case 'u':
            case 'y': case 'å': case 'ä': case 'ö':
                vokaalit++;
        }
        i++;
    }

    printf("Vokaaleita: %i", vokaalit);

    return 0;
}

Metabolix [29.12.2004 23:42:34]

#

if (
     sana[i] == 'a' // Kun siinä on tällainen
  || sana[i] == 'e' // Ja tällainen...
  || sana[i] == 'i' // .. niin eikö tämä olisi aivan loogista?
  || sana[i] == 'o' // Etkö tunne loogisia operaattoreita?
  || sana[i] == 'u' // Etkö tunne (char-)taulukon toimintaa?
  || sana[i] == 'y'
)
maara++;

Isot kirjaimet pitää laittaa erikseen, ja ääkköset pitää yleensä korvata vastaavilla escape-merkinnöillä:
å = \x86
ä = \x84
ö = \x94
Å = \x8f
Ä = \x8e
Ö = \x99
Jos nämä eivät toimi, lisää x:n vasemmalle puolelle nolla. Jos ei toimi sittenkään, kysy uudestaan.

Edit: Antti ehti ensin... Kyllä tuo switch taitaa tosiaan olla helpompi tähän, mutta pitää silti if-lausettakin osata käyttää.

Maajo [29.12.2004 23:47:44]

#

Kiitokset kummallekin! Nyt se toimii. :) :) :) :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta