C# windowsFromsApplication, hittar inte felet

Permalänk
Medlem

C# windowsFromsApplication, hittar inte felet

Hejhej. håller på med en windowsFromsApplication har kommit en lite bit på den,
jag ska skriva in förnamn, efternamn och personnummer. i var sin textbox så ska den skriva ut resultat i en annan textbox, detta fungerarde innan jag gjorde den andra classen (person) och jag hittar inte felet. finns här någon snäll själ som kan titta på den och säga vad som är fel, hade varit super snällt, är trots allt en nybörjare än så länge på det här.

här är den första classen Form1

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; string kön; förNamn = textBox1.Text; efterNamn = textBox2.Text; personNummer = textBox3.Text; textBox4.Text = förNamn + " " + efterNamn + " " + personNummer; textBox5.Text = instPerson.KollaKön(); { 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 button1_Click(object sender, EventArgs e) { Person p = new Person(); bool PnrOK; string Kön; p.Fornamn = Convert.ToString(textBox1.Text); p.Efternamn = Convert.ToString(textBox2.Text); p.Personnummer = Convert.ToString(textBox3.Text); PnrOK = p.Personnummerkollare(); Kön = p.KollaKön(); } /* string siffraAsString = textBox3.Text.Substring(8, 1); int siffraAsNum = int.Parse(siffraAsString); int result = (siffraAsNum % 2); if (instPerson.KollaPnr() == true) if (result == 1) { textBox5.Text = "Är en Man"; } else { textBox5.Text = " Är en Kvinna"; } } */ private void Form1_Load(object sender, EventArgs e) { } } }

Här är min egna class Person

sing System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WindowsFormsApplication9 { class Person { private String fornamn; private String personnummer; private String efternamn; 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 Personnummerkollare() { 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() { int Könsiffra; int a; string kön; Könsiffra = Convert.ToInt32(new string(personnummer[8], 1)); //Alternativt Könsiffra = personnummer[8] - '0'; if ((Könsiffra % 2) == 0) { kön = "Kvinna"; } else { kön = "Man"; } return kön; } } }

Permalänk
Medlem

Testat att debugga så du ser vart i koden det smäller?

Skickades från m.sweclockers.com

Permalänk

kolla om det funkar om du ändrar från "private String fornamn;" till "public String fornamn;" och btw kan man använda svenska bokstäver i c#

Permalänk
Medlem
Skrivet av NinjaKitteh:

kolla om det funkar om du ändrar från "private String fornamn;" till "public String fornamn;" och btw kan man använda svenska bokstäver i c#

Varför skulle han vilja det? Samt ja det går prima att använda svenska tecken men inte något att rekommendera då beroende på vart koden ska så måste han t.ex. översätta hela koden O.s.v.

Skrivet av dk79:

Mitt tipps itll dig är att lära dig Debugga kod: Här har du en liten intro tutorial på det ämnet http://www.youtube.com/watch?v=jxR_ngGIpQM

Sedan Convert.ToString(textBox1.Text) <- Varför "Connventera" string till string? totalt meninglöst, Skriv bara textBox1.Text istället

Dina properties i din klass är lite onödigt skrivna, behöver du ingen setter eller getter logik så skriv dom så här så skipper du massa onödig kod behöver du login i dom så rekommenderar jag att skriva som du har gjort där.

Du skriver en förkortad property så här: Sedan accessar du den överallt med Fornamn
public String Fornamn { get; set; }

Sedan ditt problem, kolla på denna rad.

Kön = p.KollaKön();

Här sparar du undan Kön, men sedan gör du inget, du updaterar .t.ex. Inte Textbox5.

Visa signatur

Speldator: i7-8700k, 32GB DDR4, RTX2080
Server 1: SB 2500k, MZI -P67GD55, 32GB DDR3, Corsair MX 240GB SSD
Surface Pro 2017, Konsoler: Typ alla, Oculus Rift

Permalänk
Medlem

Problemet ligger förmodligen i att du har två metoder som heter samma.

private void button1_Click(object sender, EventArgs e)

Eftersom du förmodligen vill använda din nya "Person" klass så måste du också skriva ut resultatet som du gjorde i din översta button1_Click

textBox4.Text = förNamn + " " + efterNamn + " " + personNummer; textBox5.Text = instPerson.KollaKön();

Permalänk
Medlem

Glömde skriva att

Tro felet ligger här någonstans då den bara skriver ut att det är en man. och när jag ändrar från Man till ex jag så skriver den ut jag istället.
måste vara något jag skrivit fel eller glömt.
Glömde skriva sist att det i mellan kommertarerna /* - */ Är bort kommenterat av läraren då det inte behövs säger han.

public string KollaKön() { int Könsiffra; int a; string Kön; Könsiffra = Convert.ToInt32(new string(personnummer[8], 1 )); //alternativt Könsiffra = personnummer[8] - '0'; if((Könsiffra % 2) == 0) { Kön = "Kvinna"; } else Kön = "Man"; } return Kön;

Permalänk
Medlem

detta fixar det:

public string KollaKön() { return int.Parse(personnummer[8].ToString()) % 2 == 0 ? "Man" : "Kvinna"; }

är samma som

public string KollaKön() { if(int.Parse(personnummer[8].ToString()) % 2 == 0 ) { return "Man"; } else { return "Kvinna"; } }

Permalänk
Medlem
Skrivet av Wickit:

detta fixar det:

public string KollaKön() { return int.Parse(personnummer[8].ToString()) % 2 == 0 ? "Man" : "Kvinna"; }

är samma som

public string KollaKön() { if(int.Parse(personnummer[8].ToString()) % 2 == 0 ) { return "Man"; } else { return "Kvinna"; } }

Hoppas verkligen inte jag är en kvinna. Din kod hade bara ett fel, != ska det stå i if-satsen. Testade med mitt och blev kvinna, testade men flickvännens, hon blev man.
Koden är skriven som en konsollapplikation men den går att använda som en windows också, men väldigt liten tweak.
Osäker om jag förstått uppgiften korrekt nu, men vi kör:

Användande Konsoll:

Person p = new Person(new PersonNummer(Convert.ToInt64(Console.ReadLine())), Console.ReadLine(), Console.ReadLine()); Console.Write("\n\nFörnamn: {0}\nEfternamn: {1}\nKön: {2}\nPersonnummer: {3}", p.Förnamn, p.Efternamn, p.Kön, p.PersonNummer); Console.ReadKey();

Dold text

Användande Windows:

Person p = new Person(new PersonNummer(Convert.ToInt64(textBox1.Text)), textBox2.Text, textBox3.Text); textBox4.Text = string.Format(Förnamn: {0} - Efternamn: {1} - Kön: {2} - Personnummer: {3}", p.Förnamn, p.Efternamn, p.Kön, p.PersonNummer);

Dold text

Kod

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { Person p = new Person(new PersonNummer(Convert.ToInt64(Console.ReadLine())), Console.ReadLine(), Console.ReadLine()); Console.Write(p.ToString()); Console.ReadKey(); } } public class Person { public Kön Kön { get; set; } public PersonNummer PersonNummer { get; set; } public string Förnamn { get; set; } public string Efternamn { get; set; } public Person(PersonNummer pnummer, string förnamn, string efternamn) { this.Förnamn = förnamn; this.Efternamn = efternamn; this.PersonNummer = pnummer; this.Kön = new Kön(this.PersonNummer); } public override string ToString() { return string.Format("\n\nFörnamn: {0}\nEfternamn: {1}\nKön: {2}\nPersonnummer: {3}", this.Förnamn, this.Efternamn, this.Kön, this.PersonNummer); } } public class Kön { public string kön { get; set; } public Kön(PersonNummer nummer) { this.kön = this.KollaKön(nummer); } public string KollaKön(PersonNummer nummer) { return int.Parse(nummer.ToString()[8].ToString()) % 2 != 0 ? "Man" : "Kvinna"; } public override string ToString() { return kön; } } public class PersonNummer { private DateTime _date; public Int64 Personnummer { get; set; } public PersonNummer(Int64 personnummer) { if (this.Personnummerkollare(personnummer)) { this.Personnummer = personnummer; } else { throw new System.Exception("Felaktigt personnummer"); } } public bool Personnummerkollare(Int64 pnummer) { if (DateTime.TryParse(string.Format("{0}{1}-{2}{3}-{4}{5}", pnummer.ToString()[0], pnummer.ToString()[1], pnummer.ToString()[2], pnummer.ToString()[3], pnummer.ToString()[4], pnummer.ToString()[5]), out _date)) { int sum = 0; for (int i = 0; i < pnummer.ToString().Length; i++) { int temp = (pnummer.ToString()[i] - '0') << (1 - (i & 1)); if (temp > 9) temp -= 9; sum += temp; } return (sum % 10) == 0; } else { return false; } } public override string ToString() { return Personnummer.ToString(); } } }

Dold text

Enda som krånglar för min kod verkar vara att den inte riktigt ser om det är fel på personnumret (9999999999 blir godkänt).
Alltså kolla om datumet i personnumret existerar etc.

Den bör se ut typ såhär:

public bool Personnummerkollare(Int64 pnummer) { if (DateTime.TryParse(string.Format("{0}{1}-{2}{3}-{4}{5}", pnummer.ToString()[0], pnummer.ToString()[1], pnummer.ToString()[2], pnummer.ToString()[3], pnummer.ToString()[4], pnummer.ToString()[5]), out _date)) { int sum = 0; for (int i = 0; i < pnummer.ToString().Length; i++) { int temp = (pnummer.ToString()[i] - '0') << (1 - (i & 1)); if (temp > 9) temp -= 9; sum += temp; } return (sum % 10) == 0; } else { return false; } }

Dold text

Datumkontrollen går göra betydligt snyggare men har inte tid att fundera ut detta.
Rätta mig jättegärna om jag har fel.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40