Hogyan tudnám javítani ezt a C programot?
A feladat, hogy írj programot, mely a bemenetére érkező szöveget úgy írja ki a kimenetre, hogy minden nagybetűvel kezdődő szót csupa nagybetűssé alakít, a többit változatlanul hagyja. A bemenetre érkező szöveg szavait egyetlen szóköz választja el megymástól. Az elvárt működést az alábbi példa demonstrálja:
Input: ez EgY pElda A felaDat EGY lehetseges Bemenetere
Output: ez EGY pElda A felaDat EGY lehetseges BEMENETERE
A megoldásban nem használhatod a ctype.h-t.
#include <stdio.h>
A kód, amire eddig jutottam
#include <stdio.h>
int is_upper(char c) {
return c >= 'A' && c <= 'Z';
}
int is_lower(char c) {
return c >= 'a' && c <= 'z';
}
int main() {
int c;
int prev_char_was_space = 1;
while ((c = getchar()) != EOF) {
if (is_lower(c) && prev_char_was_space) {
putchar(c - ('a' - 'A')); // Itt alakítom nagybetűve
} else {
putchar(c);
}
prev_char_was_space = (c == ' ');
}
return 0;
}
-------------------
ez a hibakód, valamelyiknél működik, valahol már nem
Test case #1:
input =
-----
OK
-----
Test case #2:
input = alma
-----
Your standard output:
Alma
Correct standard output:
alma
-----
Test case #3:
input = Alma
-----
Your standard output:
Alma
Correct standard output:
ALMA
-----
Test case #4:
input = alMa
-----
Your standard output:
AlMa
Correct standard output:
alMa
-----
Test case #5:
input = alma korte
-----
Your standard output:
Alma Korte
Correct standard output:
alma korte
-----
Test case #6:
input = alma Korte
-----
Your standard output:
Alma Korte
Correct standard output:
alma KORTE
-----
Test case #7:
input = alMa kOrte
-----
Your standard output:
AlMa KOrte
Correct standard output:
alMa kOrte
-----
Test case #8:
input = alMa KoRTe
-----
OK
-----
Test case #9:
input = ez EgY pElda A felaDat EGY lehetseges Bemenetere
-----
Your standard output:
Ez EgY PElda A FelaDat EGY Lehetseges Bemenetere
Correct standard output:
ez EGY pElda A felaDat EGY lehetseges BEMENETERE
-----
Test case #10:
(random input)
oFZojkl SWO CliyE lmzXP gsFZ CwzJM zbikYvh nriTHLvQzM
-----
Your standard output:
OFZojkl SWO CliyE LmzXP GsFZ CwzJM ZbikYvh NriTHLvQzM
Correct standard output:
oFZojkl SWO CLIYE lmzXP gsFZ CWZJM zbikYvh nriTHLvQzM
-----
Test case #11:
(random input)
yRAdSMVfYlH zkFJU QsHmwNaUywb CruDdgEnR xbptLD XNLg OTFbGeqkh KjA
-----
Your standard output:
YRAdSMVfYlH ZkFJU QsHmwNaUywb CruDdgEnR XbptLD XNLg OTFbGeqkh KjA
Correct standard output:
yRAdSMVfYlH zkFJU QSHMWNAUYWB CRUDDGENR xbptLD XNLG OTFBGEQKH KJA
At least one of the tests failed.
if (is_lower(c) && prev_char_was_space) {
putchar(c - ('a' - 'A'));
Ez azt jelenti, hogy ha kisbetű és a szó elején van, akkor naggyá alakítod. Ez semmiképp nem jó, hisz a kisbetűvel kezdődő szavakat nem szabad bántani.
Azt sehol nem követed nyomon, hogy naggyá alakítandó szóban jársz vagy sem.
Ehhez kellene még egy flag pl.
<int capitalize_word>, amit mindig 1-re állítasz, ha a szó elején nagybetűt találtál és 0-ra, ha a szó végéhez értél. Amíg ez a flag 1-es, addig minden kisbetűt nagyra váltasz.
Ez egy tipikus példafeladat állapotgépekre, konkrétan az úgy nevezett Finite state transducer, ami kell neked.
Képzelj el egy "gépet". Ennek a gépnek van két szalagja: minden lépésben az egyik szalagot olvassa, a másikat írja. A gépednek vannak még belsö állapotai, van egy kezdeti állapota, van egy pillanatnyi aktuális állapota és vannak belsö szabályai:
Ezek a szabályok olyan formában vannak megadva, hogy az aktuális belsö állapot valamint az input szalagról éppen kiolvasott karakter függvényében mit írjon ki az output szalagra és milyen új aktuális állapotot vegyen fel.
Ezeket a gépeket lehet grafikusan is ábrázolni, úgy könnyebb megérteni. A te feladatodhoz valami ilyesmi állapotgép fog kelleni: [link]
Van négy állapot: 'szo_eleje', 'kisbetus_szo', 'nagybetus_szo' és 'vége'.
Az automata a 'szo_eleje' állapotban kezd. A nyilak mutatják, hogy hogyan tud az automata átmenni az egyik állapotból a másik állapotba.
A nyilakon a szöveg olyan formába van, hogy 'a' -> 'b': ezt úgy kell értelmezni, hogy HA az automata az 'a' betüt olvasta, akkor írjon ki egy 'b' betüt és menjen át abba az állapotba, amibe a nyíl mutat.
Például ha megnézed, van egy nyíl a 'szo_eleje' állapotból a 'nagybetus_szo' állapotba. A szöveg rajta [A-Z] -> [A-Z]. Ez azt jelenti, hogy:
HA (az aktuális állapot 'szo_eleje' ÉS 'A'-tól 'Z' karaktert olvastunk) AKKOR írjuk ki ugyanazt a karaktert('A-Z') ÉS menjünk át a 'nagybetus_szo' állapotba.
Egy másik szabály ami a 'nagybetus_szo' állapotból saját magába vezet vissza([a-zA-Z] -> [A-Z]):
HA(az aktuális állapot 'nagybetus_szo' és 'A'-tól 'Z'-ig, vagy 'a'-tól 'z'ig olvastunk egy karaktert) AKKOR menjünk át a 'nagybetus_szo' állapotba(tehát maradjunk az aktuális állapotba) ÉS írjuk ki a karaktert nagybetüsítve.
Implementálni egy ilyen állapotgépet nem túl nehéz. Valahogy így kéne kinéznie:
Kelleni fog egy változó, ami tárolja az aktuális állapotot.
Kelleni fog egy ciklus, ami folyamatosan kiolvas egy karaktert az inputról.
A ciklus belsejében kelleni fog egy switch-case, ami az aktuális állapotot vizsgálja.
Minden ágba le kell írnod az adott állapotból kifele vezetö szabájokat olyan formában, hogy: HA(aktuális karakter == ez meg ez) AKKOR írd ki ezt és adj új értéket az 'aktuális állapot' változódnak.
Valami ilyesmi implementáció kell: [link]
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!