Hogyan kell megoldani ezt a feladatot?
Döntsd el egy karakterről, hogy kis- vagy nagybetű, szám, esetleg egyéb
karakter ("kisbetű", "nagybetű", "számjegy", "egyéb")!
Készíts többféle algoritmust és megvalósítást. Először oldd meg a feladatot
megkötések nélkül, majd úgy, hogy az alábbi megszorítások közül kiválasztasz
egyet, és azt betartod:
- Az if, ?: és switch közül csak az if szerkezetet használhatod.
- Az if, ?: és switch közül csak a ?: kifejezést használhatod.
- Az if, ?: és switch közül csak a switch szerkezetet használhatod.
- Az if, ?: és switch közül egyiket sem használhatod.
ellenőrzöd hogy az ASCII kódja a karakternek milyen tartományból van, ezt az első három esetre működik.
Arra én is kíváncsi vagyok hogy hogy lehet megoldani elágazás nélkül.
Eddig jutottam:
int main () {
char c;
scanf("%c", &c);
switch( c >= 65 && c <= 90 ) {
case 0:
printf("Kisbetu\n");
break;
case 1:
printf("Nagybetu\n");
break;
}
Ez így működik is, de hogy írom fel a többit?
Ez így elvi megközelítésnek jó lenne arra az esetre, amikor egyiket sem használhatod?
- ASCII tábla mintájára csinálsz egy tömböt pl. KARAKTEREK néven, ahol kisbetűk lennének ott az érték "kisbetű", ahol nagybetűk ott ""nagybetű", számok helyén "számjegy" és minden egyéb helyen "egyéb",
- kiíratod a karakterkódnak megfelelő tömbelemet.
Az, hogy az if-et lecseréled switch-re még nem lesz "többféle algoritmus és megvalósítás".
Icipicit gondolkozni is kéne, habár tudom ez keveseknek megy.
Amit írtál, az C. C#-ban így nézne ki:
if (char.IsLower(c)) return "kisbetű";
else if (char.IsUpper(c)) return "nagybetű";
else if (char.IsDigit(c)) return "szám";
else return "egyéb";
return char.IsLower(c) ? "kisbetű" : char.IsUpper(c) ? "nagybetű" : char.IsDigit(c) ? "szám" : "egyéb";
switch(char.GetUnicodeCategory(c))
{
// tabtab - láss csodát!
}
4. undorítóan, pl.
feltöltesz egy Dictionary-t (vagy felőlem lehet string[], mert prog1 van) ahol ezeket a szövegeket hozzárendeled az egyes ascii karakterekhez, majd egyszerűen kiolvasod a tömb megfelelő értékét. A tömb feltöltésére használhatsz össz. 4 db for ciklust, így sehol nem lesz benne egy darab if se. És a tömb feltöltése után még O(1) is lesz!
Kedves kérdező, jó helyen tapogatózol, de haladj sorjában.
A közölt switch utasítás kifejezését használd fel egy if utasításban - ezzel eldöntheted, hogy a bekért karakter nagybetű-e; majd ezt az if utasítást bővítsd ki egy else if ággal, ahol eldöntöd, hogy a bekért karakter kisbetű-e! Ehhez az intervallumot állítsd át 97 és 122 közöttire.
Majd tovább bővítheted ezt a feltételt a számokkal - 48...57 - és egy utolsó else ág lesz az egyéb.
Tehát:
if (<nagybetűs feltétel>) {
printf("nagybetű\n");
} else if (<kisbetűs feltétel>) {
printf("kisbetű\n");
} else if (<számos feltétel>) {
printf("számjegy\n");
} else {
printf("egyéb\n");
}
A ? az if-et helyettesíti a : az else-et:
printf ((<nagybetűs feltétel>) ? "nagybetű\n" : (<kisbetűs feltétel>) ? "kisbetű\n" : (<számjegyes feltétel>) ? "számjegy\n" : "egyéb\n");
A switch/case esete kicsit furmányosabb.
Az lenne a legszebb, ha a bekért karaktert a switch utasítás kifejezésében lehetne megadni, majd a case-ben megadni az intervallumokat, de a case után a szabvány szerint csak konstans (szám) szerepelhet.
Tehát lesz egy ilyen rondaság:
switch (c) {
case 65:
case 66:
case 67:
és így tovább, egészen a végéig:
case 88:
case 89:
case 90:
printf("nagybetű\n");
break;
És ez ugyanígy a kisbetű és a szám esetében. Az egyébre meg ott a default a case helyett.
A GCC fordító kiegészítése támogat egy nem szabványos tartomány kijelölést:
case 65 ... 90:
printf("nagybetű\n");
break;
nem tudom, más fordítók mennyire komálják ezt (iééetve mennyire fogadják el a feladatban).
"- Az if, ?: és switch közül egyiket sem használhatod."
Itt pedig egy "ronda" (helyigényes), de működőképes megoldás:
1. Létrehozol egy, a típusok neveit (egyéb, kisbetű, nagybetű, számjegy) tartalmazó, 4 elemű tömböt.
2. Létrehozol egy, 256 elemből álló, egész számokat tartalmazó tömböt, ahol az adott elem reprezentálja az adott karakter típusát - például a 0. elem értéke 0 ("egyéb"), a 48. elem értéke 3 ("számjegy"), a 65. elem értéke 1 ("nagybetű"), a 97. elem értéke 2 ("kisbetű) - és így tovább.
3. Majd a beolvasott karakter értékének megfelelő típust adsz vissza:
printf ( "%s", types[chartable[c]]);
/* A types a típusokat tartalmazó 4 elemű tömb, a chartable meg a karakterek típusait tartalmazó 256 elemű tömb. */
Igazából, van erre egyszerűbb megoldás is, amihez nem kell a komplett ASCII táblát felépíteni :D
Kell egy tömb a típusmegnevezésekkel, ileltve kell további kettő (vagy egy darab értékpárokból álló tömb), ami az egyes karaktertípusok alsó, ileltve felső ASCII kód határát szabja meg. Ezután csak egy while ciklust kell leírni:
/int N - A limits tömb mérete
int i = 0;
while( !(charCode >= limits[i].lower && charCode <= limits[i].upper) && i<N)
{
i++
}
return character_types[i];
A szabályoknak eleget tesz.
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!