C# personnummer koll, algoritm windows console Applikation

Permalänk
Medlem

C# personnummer koll, algoritm windows console Applikation

HejHej. Håller på med en uppgift där man ska göra ett formulär. med 3st textboxar, 1st textbox med multiline, och en knapp.
detta har jag gjort. att fått det att skriva ut innehållet som är förnamn, efternamn, samt personnummer.

Jag ska nu göra en personnummerkontroll, typ 21-algoritm eller kontollsiffan. för att räkna ut om det är en kvinna eller man.

men det jag har fastnat på nu är hur jag ska skriva ut algoritmen i programet som det blir rätt. är tacksam för lite tips. är bara en nybörjare som sagt på det här.

som tex:
kontrolltal:
2*5=10 Delsumma=1+0=1
1*0=0 Delsumma=0
2*0=0 Delsumma=0
1*3=3 Deslumma=3
2*0=0 Deslumma=0
1*5=5 Deslumma=5
2*8=16 Delsumma=1+6=7
1*9=9 Delsumma=9
2*7=14 Delsumma=1+4=5
1*0=0 Delsumma=0

Lägg ihop alla delsummor:
Summa=1+0+0+3+0+5+7+9+5+0=30

Om Summa % 10 är lika med noll, dvs om det är jämnt delbart med 10 så är personnumret OK.

Jag har bara kommit så här långt så det är en del kvar.

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication11 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string förNamn; string efterNamn; string personNummer; förNamn = textBox1.Text; efterNamn = textBox2.Text; personNummer = textBox3.Text; textBox4.Text = förNamn + " " + efterNamn + " " + personNummer; } private void Form1_Load(object sender, EventArgs e) { } } }

Och denna sen ska in.

personNummer = textBox3.Text; if (personNummer.Length > 0) { for (int i = 0; i < personNummer.Length; i++) { if (personNummer[i] % 2 == 0) { Jämnt } else { Ojämt } } } }

Permalänk
Inaktiv

Det ser ut som du börjat helt korrekt.

Du kanske vill spara undan en variabel att lägga alla talen i, så att du kan ta något i stil med

för siffra i
tal = i * 1 || 2
summa += tal / 10 + tal % 10

return summa % 10 == 0

Permalänk
Medlem

tackar så mycket för tipset.

Permalänk
Medlem

Kan någon säga vad jag gör för fel??

Får inte detta fungerar kan någon ge något tips som kan detta, är helt ny på detta. tummen mitt i hand om man säger så.

sing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication9 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string förNamn; string efterNamn; string personNummer; förNamn = textBox1.Text; efterNamn = textBox2.Text; personNummer = textBox3.Text; textBox4.Text = förNamn + " " + efterNamn + " " + personNummer; if (luhn(textBox3.Text)) textBox4.Text = "Personummer är Rätt:"; else textBox4.Text = "Personummer är: Fel"; } static bool luhn(string personNummer) { int sum = 0; for (int i = 0; i < personNummer.Length; i++) { int temp = (personNummer[i] - '0') << (1 - (i & 1)); if (temp > 9) temp -= 9; sum += temp; } return (sum % 10) == 0; } private void OKbutton1_Click(object sender, EventArgs e) { string siffraAsString = textBox3.Text.Substring(8, 1); int siffraAsNum = int.Parse(siffraAsString); int result = (siffraAsNum % 2); if (result == 1) { textBox5.Text = "Är en Man"; } else { textBox5.Text = " Är en Kvinna"; } } private void Form1_Load(object sender, EventArgs e) { } } }

Permalänk
Hedersmedlem

Om det inte fungerar är det bra om du säger vad som går fel också, att bara kolla i koden utan vägledning kan bli lite tråkigt.

Permalänk
Medlem

Ursäkta glömde beskriva det.

det första felet som jag märker,
Är när jag skriver in Namn, efternamn, personnummer,
så blir ut skriften i textbox4 personnummer är fel.
det är det enda som kommer upp där. innan jag jag till mer i programet, det som jag la in här först, då skriv det ut namn. efternamn, och personnummret man hade skrivit in.

Det kommer inget fel meddelande.

Permalänk
Medlem
Skrivet av dk79:

det första felet som jag märker,
Är när jag skriver in Namn, efternamn, personnummer,
så blir ut skriften i textbox4 personnummer är fel.
det är det enda som kommer upp där. innan jag jag till mer i programet, det som jag la in här först, då skriv det ut namn. efternamn, och personnummret man hade skrivit in.

Det kommer inget fel meddelande.

Personligen tycker jag att felbeskrivningen är lite rörig. Men jag tog en kort titt på koden. Ser då att ni tilldelar textBox4.Text värde på två ställen. Först:

textBox4.Text = förNamn + " " + efterNamn + " " + personNummer;

Sen så kör ni if-satsen där tilldelning sker igen, ni skriver alltså över det värdet ni nyss satt.

if (luhn(textBox3.Text)) textBox4.Text = "Personummer är Rätt:"; else textBox4.Text = "Personummer är: Fel";

Jag antar att det är en felaktighet.

Permalänk
Medlem

Parameteröverföring

Hej, tackar så mycket. så nu funkar den.

Har ett annat problem och skulle behöva något tips/råd om detta.

Jag ska nu gör en parameteröverföring till en klass för person dit man flyttar metoderna för att kolla pnersonnummer och kön, samt har egenskaper för förnamn, efternamn och personnummer.

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication9 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string förNamn; string efterNamn; string personNummer; förNamn = textBox1.Text; efterNamn = textBox2.Text; personNummer = textBox3.Text; textBox4.Text = förNamn + " " + efterNamn + " " + personNummer; { if (luhn(textBox3.Text)) textBox5.Text = "Man"; else textBox5.Text = "Kvinna"; } } static bool luhn(string personNummer) { int sum = 0; for (int i = 0; i < personNummer.Length; i++) { int temp = (personNummer[i] - '0') << (1 - (i & 1)); if (temp > 9) temp -= 9; sum += temp; } return (sum % 10) == 0; } private void OKbutton1_Click(object sender, EventArgs e) { string siffraAsString = textBox3.Text.Substring(8, 1); int siffraAsNum = int.Parse(siffraAsString); int result = (siffraAsNum % 2); if (result == 1) { textBox5.Text = "Är en Man"; } else { textBox5.Text = " Är en Kvinna"; } } private void Form1_Load(object sender, EventArgs e) { }

Permalänk
Hedersmedlem

Igen, vad är det du har problem med exakt? Jag ser bara att du beskrev vad du ska göra men inte varför det inte är gjort.

Permalänk
Medlem
Skrivet av dk79:

Hej, tackar så mycket. så nu funkar den.

Har ett annat problem och skulle behöva något tips/råd om detta.

Jag ska nu gör en parameteröverföring till en klass för person dit man flyttar metoderna för att kolla pnersonnummer och kön, samt har egenskaper för förnamn, efternamn och personnummer.

Lite svårtolkat med vad du vill uppnå. Jag tolkar det som att du vill göra en Person-klass som har egenskaperna förnamn,efternamn,personnummer samt valideringsmetod för personnummer och kön?

Rent spontant vill jag bara säga, gör den då!
Enklare klass än så hittar man nästan inte.

public class Person { //property för förnamn //property för efternamn //property för personnummer //metod för att validera personnummer //metod för att identifiera kön }

glömde code-tagg
Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

Jag har påbörjat fortsättningen på samma kod. Jag vill ju kunna läsa in från metoderna men ser inte vart jag gör fel. Hållt på med det i en vecka nu.

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Uppgift3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Person p = new Person();//Skapa en instans p av klassen Person
bool PnrOK;
string firstname;
string lastname;
string persnr;

firstname = textbox1.Text;
lastname = textbox2.Text;
persnr = textbox3.Text;
textbox4.Text = "Förnamn " + firstname + "\nEfternamn " + lastname + "\nPersonr: " + persnr;

VIll att den ska vara i metoden public bool luhn/*
if (luhn(textbox3.Text))
textbox5.Text = "Personummer är Rätt:";

else
textbox5.Text = "Personummer är: Fel";
*/

p.Fornamn = Convert.ToString(textbox1.Text);
p.Efternamn = Convert.ToString(textbox2.Text);
p.Personnummer = Convert.ToString(textbox3.Text);

p.kollaKön();

PnrOK = p.luhn();

}

class Person
{
private string fornamn;
private string efternamn;
private string personnummer;
private int sifferSumma;

public String Fornamn
{
get { return fornamn; }
set { fornamn = value; }

}

public String Efternamn
{

get { return efternamn; }
set { efternamn = value; }
}

public String Personnummer
{
get { return personnummer; }
set { personnummer = value; }
}

public bool luhn(string personNummer)
{

int sum = 0;
for (int i = 0; i < personNummer.Length; i++)
{
int temp = (personNummer[i] - '0') << (1 - (i & 1));
if (temp > 9) temp -= 9;
sum += temp;
}
return (sum % 10) == 0;

}

public string kollaKön() {

string siffraAsString = textBox3.Text.Substring(8, 1);

int siffraAsNum = int.Parse(siffraAsString);
int result = (siffraAsNum % 2);

if (result == 1)
{
textBox5.Text = "Är en Man";
}
else
{
textBox5.Text = " Är en Kvinna";
}
}

Permalänk
Medlem

Ingen som kan hjälpa?

Permalänk
Medlem

Har inte kollat så noga men saknar du inte en konstruktor i din Person-klass?

public Person()
{
//Tom konstruktor
}

Alterantivt:

public Person(string forNamn, string efterNamn, string personNummer)
{
Fornamn = forNamn;
Efternamn = efterNamn;
Personnummer = personNummer;
}

Edit; snabb-kommando i Visual Studio är ctor + TAB

Visa signatur

"Voilà! In view, a humble vaudevillian veteran, cast vicariously as both victim and villain by the vicissitudes of Fate. This visage, no mere veneer of vanity, is a vestige of the vox populi, now vacant, vanished. However, this valorous visitation of a by-gone vexation, stands vivified and has vowed to vanquish these venal and virulent vermin van-guarding vice and vouchsafing the violently vicious and voracious violation of volition."

Permalänk

Lite av en nybörjare i programmering och fårstår inte hur metoden fungerar:

static bool luhn(string personNummer) { int sum = 0; for (int i = 0; i < personNummer.Length; i++) { int temp = (personNummer[i] - '0') << (1 - (i & 1)); if (temp > 9) temp -= 9; sum += temp; } return (sum % 10) == 0;

någon vänlig som kan förklara för mig ?

mvh n00b

Permalänk
Hedersmedlem
Skrivet av smekaren86:

Lite av en nybörjare i programmering och fårstår inte hur metoden fungerar:

static bool luhn(string personNummer) { int sum = 0; for (int i = 0; i < personNummer.Length; i++) { int temp = (personNummer[i] - '0') << (1 - (i & 1)); if (temp > 9) temp -= 9; sum += temp; } return (sum % 10) == 0;

någon vänlig som kan förklara för mig ?

Algoritmen går ut på att omväxlande multiplicera personnummrets siffror med 1 och två, summera produkterna (och, om de är större än 9, istället summera den första och den andra siffran) och slutligen kontrollera om summan är jämnt delbar med 10 (vilket i så fall tyder på att nummret är korrekt).

static bool luhn(string personNummer) { int sum = 0; for (int i = 0; i < personNummer.Length; i++) //Stega igenom personnummret tecken för tecken { int temp = (personNummer[i] - '0') /*Beräkna varje teckens värde (0-9) från tecknet ('0'-'9') genom att dra ifrån '0'. '0'-'0' = 0, '1'-'0' = 1, osv. */ << (1 - (i & 1)); //Multiplicera med två varannan gång (genom att skifta ett steg åt vänster när i är jämn) if (temp > 9) temp -= 9;//Tvåsiffriga tal skall delas upp: 10 => 1 + 0 = 1, 12 => 1+2 = 3, 18 => 1+8 = 9. Samma resultat erhålles genom att subtrahera 9. sum += temp; } return (sum % 10) == 0; //Beräkna resten vid division med 10 och returnera true om denna är 0.

Permalänk
Medlem

Fortsätter på tråden om det är ok

Jag sitter med samma uppgift och mitt problem är att jag inte fattar hur jag ska implementera personklassen. Jag lyckades hitta en annan som hade klarat uppgiften, men jag förstod inte hur den personen hade kopplat ihop allt. Under Recapen har jag med koden med allt förutom personklass.

Recap: Uppgiften går ut på att man ska skapa en personklass som innehåller förnamn, efternamn samt personnummer. Därefter ska man ange sina uppgifter och så ska man få reda på om personnumret stämmer osv.

Inlämningsuppgift3.cs

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Identity : Form { public Identity() { InitializeComponent(); } public void button1_Click(object sender, EventArgs e) //Kör själva beräkningen vid klickning. { label6.Text = "Resultat:"; //Skriver ut "Resultat" i den dolda rutan. string fname = textBox1.Text; string lname = textBox2.Text; string pNumber = textBox3.Text; if (pNumber.Length == 13) //Kontrollerar så att formatet är korrekt, annars får man felmeddelande. { //Här startar beräkningarna så att man i slutändan får ut ett giltigt personnummer. int a0 = pNumber[2] - 48; //Eftersom pNumber[] är en string så får jag ta talet - 0 för att få rätt sluttal. Ex; "2" - "0" = 50- 48 = 2. int a1 = pNumber[3] - 48; int a2 = pNumber[4] - 48; int a3 = pNumber[5] - 48; int a4 = pNumber[6] - 48; int a5 = pNumber[7] - 48; int a6 = pNumber[9] - 48; int a7 = pNumber[10] - 48; int a8 = pNumber[11] - 48; int a9 = pNumber[12] - 48; //Eftersom det endast är värdet på a0, a6 och a8 som kan överstiga 10 så räcker det att köra nedanstående för dem. if (a0 * 2 >= 10) { string a01 = (a0 * 2).ToString();//Konverterar det multiplicerade talet till en string. a0 = a01[0] + a01[1] - 96; //Lägger ihop char 1 och 2 till en summa - 2*"0". } else { a0 = a0 * 2; //Multiplicera med 2. } if (a6 * 2 >= 10) { string a61 = (a6 * 2).ToString(); a6 = a61[0] + a61[1] - 96; } else { a6 = a6 * 2; } if (a8 * 2 >= 10) { string a81 = (a8 * 2).ToString(); a8 = a81[0] + a81[1] - 96; } else { a8 = a8 * 2; } double value0 = a0 + a1 + a3 + a5 + a6 + a7 + a8 + a9 + ((a2 + a4) * 2);//Beräknar summan av samtliga deltal. int p = pNumber[11] - 48; //Könskontroll! char y1 = pNumber[0];//Millenium. char y2 = pNumber[1];//Sekel. char y3 = pNumber[2];//Decennium. char y4 = pNumber[3];//År. double d = value0 / 10;//Bara en förenkling av value0. if ((d == 1) || (d == 2) || (d == 3) || (d == 4) || (d == 5) || (d == 6) || (d == 7))//Om d är ett heltal, kör på! Annars felmeddelande. { if ((p == 1) || (p == 3) || (p == 5) || (p == 7) || (p == 9))//Könskontroll för udda siffror. { //Skriver ut texten i den nedersta rutan. richTextBox1.Text = ("Förnamn: " + fname + "\n" + "Efternamn: " + lname + "\n" + "Juridiskt kön: Man" + "\n" + "Födelseår: " +y1+y2+y3+y4); } else //Jämn siffra = Kvinna { //Skriver ut texten i den nedersta rutan. richTextBox1.Text = ("Förnamn: " + fname + "\n" + "Efternamn: " + lname + "\n" + "Juridiskt kön: Kvinna" + "\n" + "Födelseår: " + y1+y2+y3+y4); } } else //Felmeddelande { richTextBox1.Text = ("Felaktigt personnummer!" + "\n" + "Försök igen!"); } } else //Felmeddelande { richTextBox1.Text = ("Felaktigt personnummer!"+"\n" + "Försök igen!"); } } private void button2_Click(object sender, EventArgs e) //Stänger programmet. { this.Close(); } } } //Slut!

Program.cs

using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace WindowsFormsApplication1 { static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Identity()); } } }

Inlämningsuppgift3.Designer.cs

namespace WindowsFormsApplication1 { partial class Identity { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.textBox1 = new System.Windows.Forms.TextBox(); this.textBox2 = new System.Windows.Forms.TextBox(); this.textBox3 = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); this.button1 = new System.Windows.Forms.Button(); this.label4 = new System.Windows.Forms.Label(); this.label5 = new System.Windows.Forms.Label(); this.richTextBox1 = new System.Windows.Forms.RichTextBox(); this.label6 = new System.Windows.Forms.Label(); this.button2 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // Välkommen! // this.label4.AutoSize = true; this.label4.Font = new System.Drawing.Font("Kristen ITC", 24F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label4.ForeColor = System.Drawing.Color.Crimson; this.label4.Location = new System.Drawing.Point(10, 5); this.label4.Name = "label4"; this.label4.Size = new System.Drawing.Size(205, 44); this.label4.TabIndex = 7; this.label4.Text = "Välkommen!"; // // Uppmaning att skriva sitt personnummer i textrutorna nedan. // this.label5.AutoSize = true; this.label5.Location = new System.Drawing.Point(2, 48); this.label5.Name = "label5"; this.label5.Size = new System.Drawing.Size(217, 13); this.label5.TabIndex = 8; this.label5.Text = "Skriv in ditt namn och personnummer nedan."; // // Uppmanar personen att skriva sitt förnamn! // this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(1, 87); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(51, 13); this.label1.TabIndex = 3; this.label1.Text = "Förnamn:"; // // Skriv ditt efternamn. // this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(1, 109); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(58, 13); this.label2.TabIndex = 4; this.label2.Text = "Efternamn:"; // // Skriv ditt personnummer i rätt format. // this.label3.AutoSize = true; this.label3.Location = new System.Drawing.Point(1, 127); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(94, 26); this.label3.TabIndex = 5; this.label3.Text = "Personummer:\n(ååååmmdd - xxxx)"; // // Här skriver man sitt förnamn. // this.textBox1.Location = new System.Drawing.Point(95, 80); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(118, 20); this.textBox1.TabIndex = 0; // // Efternamn... // this.textBox2.Location = new System.Drawing.Point(95, 106); this.textBox2.Name = "textBox2"; this.textBox2.Size = new System.Drawing.Size(118, 20); this.textBox2.TabIndex = 1; // // Personnummer... // this.textBox3.Location = new System.Drawing.Point(95, 130); this.textBox3.Name = "textBox3"; this.textBox3.Size = new System.Drawing.Size(118, 20); this.textBox3.TabIndex = 2; // // Klicka på kör och programmet körs. // this.button1.Location = new System.Drawing.Point(1, 156); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(212, 23); this.button1.TabIndex = 6; this.button1.Text = "Kör!"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // Här dyker ett hemligt ord upp vid klickning på Kör! // this.label6.AutoSize = true; this.label6.Font = new System.Drawing.Font("Georgia", 14.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label6.Location = new System.Drawing.Point(1, 185); this.label6.Name = "label6"; this.label6.Size = new System.Drawing.Size(0, 23); this.label6.TabIndex = 10; // // Här skrivs resultatet ut. // this.richTextBox1.BackColor = System.Drawing.SystemColors.ButtonHighlight; this.richTextBox1.Location = new System.Drawing.Point(1, 210); this.richTextBox1.Name = "richTextBox1"; this.richTextBox1.Size = new System.Drawing.Size(212, 159); this.richTextBox1.TabIndex = 9; this.richTextBox1.Text = ""; // // Avsluta programmet // this.button2.Location = new System.Drawing.Point(1, 375); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(212, 23); this.button2.TabIndex = 11; this.button2.Text = "Avsluta"; this.button2.UseVisualStyleBackColor = true; this.button2.Click += new System.EventHandler(this.button2_Click); // // Identity // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(224, 419); this.Controls.Add(this.button2); this.Controls.Add(this.label6); this.Controls.Add(this.richTextBox1); this.Controls.Add(this.label5); this.Controls.Add(this.label4); this.Controls.Add(this.button1); this.Controls.Add(this.label3); this.Controls.Add(this.label2); this.Controls.Add(this.label1); this.Controls.Add(this.textBox3); this.Controls.Add(this.textBox2); this.Controls.Add(this.textBox1); this.Name = "Identity"; this.Text = "ID-Check"; this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.TextBox textBox2; private System.Windows.Forms.TextBox textBox3; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label3; private System.Windows.Forms.Button button1; private System.Windows.Forms.Label label4; private System.Windows.Forms.Label label5; private System.Windows.Forms.RichTextBox richTextBox1; private System.Windows.Forms.Label label6; private System.Windows.Forms.Button button2; } }

Permalänk
Medlem
Skrivet av nexxann:

Jag sitter med samma uppgift och mitt problem är att jag inte fattar hur jag ska implementera personklassen. Jag lyckades hitta en annan som hade klarat uppgiften, men jag förstod inte hur den personen hade kopplat ihop allt. Under Recapen har jag med koden med allt förutom personklass.

Recap: Uppgiften går ut på att man ska skapa en personklass som innehåller förnamn, efternamn samt personnummer. Därefter ska man ange sina uppgifter och så ska man få reda på om personnumret stämmer osv.

Du sätter redan variabler till förnamn, efternamn och personnummer när man klickar på button1. Det är bara att du instansierar objektet och sätter objektets variabler istället samt att du flyttar verifieringen in till Person-klassen.

Hur Person-klassen kan se ut har jag kommenterat tidigare i tråden.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

Tjena! Sitter fortfarande med den här uppgiften och har ett error som jag inte riktigt förstår problemet med. Hoppas att någon har här något tips!

Error: The type or namespace name 'Identity' could not be found (are you missing a using directive or an assembly reference?)

Program.cs

using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace WindowsFormsApplication1 { static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Identity()); } } }

Form1.cs

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Inlämningsuppgift3 { public partial class Identity : Form { public struct Person // En struct där de datatyper som ska användas läggs till. { public double idok; public string fname; public string lname; public string id; public string sex; public string year; public string fyear; } public Identity() { InitializeComponent(); } static Person[] person = new Person[1]; // Skapar en vektor med enbart en plats, denna kommer att spara uppgifterna som matas in. public Person ReadPerson() //Metoden ReadPerson läser in samtliga uppgifter, vissa genom inmatning, andra genom att anropa andra metoder. { Person p = new Person(); p.fname = textBox1.Text; //Förnamn läses in via textruta ett. p.lname = textBox2.Text; //Efternamn via ruta två. p.id = textBox3.Text; //Personnummer via ruta tre. p.sex = GetGender(p); //Kör metoden som kontrollerar könssiffran. p.fyear = YTS(p); //Kör en metod som koverterar årtalet till en string. p.year = YOB(p); //Skriver ut födelseåret. p.idok = CheckID(p); //Kontrollerar så att personnumret stämmer. return p; } public static string GetGender(Person p) //GetGender avgör om könssiffran är jämnt delbar med två. { int a = p.id[8] - 48; if ((a % 2) == 1) //Om nej, juridiskt kön = Man. { return "Man"; } else // Om ja, juridiskt kön = Kvinna. { return "Kvinna"; } } public static string YTS(Person p) //Konverterar de två första charsen till en string. { char y1 = p.id[0]; char y2 = p.id[1]; return new string(new char[] { y1, y2 }); } public static string YOB(Person p) //Läser in stringen och konverterar denna till ett tal. { int z = int.Parse(p.fyear); ; if (z < 13) // Om talet är mindre än 13 så är personen född på 2000-talet.(Nästan säkert...) { char y4 = p.id[0]; char y5 = p.id[1]; return new string(new char[] { '2', '0', y4, y5 }); } else //Annars är personen född på 1900-talet. { char y3 = p.id[0]; char y4 = p.id[1]; return new string(new char[] { '1', '9', y3, y4 }); } } public static double CheckID(Person p) { int value = 0; for (int i = 0; i < p.id.Length; i++) //Gå igenom hela personnumret för varje i. { int t = (p.id[i] - 48) //Beräkna varje teckens värde genom att subtrahera 48. << (1 - (i & 1)); // Multiplicera med två varannan gång genom att skrifta ett steg åt vänster för jämna i. if (t > 9) t = t - 9; // Om talet är större än 9 så får man subtrahera 9. Siffersumman blir alltid talet - 9. value += t; // Adderar talen. } return (value % 10); // Returnerar resten från talet dividerat med 10. För att personnumret ska vara giltigt måste resten var 0. } private void button1_Click(object sender, EventArgs e) //Klicka på knappen och ovanstående metoder körs. { richTextBox1.Text = "Resultat:"; //Skriver ut resultat i den dolda rutan. string a = textBox3.Text; //Läser snabbt in personnumret för att sedan avgöra dess längd. if (a.Length == 10) //Kontrollerar personnummrets längd. Om längden är 10 så är det godkänt. { person[0] = ReadPerson(); //Kör metoden Readperson. foreach (Person p in person) { if (p.idok == 0) //Om personnumret är giltigt så skriver vi ut uppgifterna. { richTextBox1.Text = ("Förnamn: " + p.fname + "\n" + "Efternamn: " + p.lname + "\n" + "Juridiskt kön: " + p.sex + "\n" + "Födelseår: " + p.year); } else // Felaktigt personnummer om värdet inte är jämnt delbart med 10. { richTextBox1.Text = ("Felaktigt personnummer, försök igen!"); } } } else //Felaktigt personnummer om antalet tecken är fel. { richTextBox1.Text = ("Felaktigt personnummer, försök igen!"); } } private void button2_Click(object sender, EventArgs e) //Stänger programmet. { this.Close(); } } }

Form1.Designer.cs

namespace Inlämningsuppgift3 { partial class Identity { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.textBox1 = new System.Windows.Forms.TextBox(); this.textBox2 = new System.Windows.Forms.TextBox(); this.textBox3 = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label(); this.button1 = new System.Windows.Forms.Button(); this.label4 = new System.Windows.Forms.Label(); this.label5 = new System.Windows.Forms.Label(); this.richTextBox1 = new System.Windows.Forms.RichTextBox(); this.label6 = new System.Windows.Forms.Label(); this.button2 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // Välkommen! // this.label4.AutoSize = true; this.label4.Font = new System.Drawing.Font("Kristen ITC", 24F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label4.ForeColor = System.Drawing.Color.Crimson; this.label4.Location = new System.Drawing.Point(10, 5); this.label4.Name = "label4"; this.label4.Size = new System.Drawing.Size(205, 44); this.label4.TabIndex = 7; this.label4.Text = "Välkommen!"; // // Uppmaning att skriva sitt personnummer i textrutorna nedan. // this.label5.AutoSize = true; this.label5.Location = new System.Drawing.Point(2, 48); this.label5.Name = "label5"; this.label5.Size = new System.Drawing.Size(217, 13); this.label5.TabIndex = 8; this.label5.Text = "Skriv in ditt namn och personnummer nedan."; // // Uppmanar personen att skriva sitt förnamn! // this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(1, 87); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(51, 13); this.label1.TabIndex = 3; this.label1.Text = "Förnamn:"; // // Skriv ditt efternamn. // this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(1, 109); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(58, 13); this.label2.TabIndex = 4; this.label2.Text = "Efternamn:"; // // Skriv ditt personnummer i rätt format. // this.label3.AutoSize = true; this.label3.Location = new System.Drawing.Point(1, 127); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(94, 26); this.label3.TabIndex = 5; this.label3.Text = "Personummer:\n(ååååmmdd - xxxx)"; // // Här skriver man sitt förnamn. // this.textBox1.Location = new System.Drawing.Point(95, 80); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(118, 20); this.textBox1.TabIndex = 0; // // Efternamn... // this.textBox2.Location = new System.Drawing.Point(95, 106); this.textBox2.Name = "textBox2"; this.textBox2.Size = new System.Drawing.Size(118, 20); this.textBox2.TabIndex = 1; // // Personnummer... // this.textBox3.Location = new System.Drawing.Point(95, 130); this.textBox3.Name = "textBox3"; this.textBox3.Size = new System.Drawing.Size(118, 20); this.textBox3.TabIndex = 2; // // Klicka på kör och programmet körs. // this.button1.Location = new System.Drawing.Point(1, 156); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(212, 23); this.button1.TabIndex = 6; this.button1.Text = "Kör!"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // Här dyker ett hemligt ord upp vid klickning på Kör! // this.label6.AutoSize = true; this.label6.Font = new System.Drawing.Font("Georgia", 14.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label6.Location = new System.Drawing.Point(1, 185); this.label6.Name = "label6"; this.label6.Size = new System.Drawing.Size(0, 23); this.label6.TabIndex = 10; // // Här skrivs resultatet ut. // this.richTextBox1.BackColor = System.Drawing.SystemColors.ButtonHighlight; this.richTextBox1.Location = new System.Drawing.Point(1, 210); this.richTextBox1.Name = "richTextBox1"; this.richTextBox1.Size = new System.Drawing.Size(212, 159); this.richTextBox1.TabIndex = 9; this.richTextBox1.Text = ""; // // Avsluta programmet // this.button2.Location = new System.Drawing.Point(1, 375); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(212, 23); this.button2.TabIndex = 11; this.button2.Text = "Avsluta"; this.button2.UseVisualStyleBackColor = true; this.button2.Click += new System.EventHandler(this.button2_Click); // // Identity // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(224, 419); this.Controls.Add(this.button2); this.Controls.Add(this.label6); this.Controls.Add(this.richTextBox1); this.Controls.Add(this.label5); this.Controls.Add(this.label4); this.Controls.Add(this.button1); this.Controls.Add(this.label3); this.Controls.Add(this.label2); this.Controls.Add(this.label1); this.Controls.Add(this.textBox3); this.Controls.Add(this.textBox2); this.Controls.Add(this.textBox1); this.Name = "Identity"; this.Text = "ID-Check"; this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.TextBox textBox2; private System.Windows.Forms.TextBox textBox3; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label3; private System.Windows.Forms.Button button1; private System.Windows.Forms.Label label4; private System.Windows.Forms.Label label5; private System.Windows.Forms.RichTextBox richTextBox1; private System.Windows.Forms.Label label6; private System.Windows.Forms.Button button2; } }

Permalänk
Avstängd

Ställer mig en fråga när jag ser din kod
Varför köra ett OO-språk när du inte riktigt verkar gilla det konceptet?

Skicka runt structar till olika metoder är verkligen inte något som hör till ett OO-språk

edit: Du saknar en using för Program.cs

Visa signatur
Permalänk
Medlem

I program.cs måste du ha högst upp:

using Inlämningsuppgift3;

Permalänk
Medlem

Tack så mycket för hjälpen! Dock så fungerar tydligen inte min personnummerskontroll, men det är en annan femma!

Permalänk
Medlem

Bumpar lite med några frågor, ser att det är samma uppgift fortfarande i den här kursen:P

Edit: Lösta första frågan själv

En fråga till, i koden har jag lagt en kommentar "Hur tar man bort denna?", har dubbelklickat på label i design delen av misstag och råkat skapa kod jag inte vill ha med. Men tar jag bort koden försvinner även min label i design delen. Finns det något enkelt sätt att fixa detta utan att min label försvinner?

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void label1_Click(object sender, EventArgs e) { //Hur tar man bort denna??? } private void buttonKontrolleraUppgifter_Click(object sender, EventArgs e) { string ratt = null; string fel = null; //Om det skrivs in något personnummer rutorna på korrekt sätt, anropas tjugoEttAlgo för att kolla om personnummret stämmer if (tjugoEttAlgo(insertPersonnummer.Text + fyraSista.Text)) { ratt = Environment.NewLine + "Rätt personnummer"; } else { fel = Environment.NewLine + "Fel personnummer"; } //-------------------------------------------------------------------------------------- //Denna del kollar om det är en tjej eller kille och skriver sedan ut svaret if ((insertPersonnummer.TextLength != 6) || (fyraSista.TextLength != 4)) //Skriv personnumret på formen xxxxxx-xxxx { MessageBox.Show("Fyll i personnummret på formen: ååmmdd-xxxx"); } else { int Num = Convert.ToInt32(fyraSista.Text[fyraSista.Text.Length - 2]); //Hoppar till siffran i personnummret som ska kontrolleras if (Num % 2 == 0) //Kollar om det är ett jämt eller udda tal, dvs avgör om det är en kille eller tjej { textUtskrift.Text = "Namn: " + insertNamn.Text + "\r\n" + "Efternamn: " + insertEfternamn.Text + "\r\n" + "Kön: Tjej" + ratt + fel; //Skriver ut i resultatrutan om det är en tjej, notera att bara en av ratt eller fel kan skrivas ut. } else { textUtskrift.Text = "Namn: " + insertNamn.Text + "\r\n" + "Efternamn: " + insertEfternamn.Text + "\r\n" + "Kön: Kille" + ratt + fel; //Skriver ut i resultatrutan om det är en kille... } } } static bool tjugoEttAlgo(string pNummer) //Körs om ett personnummer skrivs in, returnerar true eller false. { int summa = 0; for (int i = 0; i < pNummer.Length; i++) //Loopen körs med hänseende till längden på personnummret. { int ettTal = (pNummer[i] - '0') //Beräknar tecknens värden 0-9, från tecknet ('0'-'9') genom att dra bort '0'. Exempelvis '1'-'0' = 1 << (1 - (i & 1)); //Multiplicerar med två varannan gång if (ettTal > 9) ettTal -= 9; //Om värdet blir större än 9, subtraheras 9 (vilket är samma som att dela upp talet när det är över nio). summa = summa + ettTal; //Räknar ut summan genom att lägga på ettTal för varje varv for loopen körs } return (summa % 10) == 0; //Division med 10, om detta blir noll returneras true. } private void buttonRensa_Click(object sender, EventArgs e) //När man trycker på knappen "Rensa", försvinner all ifylld text/siffror { insertNamn.Text = ""; insertEfternamn.Text = ""; insertPersonnummer.Text = ""; fyraSista.Text = ""; textUtskrift.Text = ""; } private void textUtskrift_TextChanged(object sender, EventArgs e) { } private void insertNamn_TextChanged(object sender, EventArgs e) { } private void label3_Click(object sender, EventArgs e) { } private void textBox1_TextChanged(object sender, EventArgs e) { } private void insertPersonnummer_TextChanged(object sender, EventArgs e) { } } }

Visa signatur

1. Core i5 q6600, r280x, 4gb ram ddr3, 22tum benq widescreen.
2.P4 3.2ghz(zalman kylning) ,19" skärm crt hundai med mer.
4.Commodore 128!

Permalänk
Medlem

Satt och letade efter kod för att generera personnummer och eftersom detta är den första träffen på google och koden här inte är speciellt kopieringsvänlig bidrar jag med följande länk där det finns en enkel metod för att skapa personnummer.
http://syntaxwarriors.com/p/1021/Generate-a-Random-Swedish-Pe...
P.S: Sorry för bump av gammal tråd.

Permalänk
Medlem

Skrev två funktioner för att kontrollera personnummer. LINQ versionen är en aning långsammare men borde inte spela så stor roll om man bara kontrollerar några enstaka nummer.

bool IsValidPersonalIdentityNumber(string identityNumber) { return identityNumber .Select(c => c - '0') .Select((n, i) => i % 2 > 0 ? n : n * 2) .Select(n => n > 9 ? n - 9 : n) .Sum() % 10 == 0; } bool IsValidPersonalIdentityNumber(string identityNumber) { int sum = 0; for(int i = 0; i < identityNumber.Length; i++) { int n = identityNumber[i] - '0'; if (i % 2 == 0) n = n * 2 > 9 ? n * 2 - 9 : n * 2; sum += n; } return sum % 10 == 0; }

Visa signatur

flippy @ Quakenet