Kezdőoldal » Számítástechnika » Programozás » Hogyan tudnám javítani ezt a...

Hogyan tudnám javítani ezt a C programot?

Figyelt kérdés

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.



2023. okt. 6. 22:37
 1/6 A kérdező kommentje:
Tudom elég hosszú lett, de remélem attól még valaki tud benne segíteni. Előre is köszönöm a válaszokat!
2023. okt. 6. 22:38
 2/6 anonim ***** válasza:
49%
Egyetlen karaktert vizsgálgatsz, ez így biztos, hogy nem jó. Gyűjtsd egy char tömbbe a karaktereket, és EOF után kezd el vizsgálni a szavakat.
2023. okt. 6. 22:46
Hasznos számodra ez a válasz?
 3/6 anonim ***** válasza:
48%
Hát én ciklussal csinálnám. Végigmegyek az egyes által leírt tömbön v. c-stringen, ha space utáni betű nagybetű, akkor egy belső ciklusban cserélgeném a kisbetűket nagyra, amíg megint space vagy \0 jön, ez a kilépési feltétele a belső ciklusnak.
2023. okt. 6. 23:47
Hasznos számodra ez a válasz?
 4/6 anonim ***** válasza:
48%

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.

2023. okt. 7. 01:47
Hasznos számodra ez a válasz?
 5/6 anonim ***** válasza:
48%

Ha elakadtál vele kérdező, itt egy nem tömbös változat, ebből puskázhatsz:

[link]


Itt pedig egy tömbös változat:

[link]


Igazából meg lehetne írni strtok-kal is, de nekem már nincs több időm rám.

2023. okt. 7. 08:51
Hasznos számodra ez a válasz?
 6/6 anonim ***** válasza:

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]

2023. okt. 7. 16:29
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!