Permalänk

Kontrollsiffra personklass c#

Hej!

Har en uppgift som lyder:
"Uppgiften består i att skapa en egen klass; personklass med följande egenskaper;
förnamn, efternamn och personnummer. Användaren ska i formuläret ange ett förnamn,
efternamn och personnummer i textfält. Du har sedan en metod i klassen som kontrollerar
om personnumret är giltigt enligt någon av algoritmerna nedan samt en metod som kollar
personens kön. Observera att klassen ska innehålla egenskaperna och metoderna enligt
ovan. Tillbaka till formuläret returneras sedan resultatet, ett meddelande om
personnumret är korrekt samt om personen är en man eller kvinna."

Jag ska ta reda på kön vilket jag gör med att kolla den 9onde siffran, vilket jag har fått att fungera. Mitt första problem är att i min GetSex metod kan jag inte använda mig av "Txtpnr.Text". Hur kommer jag åt så jag kan använda den. Kan heller inte använda den i min personklass.

Har börjat på att skapa en person klass med en struct för sakerna jag kommer att använda.
Efter jag har blivit klar med min personklass. Hur printar jag denna till Winformen när användaren skrivit in alla uppgifter och klickar på "registrera".

Ska även skapa en metod som avgör om personnumret är giltligt (idok) med 21-algoritmen. Har kollat på detta forum och andra men inte kommit fram till hur jag ska skapa denna på ett korrekt sätt så det är något som jag ska fixa, tips mottages gärna.

Övriga tips på att förbättra min kod tar jag gärna emot också.

Tack på förhand.
Kod nedanför:

using System; using System.IO.Pipes; using System.Reflection.Metadata.Ecma335; using System.Runtime.CompilerServices; using System.Windows.Forms; namespace Uppgift3 { public partial class Uppgift : Form { public Uppgift() { InitializeComponent(); } class Person { public string forNamn; public string efterNamn; public long personNummer; public string sex; public bool idok; Person person = new Person("lars", "Larsson", 6504038937, "man", true); public Person(string forNamn, string efterNamn, long personNummer, string sex, bool idok) { this.forNamn = forNamn; this.efterNamn = efterNamn; this.personNummer = personNummer; this.sex = sex; this.idok = idok; } public static string GetSex(Person person) { string siffraAsString = TxtPnr.Text.Substring(8, 1); int siffraAsNum = int.Parse(siffraAsString); int result = (siffraAsNum % 2); if (result == 1) { return "Man"; } else { return "Kvinna"; } } public static bool Idok { } } private void BtnReg_Click(object sender, EventArgs e) { string förNamn = TxtForNamn.Text; string efterNamn = TxtEfterNamn.Text; string personNummer = TxtPnr.Text; if (personNummer.Length == 10) { lblRes.Text = "Förnamn: " + förNamn + "\nEfternamn: " + efterNamn + "\nPersonnummer: " + personNummer; lblKon.Visible = true; } else { lblRes.Text = "Ange personnummer med 10 siffror"; lblKon.Visible = false; } // Denna ska jag ta bort när jag får den att fungera i "GetSex" string siffraAsString = TxtPnr.Text.Substring(8, 1); int siffraAsNum = int.Parse(siffraAsString); int result = (siffraAsNum % 2); if (result == 1) { lblKon.Text = "Man"; } else { lblKon.Text = "Kvinna"; } } private void BtnAvsluta_Click(object sender, EventArgs e) { this.Close(); } private void avslutaProgrammetToolStripMenuItem_Click(object sender, EventArgs e) { this.Close(); } private void registreraPersonToolStripMenuItem_Click(object sender, EventArgs e) { LblFNamn.Visible = true; LblENamn.Visible = true; LblPNummer.Visible = true; lblRes.Visible = true; lblInst.Visible = false; lblUppg.Visible = true; TxtForNamn.Visible = true; TxtEfterNamn.Visible = true; TxtPnr.Visible = true; BtnAvsluta.Visible = true; BtnReg.Visible = true; } } }

Permalänk
Medlem

Lite tips är att Person-klassen troligtvis inte bör ha några metoder som är static, utan GetSex bör vara en vanlig metod som inte tar något argument. static-metoder är s.k. klassmetoder, d.v.s. de hör till klassen istället för till instanser av klassen.

Sen är frågan om GetSex ens borde existera. Som du har nu så tar du in kön som argument i konstruktorn, och sen ignorerar du det eftersom du istället använder personnummret för att ta reda på det. Du bör antingen härleda kön direkt i konstruktorn och tilldela sex baserat på personnummret, eller strunta i att ha en sex-variabel och ha en metod som härleder det när någon frågar.

Raden:

Person person = new Person("lars", "Larsson", 6504038937, "man", true);

bör för övrigt inte finnas i Person-klassen, det innebär ju att en person har en person som har en person etc. Du bör ha en instans av Person i själva huvudklassen istället som du använder för att lagra uppgifterna om personen.

Permalänk
Medlem

Ni har ju inte läst uppgiften. Personklassen ska bara innehålla tre egenskaper, så det är ju lämpligt att man enbart skickar in dessa i konstruktorn. Sedan en metod som räknar ut om personnumret är korrekt och om personen är man/kvinna (enligt personnumret) och returnerar en sträng. Det är allt som behövs.

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem

Något ointuitivt kanske, men ett personnummer är oftast enklast att hantera som en sträng hela vägen. Bindestrecket är dessutom informationsbärare, enligt folkbokföringslagen visar det att födelsedatumet gäller de senaste 100 åren (annars används ett +), se 18:e paragrafen. Dessutom finns reservnummer och utländska personnummer med bokstäver som man av legacy-skäl kan bli tvungen att stoppa in i samma databasfält, men det är ju orelevant här

Siffran som avgör kön samt alla siffror som används vid beräkningen av kontrollsiffran måste dock hanteras som tal, men det kan man ju göra exakt ett tecken i taget. Skatteverkets förklaring på hur kontrollsiffran beräknas finns här. Algoritmen kallas även Luhn-algoritmen, vilket man kan googla på om man tycker att Skatteverkets förklaring suger (vilket den gör eftersom den saknar exempel). Mitt tips är att se till att testa specialfallet i sista punkten i Skatteverkets beskrivning av algoritmen.