praegune kellaaeg 17.06.2025 23:12:03
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
kp0041e
HV vaatleja
liitunud: 19.11.2012
|
10.01.2013 20:16:17
Palun abi javas programmi tegemisel. |
|
|
Tervist,
Mul vaja teha javas siis selline programm, mis küsib kasutajalt isikukoodi ID ja arvutab sellest järgmised andmed: inimese sugu (mees/naine/ei saa tunnistada), sünnituskuupäev täisaastaga (23.11.2011/.../ei saa tunnistada), haigla (sünnimaja) nimetus (Valga Haigla/.../ei saa tunnistada). Lisaks tuleb väljastada, kas isikukood on korrektne või mitte (andmed ja kontrollnumber on õiged/andmed või kontrollnumber on valed).
Ma olen valmis suutnud teha kõik peale isikukoodi kontrollimise. Äkki keegi oskaks mind selle koha peal aidata? Kasutan if-else & else pea kõikjal oma koodis. Lisaks ei leia ma kusagilt käsku: kui sisestus on teatud arv kohti & on numbrid, siis laseb läbi, aga muul juhul mitte. Äkki keegi oskab selle käsu mulle anda?
Eesti ID kaardi süsteemist on juttu siin. Siin on ka lahti seletatud kontrollimine ja kõik muu vajalik: http://et.wikipedia.org/wiki/Isikukood
Tänud!
|
|
tagasi üles |
|
 |
Redikate
HV veteran

liitunud: 30.12.2005
|
10.01.2013 20:40:12
|
|
|
Anna olemasolev kood ka
Muidu pikkuse saab stringilt kasutades .length()
Niiet int isikukoodi_pikkus = sisend.length()
|
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
33 |
|
tagasi üles |
|
 |
kussu
HV veteran

liitunud: 18.12.2002
|
|
Kommentaarid: 69 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
68 |
|
tagasi üles |
|
 |
neros
HV Guru

liitunud: 26.11.2003
|
11.01.2013 01:22:56
|
|
|
Ei aita küll väga palju Javaga aga pigem teooriaga kuidas teha pseudokoodinäol
ik = "SAAKKPPJRKK"
if length of ik < 11 quit
sex = substring of ik 0, 1
year = substring of ik 1, 2
month = substring of ik 3, 2
day = substring of ik 5, 2
hospital = substring of ik 7, 3
check = substring of ik 10, 1
|
Saab ka efektiivsemalt, aga alustuseks käib ka. Javas on stringi length olemas ja ka substring.
_________________ GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt. |
|
Kommentaarid: 48 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
40 |
|
tagasi üles |
|
 |
kp0041e
HV vaatleja
liitunud: 19.11.2012
|
11.01.2013 15:08:32
|
|
|
Tänud, siiamaani on kõik olemas peale isikukoodi kontrollimise osa...
algoritm siis selline:
sikukoodi kontrollnumber formeeritakse "Moodul 11" meetodil, kasutades I või II astme kaalu:
I astme kaal: 1 2 3 4 5 6 7 8 9 1
II astme kaal: 3 4 5 6 7 8 9 1 2 3
See tähendab, et isikukoodi kümme esimest numbrit korrutatakse igaüks omaette I astme kaaluga, korrutised liidetakse. Saadud summa jagatakse 11ga. Kui jagatise jääk ei võrdu 10ga, on jääk kontrollnumbriks.
Kui jääk võrdub 10ga, siis korrutatakse koodi kümme esimest numbrit igaüks omaette II astme kaaluga. Korrutised liidetakse. Saadud summa jagatakse 11ga. Kui jääk ei võrdu 10ga, on saadud jääk kontrollnumbriks. Kui jääk võrdub 10ga, siis on kontrollnumber 0.
Näide: isikukoodi 37605030299 kontroll:
Summa = 1*3 + 2*7 + 3*6 + 4*0 + 5*5 + 6*0 + 7*3 + 8*0 + 9*2 + 1*9 = 108.
108 jääk jagamisel 11-ga on 9. (108/11 ~ 9,8. Täisosa on seega 9. Siit 9*11 = 99. Lahutades 108-99 = 9, mis ongi jääk).
Nii peabki isikukoodi 37605030299 viimane number olema 9.
Kas keegi kogenum oskaks aidata selle koodi kirjutamisega? Mul on muutujad A kuni K int'idena ning igaüks võrduvad isikukoodi ühe numbriga.( näiteks isikukoodis 37605030299 on A = 3, B = 7, C = 6, D = 0 jne...)
Praegune kontrollimise koodijupp on mul selline http://paste2.org/p/2730472
millegipärast see kood vägahästi ei tööta ja peale isikukoodi sisestamist lõpetab programmi.
|
|
tagasi üles |
|
 |
infidel
HV kasutaja

liitunud: 31.01.2004
|
11.01.2013 21:44:09
|
|
|
Näppisin natuke.
java:
|
import java.util.*; import java.io.*; public class IDKT { public static void main (String[] args ) { Scanner klaviatuur = new Scanner (System. in); System. out. println("\nPalun sisestage isikukood:"); ID = klaviatuur.nextLine(); System. out. println(ID. length()); if (ID.length() == 11) { int [ ] kood = new int [ 11 ]; for (int i = 0; i < 11; i++) { try { kood [i ] = Integer. parseInt(ID. substring(i, i +1)); } System. out. println("Kood ei koosne ainult numbritest."); } // System.out.print(" "); } int kontroll = (kood[0] * 1 + kood[1] * 2 + kood[2] *3 + kood[3] *4+ kood[4] * 5+ kood[5] * 6+ kood[6] * 7+ kood[7] * 8+ kood[8] * 9+ kood[9] * 1) % 11; if (kontroll == 10) { kontroll = (kood[0] * 3 + kood[1] * 4 + kood[2] *5 + kood[3] *6+ kood[4] * 7+ kood[5] * 8+ kood[6] * 9+ kood[7] * 1+ kood[8] * 2+ kood[9] * 3) % 11; } if (kontroll == 10) { kontroll = 0; } if (kood[10] == kontroll) System. out. println("Kontrollnumber on 6ige"); else System. out. println("Kontroll nr pole 6ige"); }else{ System. out. println("Kood on vale pikkusega."); } } }
|
Jätsin selguse huvides võimalikult palju algset koodi alles. Kui mingi koht segane on, küsi julgesti.
|
|
Kommentaarid: 36 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
35 |
|
tagasi üles |
|
 |
kp0041e
HV vaatleja
liitunud: 19.11.2012
|
|
tagasi üles |
|
 |
infidel
HV kasutaja

liitunud: 31.01.2004
|
11.01.2013 22:34:07
|
|
|
Ta ei prindi lõpus vastust, sest printimise koht on selliste sulgude vahel, kuhu jõuab ainult teatud tingimustel - haiglat ei saa tuvastada.
Ka läheb asi rea 46 juures praegu jamaks, kuna isikukoodi tõlgendamise osa on pandud lihtsalt koodile sappa. See peaks jääma aga nende samade sulgude vahele, kus on teavitus õige kontrollkoodi kohta (ebakorrektset isikukoodi pole ju mõtet tõlgendada).
Edit:
Õhtu käes, praegu rohkem ei viitsi. Nii paistis töötavat, eks vaata ise erinevusi:
java:
|
import java.util.*; import java.io.*; public class IDKT2 { public static void main (String[] args ) { Scanner klaviatuur = new Scanner (System. in); System. out. println("\nPalun sisestage isikukood:"); ID = klaviatuur.nextLine(); //System.out.println(ID.length()); if (ID.length() == 11) { int [ ] kood = new int [ 11 ]; for (int i = 0; i < 11; i++) { try { kood [i ] = Integer. parseInt(ID. substring(i, i +1)); } System. out. println("Kood ei koosne ainult numbritest."); } // System.out.print(" "); } int kontroll = (kood[0] * 1 + kood[1] * 2 + kood[2] *3 + kood[3] *4+ kood[4] * 5+ kood[5] * 6+ kood[6] * 7+ kood[7] * 8+ kood[8] * 9+ kood[9] * 1) % 11; if (kontroll == 10) { kontroll = (kood[0] * 3 + kood[1] * 4 + kood[2] *5 + kood[3] *6+ kood[4] * 7+ kood[5] * 8+ kood[6] * 9+ kood[7] * 1+ kood[8] * 2+ kood[9] * 3) % 11; } if (kontroll == 10) { kontroll = 0; } if (kood[10] == kontroll) { System. out. println("Kontrollnumber on 6ige"); String haigla = ID. substring(7, 9); String synniaastaalgus = ID. substring(0, 1); String synniaastaend = ID. substring(1, 3); String sugu = ID. substring(0, 1); String synnikuu = ID. substring(3, 5); String synnipaev = ID. substring(5, 7); if (sugu.equals("1") || sugu.equals("3") || sugu.equals("5")) { sugu = "*mees"; } else if (sugu.equals("2") || sugu.equals("4") || sugu.equals("6")) { sugu = "*naine"; } else { sugu = "*Sugu ei saa tunnistada"; } if (synniaastaalgus.equals("1") || synniaastaalgus.equals("2")) { synniaastaalgus = "18"; } else if (synniaastaalgus.equals("3") || synniaastaalgus.equals("4")) { synniaastaalgus = "19"; } else if (synniaastaalgus.equals("5") || synniaastaalgus.equals("6")) { synniaastaalgus = "20"; } if (haigla.equals("00") || haigla.equals("01")) { haigla = "Kuressaare Haigla"; } else if (haigla.equals("02") || haigla.equals("03") || haigla.equals("04") || haigla.equals("05") || haigla.equals("06") || haigla.equals("07") || haigla.equals("08") || haigla.equals("09") || haigla.equals("10") || haigla.equals("11") || haigla.equals("12") || haigla.equals("13") || haigla.equals("14") || haigla.equals("15") || haigla.equals("16") || haigla.equals("17") || haigla.equals("18") || haigla.equals("19") || haigla.equals("20") || haigla.equals("21")) { haigla = "Ida-Tallinna Keskhaigla, Hiiumaa, Keila, Rapla haigla"; } else if (haigla.equals("22") || haigla.equals("23") || haigla.equals("24") || haigla.equals("25") || haigla.equals("26")) { haigla = "Ida-Viru Keskhaigla (Kohtla-Järve, endine Jõhvi"; } else if (haigla.equals("27") || haigla.equals("28") || haigla.equals("29") || haigla.equals("30") || haigla.equals("31") || haigla.equals("32") || haigla.equals("33") || haigla.equals("34") || haigla.equals("35") || haigla.equals("36")) { haigla = "Maarjamõisa Kliinikum (Tartu), Jõgeva Haigla"; } else if (haigla.equals("37") || haigla.equals("38") || haigla.equals("39") || haigla.equals("40") || haigla.equals("41")) { haigla = "Narva Haigla"; } else if (haigla.equals("42") || haigla.equals("43") || haigla.equals("44") || haigla.equals("45") || haigla.equals("46")) { haigla = "Pärnu haigla"; } else if (haigla.equals("47") || haigla.equals("48")) { haigla = "Pelgulinna Sünnitusmaja (Tallinn), Haapsalu haigla"; } else if (haigla.equals("49") || haigla.equals("50") || haigla.equals("51")) { haigla = "Järvamaa Haigla (Paide)"; } else if (haigla.equals("52") || haigla.equals("53") || haigla.equals("54") || haigla.equals("55") || haigla.equals("56")) { haigla = "Rakvere, Tapa haigla"; } else if (haigla.equals("57") || haigla.equals("58") || haigla.equals("59")) { haigla = "Valga Haigla"; } else if (haigla.equals("60") || haigla.equals("61") || haigla.equals("62") || haigla.equals("63") || haigla.equals("64")) { haigla = "Viljandi Haigla"; } else if (haigla.equals("65") || haigla.equals("66") || haigla.equals("67") || haigla.equals("68") || haigla.equals("69") || haigla.equals("70") || haigla.equals("71") || haigla.equals("72") || haigla.equals("73")) { haigla = "Lõuna-Eesti Haigla (Võru), Põlva Haigla"; } else { haigla = "Sünnimaja ei saa tunnistada"; //see lihtsalt kontrollimiseks praegu } System. out. println(haigla + sugu + synnikuu + synnipaev + synniaastaalgus + synniaastaend ); } else { System. out. println("Kontroll nr pole 6ige"); } }else{ System. out. println("Kood on vale pikkusega."); } } }
|
|
|
Kommentaarid: 36 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
35 |
|
tagasi üles |
|
 |
kp0041e
HV vaatleja
liitunud: 19.11.2012
|
11.01.2013 23:52:55
|
|
|
Õhtust!
Ma sain lõpuks oma programmi valmis tänu kahele kasutajale foorumist: Redikate ja infidel. Suured tänud teile!
Kui teid huvitab siis töötav kood on siin: http://paste2.org/p/2732333
|
|
tagasi üles |
|
 |
Aulo
HV vaatleja
liitunud: 06.09.2011
|
10.04.2014 18:58:33
|
|
|
Sünniaeg oleks võimalik valideerida kindlamalt kasutades lihtsalt java.text.SimpleDateFormat("yyMMdd") kuupäevaks formateerimist ja ParseException vea püüdmist ja/või vajalikke Apache Commons Lang vms üldlevinud teegis olevaid kuupäevade valideerimise vahendeid (võttes arvesse ka liigaastad jne ehk kas vastav kuupäev on reaalne või mitte) ehk kokkuvõttes asendatav ühe reaga.
Haiglate valideerimise osas: ühest küljest on neid hea valideerida, teisest küljest on see erinevalt muudest andmetest selline teoreetiliselt aja jooksul muutuv ning pidevalt tähelepanu nõudev koht ehk jätaksin selle pigem vaid kontrollnumbri otsustada, sest neid kohti, kus sünnitada tuleb ja kaob pidevalt ning selle tõttu pidevalt Java koodi uuendada oleks tülikas ja kokkuvõttes hakkab siit aja jooksul sellisel kujul vigu tulema ka valiidsete koodide korral. Lisaks on seal ka juba praegu käsitletud vigaselt koodi 70 (inimestele, kellel on elamisloaga probleeme) ning täielikult käsitlemata kood 95 (Eestis sündinud välismaalased).
Sajandi ja soo tuvastamine otseselt ka ei ole isikukoodi valideerimise mõttes vajalik, piisaks kontrollist, kas väärtus on 1-6, järgmiseks sajandiks valmis olles ka 7-8.
Erinevate substringide võtmise asemel võiks kasutada juba olemas olevaid kood[n] positsioonilisi väärtusi.
Kokkuvõttes funktsionaalsust parandades ja loetavust lihtsustades saaks koodi kordi lühemaks.
|
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|