Weboldalunk cookie-kat használhat, hogy megjegyezze a belépési adatokat, egyedi beállításokat, továbbá statisztikai célokra és hogy a személyes érdeklődéshez igazítsa hirdetéseit. További információ
Kezdőoldal » Számítástechnika » Programozás » Hogyan kéne ezt megírni? (C...

Hogyan kéne ezt megírni? (C nyelv)

Figyelt kérdés

Hali, egy olyan programot szeretnék írni, ami ellenőrzi a beírt magyar rendszámokat, szóval ha helyes a beírt formátum (3 betű, kötőjel, majd 3 szám), akkor kiírná például, hogy helyes, ha nem jó a beírt rendszám, akkor pedig helytelen.

Tudna ebben valaki segíteni?


jan. 6. 23:14
1 2
 1/12 anonim ***** válasza:
83%

Régen C-ztem, és most lusta vagyok belerágni magam újra, szóval nem konkrét kódot fogsz kapni, csak iránymutatást.

Természetesen ez csak egy lehetséges megoldás, a programozás egyik fő jellemzője az, hogy egy feladatot rendszerint több módon is meg kéne oldani.

Én bevezetnék egy logikai szerepű változót (nyilván int, mivel a C-ben nincs logikai adattípus), és ezt igazra állítanám (1-re), tehát abból indulunk ki, hogy jó a rendszám. Majd sorban ellenőrizném a karaktereit, és ha valamelyik nem stimmel, akkor ezt a logikai változót hamisra (0) állítanám. Ha jó az adott karakter, akkor nem bánatnám. Első körben ellenőrizném a hosszát, ha az nem 7, akkor hibás. Majd végiglépkednék a karakterein. (A string ugyebár egy karaktertömb. Minden nyelvben lényegében az, de a C konkrétan annak is kezeli.) Az első háromnál azt viszgálnám, hogy betű-e, a negyediknél konkrétan azt, hogy kötőjel-e, majd pedig hogy számok-e. Ezekre a vizsgálatokra vannak beépített függvények, például: [link]

jan. 6. 23:28
Hasznos számodra ez a válasz?
 2/12 anonim válasza:
72%

Nem biztos ,de talán ez segíthet valamennyit.

[link]

jan. 6. 23:35
Hasznos számodra ez a válasz?
 3/12 anonim ***** válasza:
24%

A kettes iránymuatása a legjobb számodra.

Azt kell első körben megálapítani a beolvasott karakterről, hogy az miféle.

Három lehetőség van,

szám, betű vagy egyéb. Ennek csekkolása mellett a karakterpozícióra kell még tekintettel lenni.

Az első három lehet a latin ABC valamely betűje. A második három pedig numerikus karakter.


Ennyi az egész. Egy nagyon egyszerű parser.

A betűket mondjuk érdemes nagybetűsíteni.

jan. 7. 00:00
Hasznos számodra ez a válasz?
 4/12 anonim ***** válasza:
62%
A P-s és egyedi rendszám is helyen, és piszkosul nem csak 3 betű 3 szám van benne. Csak úgy mondom...
jan. 7. 05:24
Hasznos számodra ez a válasz?
 5/12 anonim ***** válasza:
80%
#4: Teljesen jogos, de itt nyilván nem egy hatósági gépjárműnyilvántartó szoftver megírása a cél, hanem pusztán a gyakorlás. ;) A feladat pedig pontosan leírja, hogy mit ért helyes formátum alatt, szóval a feladat megoldható, még akkor is, ha tényleg tartalmilag hibás.
jan. 7. 10:12
Hasznos számodra ez a válasz?
 6/12 anonim ***** válasza:
72%
A kérdező sorozatrendszámokról /3 betű, 3 szám/ ír. Az tehát a kiindulópont.
jan. 7. 10:23
Hasznos számodra ez a válasz?
 7/12 tetrav ***** válasza:

Kéd dolog jut eszembe(amik valójában ekvivalensek egymással, de ezt most hagyjuk):

Megpróbálkozhatsz reguláris kifejezéssel. Talán ez a legegyszerübb:

[A-Z]{3}-[0-9]{3}. Ha még nem hallottál a reguláris kifejezésekröl, a wikipédián olvashatsz róla: [link]


A másik, ami eszembe jutott, építhetsz egy véges állapotú gépet hozzá(finite state machine: [link]

Az állapothalmaz: betu_1, betu_2, betu_3, kotojel, szam_1, szam_2, szam_3, ok, hiba

Az ABC az lehet mondjuk A-tól Z-ig, 0-tól 9-ig meg a kötöjel.

A kezdö állapot a betu_1

Az elfogadó állapot pedig az ok.

Az állapot átmeneti szabályokat így fogalmaznám meg:

betu_1 X [A, B, ..., Z] -> betu_2

betu_1 X [0, 1, ..., 9, - ] -> hiba

betu_2 X [A, B, ..., Z] -> betu_3

betu_2 X [0, 1, ..., 9, - ] -> hiba

betu_3 X [A, B, ..., Z] -> kotojel

betu_3 X [0, 1, ..., 9, - ] -> hiba

kotojel X [-] -> szam_1

kotojel X [A, B, ..., Z, 0, ..., 9] -> hiba

szam_1 X [0, ..., 9] -> szam_2

szam_1 X [A, B, ..., Z, -] -> hiba

szam_2 X [0, ..., 9] -> szam_3

szam_2 X [A, B, ..., Z, -] -> hiba

szam_3 X [0, ..., 9] -> ok

szam_3 X [A, B, ..., Z, -] -> hiba

hiba X [bármi] -> hiba

ok X [bármi] -> hiba



Itt találsz többféle implementációt ilyen automatákra: [link]



Persze lehet mondani, hogy ez a két módszer túlzás ilyen egyszerü feladathoz, de szerintem sokat lehet belöle tanulni. Persze a következö algoritmus is müködik:

int is_valid(char * rendszam)

{

if(strlen(rendszam) != 7) return 0;

bool result = isalpha(rendszam[0]) && isalpha(rendszam[1]) && isalpha(rendszam[2]);

result = result && (rendszam[3] == '-');

result = is_valid && isdigit(rendszam[4]) && isdigit(rendszam[5]) && isdigit(rendszam[6]);

}

jan. 7. 12:43
Hasznos számodra ez a válasz?
 8/12 tetrav ***** válasza:

#7: a függvény végéröl lemaradt a return result, meg az utolso elötti sorban a result = is_valid &&... helyett result = result && ... kell:

int is_valid(char * rendszam)

{


if(strlen(rendszam) != 7) return 0;


int result = isalpha(rendszam[0]) && isalpha(rendszam[1]) && isalpha(rendszam[2]);


result = result && (rendszam[3] == '-');


result = result && isdigit(rendszam[4]) && isdigit(rendszam[5]) && isdigit(rendszam[6]);

return result


}

jan. 7. 12:46
Hasznos számodra ez a válasz?
 9/12 anonim ***** válasza:
7: Abszolút igazad van, de a felé megnyilvánuló elvárást is figyelembe véve, azt hiszem jobb ha még nem épít állapotgépet.
jan. 7. 12:52
Hasznos számodra ez a válasz?
 10/12 anonim ***** válasza:
Nem tudom, mennyire praktikus, de például lehet olyat is, hogy a karakter ellenőrzést függvényekbe írod (betű, szám, kötőjel; három függvény), és egy függvény-pointer tömbbe beteszed, hogy melyik pozíción milyen karaktert vársz, tehát ez a tömb lenne kb. a teljes string szabálya. Ezután már csak végig kell szaladni a stringen és meghívni a fenti tömb azonos indexű függvényét az adott karakterre. Ahol mondjuk 1 helyett 0 választ kapsz a függvénytől, ott ki is lehet szállni a ciklusból.
jan. 7. 13:14
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:





Minden jog fenntartva © 2021, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | WebMinute Kft. | Facebook | Kapcsolat: info@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!