Jag ska skriva ett program som ska kunna kontrollera ett person nummer och behöver hjälp. C#

Permalänk

Jag ska skriva ett program som ska kunna kontrollera ett person nummer och behöver hjälp. C#

Så detta är mitt problem.

static void Main(string[] args) { //Jag vill göra detta: int a = 990220133; //Till detta: int[] persNr = { 9, 9, 0, 2, 2, 0, 1, 3, 3, 0}; //För att kunna utföra detta: int[] result = new int[10]; int oneOrTwo = 0; for(int i = 0; i < persNr.Length; i++) { oneOrTwo = EvenOrNot(oneOrTwo); //Bestämmer om nästa ska gångras med 1 eller 2. int addTo = persNr[i] * oneOrTwo; Console.WriteLine(addTo + " = " + persNr[i] + " * " + oneOrTwo); result[i] = addTo; oneOrTwo++; } result = Check(result); TotalPersNumber(persNr, result); }

Här har ni metoderna.

public static int EvenOrNot(int oneOrTwo) { int one = 1, two = 2; if (oneOrTwo % 2 == 0) { return two; } else return one; } public static int[] Check(int[] persNr) { Boolean next = true; int total = persNr[0], nrOf = 0; while (next) { if (total > 10) { total = total - 10; nrOf++; } else if(total < 10) { persNr[0] = nrOf; persNr[9] = total; next = false; } } return persNr; } public static void TotalPersNumber(int[] original, int[] result) { Boolean next = true; int addUp = 0, leftOver; for (int i = 0; i < result.Length; i++) { addUp = addUp + result[i]; } leftOver = addUp; while (next) { if (leftOver > 10) { leftOver = leftOver - 10; } else if (leftOver < 10) { next = false; } } original[9] = leftOver; Print(original); } public static void Print(int[] toPrint) { for(int i = 0; i < toPrint.Length; i++) { Console.Write(toPrint[i]); if(i == 5) { Console.Write("-"); } } }

Tackar i förväg om jag behöver klargöra något säg till.

Permalänk
Medlem
Skrivet av MaskenLilja:

Så detta är mitt problem.

static void Main(string[] args) { //Jag vill göra detta: int a = 990220133; //Till detta: int[] persNr = { 9, 9, 0, 2, 2, 0, 1, 3, 3, 0}; //För att kunna utföra detta: int[] result = new int[10]; int oneOrTwo = 0; for(int i = 0; i < persNr.Length; i++) { oneOrTwo = EvenOrNot(oneOrTwo); //Bestämmer om nästa ska gångras med 1 eller 2. int addTo = persNr[i] * oneOrTwo; Console.WriteLine(addTo + " = " + persNr[i] + " * " + oneOrTwo); result[i] = addTo; oneOrTwo++; } result = Check(result); TotalPersNumber(persNr, result); }

Här har ni metoderna.

public static int EvenOrNot(int oneOrTwo) { int one = 1, two = 2; if (oneOrTwo % 2 == 0) { return two; } else return one; } public static int[] Check(int[] persNr) { Boolean next = true; int total = persNr[0], nrOf = 0; while (next) { if (total > 10) { total = total - 10; nrOf++; } else if(total < 10) { persNr[0] = nrOf; persNr[9] = total; next = false; } } return persNr; } public static void TotalPersNumber(int[] original, int[] result) { Boolean next = true; int addUp = 0, leftOver; for (int i = 0; i < result.Length; i++) { addUp = addUp + result[i]; } leftOver = addUp; while (next) { if (leftOver > 10) { leftOver = leftOver - 10; } else if (leftOver < 10) { next = false; } } original[9] = leftOver; Print(original); } public static void Print(int[] toPrint) { for(int i = 0; i < toPrint.Length; i++) { Console.Write(toPrint[i]); if(i == 5) { Console.Write("-"); } } }

Tackar i förväg om jag behöver klargöra något säg till.

Använd inte int för att spara personnummer. Ifall någon matar in t.ex "0201031234" så kommer du tappa första siffran.

Använd sträng för personnummer.

Visa signatur

| EVGA Z170 FTW | i7 6700k | ASUS RTX 3070 | 16GB DDR4 3200MHz | Cooler Master V850 | Samsung 840 Evo 250GB + 2x WD Black 500GB + Seagate 2TB SSHD + Samsung 970 Evo M.2 1TB|

Permalänk
Skrivet av BrutalSwede:

Använd inte int för att spara personnummer. Ifall någon matar in t.ex "0201031234" så kommer du tappa första siffran.

Använd sträng för personnummer.

Noterat, finns det något smidigt sätt att fortfarande kunna använda if(String 9 > String 1) utan att ständigt behöva konvertera?

Permalänk
Medlem
Skrivet av MaskenLilja:

Noterat, finns det något smidigt sätt att fortfarande kunna använda if(String 9 > String 1) utan att ständigt behöva konvertera?

Om du har en sträng så konverterar du lämpligen den till en int-array (som persNr). Då måste du ställa dig frågan "vad är en sträng?".

Permalänk
Medlem
Citat:

static void Main(string[] args)
{
//Jag vill göra detta:
int a = 990220133;
//Till detta:
int[] persNr = { 9, 9, 0, 2, 2, 0, 1, 3, 3, 0};
//För att kunna utföra detta:
int[] result = new int[10];
int oneOrTwo = 0;

for(int i = 0; i < persNr.Length; i++)
{
oneOrTwo = EvenOrNot(oneOrTwo); //Bestämmer om nästa ska gångras med 1 eller 2.
int addTo = persNr[i] * oneOrTwo;
Console.WriteLine(addTo + " = " + persNr[i] + " * " + oneOrTwo);
result[i] = addTo;
oneOrTwo++;
}
result = Check(result);
TotalPersNumber(persNr, result);

}

Skrivet av MaskenLilja:

Noterat, finns det något smidigt sätt att fortfarande kunna använda if(String 9 > String 1) utan att ständigt behöva konvertera?

Har jag förstått rätt om du vill göra numret till en array där varje nummer står i ett index?
Eller vad går uppgiften ut på? Nästan enklare att få uppgiften och sen förstå vad det är du gjort/försöker göra.

Permalänk
Medlem

Hela evenornot() kan ersättas med bara % 2

Permalänk
Medlem

Ett personnummers checksiffra räknas ut med Luhn-algoritmen. Det är inte svårt att hitta färdig kod för detta eftersom det är samma algoritm som används för till exempel kreditkortsnummer och bankgironummer. Att hitta färdig och korrekt kod kan förstås vara värre. Testfallen bör inkludera minst ett fall för varje checksiffra.

Om det här är "på riktigt" så bör man förstås också testa med Skatteverkets samordningsnummer, inte bara med personnummer.

Permalänk
Skrivet av MaskenLilja:

public static int EvenOrNot(int oneOrTwo) { int one = 1, two = 2; if (oneOrTwo % 2 == 0) { return two; } else return one; }

Jag har inte läst hela koden, men det finns inget behov av att skapa två int med värdet 1 eller 2. Skriv bara return 1; och return 2; istället.

Permalänk
Medlem

Kan du inte bara ta int värdet. Göra till sträng, splitta efter varje siffra och sen lägga in varje siffra i samma ordning i en array?

Känns bra mycket enklare än vad du försöker göra?

Visa signatur

I7 7700k 4,8GHZ | Asus Strix 1080TI 2000Mhz | Corsair Vengeance RGB DDR4 3100mhz| Gigabyte GA-Z270X-Ultra Gaming | Corsair RM850i 850W. AOC AG271QG.