C nyelven szeretnék programot írni, ami ellenőrzi a személyi szám helyességét, valaki segítene?
Pontosan 11 karakteres számsor, csak számokból áll, az első karaktere 1-4 közötti, a második-harmadik karakterek bármely számok lehetnek, a negyedik 0 vagy 1, az ötödik bármi, a hatodik 0,1,2,3; a hatodik bármely szám, a hetedik, nyolcadik, kilencedik bármi, az utolsó perdig a következők szerint: az első tagot 1-gyel, a másodikat 2-vel,....a tizediket 10-zel szorozzuk, a szorzatok eredményét összeadjuk, az összeget osztjuk 11-gyel, a maradék a 11. karakter.
Azt szeretném C-ül megfogalmazni, valaki tud segíteni?
Szeretném! Nagyon pervi? Utána még kipofoznám, hogy az 1996-os utáni születésűeknél is működjön, csak mindent azért nem írtam le. De ha nagyobb leszek, a tanár is lehet, hogy szeretné majd :D A PTE-seknél találtam egy ilyen feladatot, gondoltam nekem is jó lesz, hogy megértsem a C nyelvet. Elég komplexnek tűnik a feladat, de ott az első féléves tantárgynál van, szóval gondolom megoldható. Akkor pedig meg tudom előbb-utóbb érteni.
Aki tud segíteni, annak gratulálok, aki pedig segít is, annak nagyon köszönöm!
Ehhez már csak az if-else szerkezetet kell ismerni és meg tudod csinálni.
I. beolvas (pl. fgets [1])
II. hossz ellenőrzés (pl. strlen [2] és if [3])
III. 1-9 karakter ellenőzése (if-else [3])
IV. kiírás
V. + amit akarsz
Pár részlet segíthet:
int ervenyes_e(const char *szam) {
if (strlen(szam) != 11) {
/* ilyenkor NEM jó */
return 0;
}
if ((szam[0] < '1') || (szam[0] > '4')) {
/* ilyenkor NEM jó */
return 0;
}
/* többi jegy ellenőrzése */
return 1;
}
U.I.: szerintem ne azt ellenőrizd, hogy jó-e (mert ilyen esetben 11 egymásba ágyazott if-else szerkezettel is végezheted), hanem hogy rossz-e; ha rossz, akkor (ha pl. külön függvényt csináltál erre a célra) térj vissza hamis értékkel.
[1]: [link]
[2]: [link]
[3]: [link]
Pár darab if és aritmetikai művelet az egész, vagy regex.
Egyébként elírtad: "a hatodik 0,1,2,3; a hatodik bármely szám"
Ha a tömb első eleme 1-4 akkor tovább
Ha második és harmadik elem szám akkor tovább
...
"Elég komplexnek tűnik a feladat"
Olyat akkor nyilván nem láttál még (de reméljük fogsz).
Akkor kis segítség:
Ha sikerült stringként (C-ben csak karaktertömb van, azt szokták így hívni) megszerezni az adatot, akkor onnan nem nehéz.
Mondjuk így néz ki:
char szemelyi_szam[11+1]; // lezáró 0 miatt
Írsz egy függvényt az ellenőrzésre:
int szemelyi_szam_helyes(char* ss);
Mondjuk belül lefuttatod azt a pár ellenőrzést sorban egymás után, nem kell túlbonyolítani:
// ha megbukik valamelyik teszten, beállítjuk visszatérünk hamissal (0)
if (ss[0] >= '1' && ss[0] <= '4') { return 0; }
// többi teszt...
Az utolsó teszthez nem árt átkonvertálni a számjegyeket számokká, írhatsz rá egy másik függvényt:
int char_to_int(char c);
A művelet (ha '0' és '9' között van, ezt előbb ellenőrizd, a fentiek alapján nem lesz nehéz):
return c - '0';
A teszt:
int osszeg = 0;
for(int i=0; i<10; ++i) { osszeg += (i+1) * char_to_int(ss[i]); }
if (osszeg % 11 != char_to_int(ss[10])) { return 0; } // ez a 11. számjegy, mert nullától indexelünk
A személyi szám kicsit összetettebb dolog:
1. az első szám tárolja a személy nemét (férfi/nő), 1997-01-01 előtt állampolgárságukat (magyar/nem magyar), illetve hogy melyik korban születtek.
* 1891-12-31 után született magyar férfi: 1
* 1891-12-31 után született magyar nő: 2
* 1891-12-31 után született nem magyar férfi: 5
* 1891-12-31 után született magyar nő: 6
* 1900-01-01 előtt született magyar férfi: 3
* 1900-01-01 előtt született magyar nő: 4
* 1900-01-01 előtt született nem magyar férfi: 7
* 1900-01-01 előtt született magyar nő: 8
* 1997-01-01 és 1999-12-31 között született férfi: 1
* 1997-01-01 és 1999-12-31 között született nő: 2
* 1999-12-31 után született férfi: 3
* 1999-12-31 után született nő: 4
2. a 2-7. számjegyeket a születési év utolsó két jegye, a hónap és a nap kétjegyű sorszáma adja
3. a 8-10. számjegyek az azonos napon születettek sorszámát (lajstromszám) jelentik
4. a 11. számjegy az ellenőrző kód, aminek képzése:
int a[11]; //A személyi számot tároló tömb
int s1 = 0;
int s2 = 0;
for (int i = 0; i < 11; i++) {
s1 = s1 + a[i] * i;
s2 = s2 + a[i] * (11-i);
}
return ((s1 % 11) == a[11] || (s2 % 11) == a[11]);
A fordított sorrendre (s2) az 1996-12-31 után született, a normál sorrendre (s1) az 1997-01-01 előtt született polgárok részére van szükség.
Forrás: Békési-Geda-Holovács-Perge: Adatbázis-kezelés (EKF kiceum kiadó 2001)
De bővebben:
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!