Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: merkkijonoharjoitusta

Rookie [10.04.2005 16:07:08]

#

//merkkijonoharjoitusta

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main (void)
{
int i; //laskuri
int pituus; //merkkijonon pituus
int kirjainta = 0, isokirjainta = 0, vokaalit = 0;
char rivi[127+1], mki;

printf ("Kirjoita tekstirivi:\n");
gets (rivi);
pituus = strlen(rivi);
for (i=0; i<pituus; i++)
{
if (rivi[i]=='a' || rivi[i]=='b'||
rivi[i]=='c' || rivi[i]=='d' || rivi[i]=='e' ||
rivi[i]=='f' || rivi[i]=='g' || rivi[i]=='h' ||
rivi[i]=='i' || rivi[i]=='j' || rivi[i]=='k' ||
rivi[i]=='l' || rivi[i]=='m' || rivi[i]=='n' ||
rivi[i]=='o' || rivi[i]=='p' || rivi[i]=='q' ||
rivi[i]=='r' || rivi[i]=='s' || rivi[i]=='t' ||
rivi[i]=='u' || rivi[i]=='v' || rivi[i]=='x' ||
rivi[i]=='y' || rivi[i]=='z' || rivi[i]=='ä' ||
rivi[i]=='ö' || rivi[i]=='A' || rivi[i]=='B' ||
rivi[i]=='C' || rivi[i]=='D' || rivi[i]=='E' ||
rivi[i]=='F' || rivi[i]=='G' || rivi[i]=='H' ||
rivi[i]=='I' || rivi[i]=='J' || rivi[i]=='K' ||
rivi[i]=='L' || rivi[i]=='M' || rivi[i]=='N' ||
rivi[i]=='O' || rivi[i]=='P' || rivi[i]=='Q' ||
rivi[i]=='R' || rivi[i]=='S' || rivi[i]=='T' ||
rivi[i]=='U' || rivi[i]=='V' || rivi[i]=='X' ||
rivi[i]=='Y' || rivi[i]=='Z' || rivi[i]=='Ä' ||
rivi[i]=='Ö' || rivi[i]=='a' || rivi[i]=='e'||
rivi[i]=='i' || rivi[i]=='o' || rivi[i]=='u' ||
rivi[i]=='y' || rivi[i]=='ä' || rivi[i]=='ö' ||
rivi[i]=='A' || rivi[i]=='E' || rivi[i]=='I' ||
rivi[i]=='O' || rivi[i]=='U' || rivi[i]=='Y' ||
rivi[i]=='Ä' || rivi[i]=='Ö' || rivi[i]==' ')
kirjainta++;

if (rivi[i]=='A' || rivi[i]=='B'||
rivi[i]=='C' || rivi[i]=='D' || rivi[i]=='E' ||
rivi[i]=='F' || rivi[i]=='G' || rivi[i]=='H' ||
rivi[i]=='I' || rivi[i]=='J' || rivi[i]=='K' ||
rivi[i]=='L' || rivi[i]=='M' || rivi[i]=='N' ||
rivi[i]=='O' || rivi[i]=='P' || rivi[i]=='Q' ||
rivi[i]=='R' || rivi[i]=='S' || rivi[i]=='T' ||
rivi[i]=='U' || rivi[i]=='V' || rivi[i]=='X' ||
rivi[i]=='Y' || rivi[i]=='Z' || rivi[i]=='Ä' ||
rivi[i]=='Ö')
isokirjainta++;

if (rivi[i]=='a' || rivi[i]=='e'||
rivi[i]=='i' || rivi[i]=='o' || rivi[i]=='u' ||
rivi[i]=='y' || rivi[i]=='ä' || rivi[i]=='ö' ||
rivi[i]=='A' || rivi[i]=='E' || rivi[i]=='I' ||
rivi[i]=='O' || rivi[i]=='U' || rivi[i]=='Y' ||
rivi[i]=='Ä' || rivi[i]=='Ö')
vokaalit++;
}

printf ("Rivilla on %d kirjainta,", kirjainta);
printf(" %d isoa kirjainta ja", isokirjainta);
printf(" %d vokaalia.", vokaalit);
}

Elikkä, ohjelma kertoo käyttäjän syöttämän tekstin, sisältääkö se isoja kirjaimia,vokaaleja jne. Tarkoitus olisi saada vielä lopettamaan ohjelma, jos tekstiä ei syötetä (ENTER, eli tyhjä merkkijono). Lisäksi toistorakenne sopisi, jos halutaan syöttää uusi tekstin pätkä. Mitenkä tästä edetä? (pahoittelen viestin kiireellisyydestä)

Mod. edit: kooditagit vaan ei paljon auta, jos ite koodia ei oo alunperinkään sisennetty...

sqwiik [10.04.2005 16:17:50]

#

Käytä kooditageja, niin tuota koodia voisi lukeakin ilman että silmiin sattuu...
https://www.ohjelmointiputka.net/ohje.php?tunnus­=kohjeet

Vastausta:
Funktiosta voi poistua kesken koodin return-lauseella. Eli jos haluat että tyhjällä merkkijonolla lopetetaan, niin laita vaikkapa tuohon pituustarkistuskohtaan ehto

if(pituus < 1)return 0;

jolloin muuta koodia ei suoriteta. Tuon moneen kertaan suorituksen saat laittamalla kyselyn yms silmukkaan. Silmukasta taas voi hypätä pois kesken sen suorityksen käskyllä break.
Tyyliin (pseudo)

int main(int argc, char ** args){
  while(1){
    lue rivi
    jos rivi = "", lopeta (break;)
    tulosta tiedot
    kysy haluaako lisää. Jos ei, niin <break>
  }
  return 0;
}

Metabolix [10.04.2005 19:41:31]

#

Tiedä, että kirjainmerkit a-z ja A-Z ovat järjestyksessä, eli pääset paljon pienemmällä koodilla, kun korvaat niitä koskevat tarkistukset < ja > -vertailuilla. Ensimmäisestä if-lauseesta tulee siis tällainen:

if ((rivi[i] >= 'a' && rivi[i] <= 'z')
|| (rivi[i] >= 'A' && rivi[i] <= 'Z')
|| rivi[i] == 'Å' || rivi[i] == 'Ä' || rivi[i] == 'Ö'
|| rivi[i] == 'å' || rivi[i] == 'ä' || rivi[i] == 'ö'
|| rivi[i] == ' ')

Alkuperäisestä koodistasi puuttuvat å ja w, ja monet kirjaimet ovat useampaan kertaan (kuten a, e, i, o, u, y, ä ja ö). Millä perusteella välilyönti on kirjain mutta välimerkit eivät?

Deewiant [10.04.2005 21:59:49]

#

Metabolix kirjoitti:

Tiedä, että kirjainmerkit a-z ja A-Z ovat järjestyksessä

<nusnus>Eivät EBCDICissä.</nusnus>

InvalidCo [13.04.2005 12:11:53]

#

Deewiant kirjoitti:

Metabolix kirjoitti:

Tiedä, että kirjainmerkit a-z ja A-Z ovat järjestyksessä

<nusnus>Eivät EBCDICissä.</nusnus>

Mikä EBCDIC on? Jokin C-kääntäjä?

Blaze [13.04.2005 13:15:46]

#

Eräs merkkikoodaus. http://en.wikipedia.org/wiki/EBCDIC

uffis [18.04.2005 15:35:15]

#

Funktiota gets ei pitäisi käyttää, koska se aiheuttaa ylivuoto-ongelmia. Fgets on parempi.

Kannattaisi lisäksi tutustua funktioihin isalpha, islower, isupper, isdigit sekä isalnum niin ei tarvitsisi laatia tuollaisia kamalia ehtolauseita.

Vastaus

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

Tietoa sivustosta