Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C#: HETUn tarkastus

JaTu1984 [28.11.2018 11:16:10]

#

Löysin verkosta oheisen koodin:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace henktunlasku
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("Anna henkilötunnus kokonaisena tai ilman viimeistä merkkiä (PPKKVV-ZZZQ)");
                Console.Write("tai tyhjä lopettaaksesi: ");
                string tunnusSyöte = Console.ReadLine().ToUpper();

                //Poistutaan silmukasta jos tyhjä syöte
                if (string.IsNullOrWhiteSpace(tunnusSyöte)) break;

                if (new Regex("\\d{6}[-+A]\\d{3}[0-9A-Y]?").IsMatch(tunnusSyöte))
                {
                    Console.WriteLine("Syöte on oikeassa muodossa, siirrytään laskemaan se");

                    var tarkiste = laskeTarkiste(tunnusSyöte);
                    string sukupuoli = (tunnusSyöte[9] % 2 == 0) ? "nainen" : "mies";

                    if (tunnusSyöte.Length == 10)
                    {
                        Console.WriteLine("Tunnukseen tuleva tarkistusmerkki on " + tarkiste);
                        Console.WriteLine("ja tunnuksen haltija on " + sukupuoli);
                    }
                    else if (tunnusSyöte[10] == tarkiste)
                        Console.WriteLine("Tunnus on oikein ja sen haltija on " + sukupuoli);
                    else
                        Console.WriteLine("Virheellinen tunnus!");
                    /* Jos tunnus on väärin, niin ei ole järkevää ilmoittaa
                       sukupuolta, sillä voihan olla että juuri ko. merkki
                       on väärin. */
                }
                else
                {
                    Console.WriteLine("Syöte ei ollut oikeassa muodossa!");
                }
                Console.WriteLine();
            }
        }

        static char laskeTarkiste(string tunnus)
        {
            int luku = int.Parse(tunnus.Substring(0, 6) + tunnus.Substring(7, 3));
            //tarkistusmerkit
            return "0123456789ABCDEFHJKLMNPRSTUVWXY"[luku % 31];
        }
    }

Kuitenkin tehtävänannon mukaan koodiin tulisi lisätä/koodi tulisi huomioida, millä vuosisadalla syöttämä on syntynyt (+ = 1800-luku, - = 1900-luku, A = 2000-luku jne.)

Lisäksi ohjelman tulisi huomioida, jos käyttäjä syöttää "mahdottoman päivämäärän", esim 33.03.0000, että tulee virheilmoitus päivämäärästä. Sama, jos kuukausi on 13 tai enemmän.

Tällä hetkellä koodi on siis vajaa tehtävänannon mukaisesti. Palautus tehtävälle on nyt sunnuntaina.

eq [28.11.2018 12:15:50]

#

Missä vaiheessa käyttäjä oikein syöttää päivämäärän muodossa p.k.v? Ohjelmahan kysyy henkilötunnusta.

(Sikäli kun kyse on henkilötunnuksen määrittämästä päivämäärästä, joka ei tietenkään voi esimerkin mukaisesti olla vuodelta 0, riittää kun tarkastelee tunnuksen seitsemää ensimmäistä merkkiä; 2 ensimmäistä määrittävät päivän, 2 seuraavaa kuukauden ja kolme viimeistä vuoden. Koska et varsinaisesti esittänyt yhtään kysymystä, en oikein osaa sanoa missä ongelma tässä tilanteessa on.)

maka78 [28.11.2018 13:11:52]

#

Näyttäis siltä että käyttäjältä pitänee kysyä myös syntymäaika esim. muodossa p.k.vvvv tai pp.kk.vvvv ja tarkistaa sen järkevyys.
Tarkistaa että syötetty kk ei ole pienempi kuin yksi eikä suurempi kuin 12. Periaatteessa pitäisi myös tarkistaa onko päivämäärä mahdollinen ko. kuussa, mutta tätähän ei ilmeisesti tehtävänannossa pyydetty? Lisäksi syntymävuosi ei voisi olla tulevaisuudessa tai pienempi kuin 1 (käytännössä lienee kuitenkin niin, että yli 150 vuotiaita tuskin on olemassa.. tosin ei pidä olettaa ;) ). Syötetystä vuosiluvusta taas voidaan suoraan tarkistaa pitääkö syötetyn hetun välimerkki paikkansa.
Tuossa ei liene kuitenkaan koko tehtäväksi anto?

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta