//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...
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; }
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?
Metabolix kirjoitti:
Tiedä, että kirjainmerkit a-z ja A-Z ovat järjestyksessä
<nusnus>Eivät EBCDICissä.</nusnus>
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ä?
Eräs merkkikoodaus. http://en.wikipedia.org/wiki/EBCDIC
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.