Kezdőoldal » Számítástechnika » Programozás » C nyelven szeretnék programot...

C nyelven szeretnék programot írni, ami ellenőrzi a személyi szám helyességét, valaki segítene?

Figyelt kérdés

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?


2016. máj. 15. 18:01
1 2
 1/19 anonim ***** válasza:
Szeretnéd, vagy a tanár szeretné?
2016. máj. 15. 18:06
Hasznos számodra ez a válasz?
 2/19 A kérdező kommentje:

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!

2016. máj. 15. 18:21
 3/19 uno20001 ***** válasza:
100%

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]

2016. máj. 15. 18:50
Hasznos számodra ez a válasz?
 4/19 anonim ***** válasza:

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

...

2016. máj. 15. 18:52
Hasznos számodra ez a válasz?
 5/19 anonim ***** válasza:

"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

2016. máj. 15. 18:57
Hasznos számodra ez a válasz?
 6/19 anonim ***** válasza:
Nyilván(!) elrontottam a tesztet az előző hsz-ben, de innen már biztos menni fog a javítás..
2016. máj. 15. 18:59
Hasznos számodra ez a válasz?
 7/19 SimkoL ***** válasza:
Azért picit érdekesebb az egész. Az elképzelésed szerint a 1-950229.... is jól kezdődik. Érdemes lenne az érvényes dátumra is egy függvényt írni - pár sor az egész: [link]
2016. máj. 15. 19:03
Hasznos számodra ez a válasz?
 8/19 A kérdező kommentje:
Köszönöm mindenkinek! Még kezdő vagyok, pontosabban még kezdőnek is kezdő, úgyhogy tényleg sokat segítettetek!
2016. máj. 15. 19:05
 9/19 anonim ***** válasza:
100%

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:

[link]

2016. máj. 15. 19:11
Hasznos számodra ez a válasz?
 10/19 anonim ***** válasza:
kiceum = líceum, bocs
2016. máj. 15. 19:14
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!