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?
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.
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?
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.
Miten lisään ne vokaalit sinne? En ymmärrä nyt ollenkaan... :(
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ä...
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; }
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ää.
Kiitokset kummallekin! Nyt se toimii. :) :) :) :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.