Kezdőoldal » Számítástechnika » Programozás » Hogyan kell megoldani ezt a...

Hogyan kell megoldani ezt a feladatot?

Figyelt kérdés

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.



2017. szept. 22. 19:15
1 2
 1/11 anonim ***** válasza:

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.

2017. szept. 22. 20:28
Hasznos számodra ez a válasz?
 2/11 A kérdező kommentje:

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?

2017. szept. 22. 20:30
 3/11 CspCsj ***** válasza:

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.

2017. szept. 22. 21:35
Hasznos számodra ez a válasz?
 4/11 anonim ***** válasza:
0%

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.

2017. szept. 22. 21:42
Hasznos számodra ez a válasz?
 5/11 anonim ***** válasza:

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!

}

2017. szept. 22. 21:51
Hasznos számodra ez a válasz?
 6/11 anonim ***** válasza:

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!

2017. szept. 22. 21:56
Hasznos számodra ez a válasz?
 7/11 anonim ***** válasza:
100%

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");

2017. szept. 22. 21:58
Hasznos számodra ez a válasz?
 8/11 anonim ***** válasza:

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;

[link]

nem tudom, más fordítók mennyire komálják ezt (iééetve mennyire fogadják el a feladatban).

2017. szept. 22. 23:03
Hasznos számodra ez a válasz?
 9/11 anonim ***** válasza:

"- 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. */

2017. szept. 23. 01:16
Hasznos számodra ez a válasz?
 10/11 anonim ***** válasza:

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.

2017. szept. 23. 02:42
Hasznos számodra ez a válasz?
1 2

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!