C# Sozialversicherungsnummer prüfen

krampus

Newbie
Registriert
Mai 2009
Beiträge
4
Hallo!
Ich finde einfach meinen Fehler nicht.
Das Programm soll die eingegebene Sozialversicherungsnummer prüfen.
Jedoch tritt hier immer ein Fehler auf, hoffe auf Hilfe!

Fehler:
IndexOutOfRangeException wurde nicht behandelt.
Der Index war außerhalb des Arraybereichs.

Code:
using System;
using System.Collections.Generic;
using System.Text;

namespace svnr
{
    class Program
    {
        static void Main(string[] args)
        {
            int i, erg;
            string svnr, faktor;
            faktor = "3790584216";
            erg = 0;
            do
            {
                Console.Write("SV-Nummer eingeben: ");
                svnr = Console.ReadLine();
            }
            while (svnr.Length != 10);
            for (i = 0; i < 11 ; i++)
                erg = erg + (faktor[i] * svnr[i]);  //Hier tritt der Fehler auf
            if (erg % 11 == svnr[3])
                Console.WriteLine("SVNR ist richtig!");
            else
                Console.WriteLine("SVNR ist falsch!");
            Console.ReadLine();
        }
    }
}
 
Ist doch klar, von 0 bis inkl 10 sind 11 Felder.
Die Grenze muss 10 sein.
 
Du mogelst - die Fehlerursache ist doch anhand des Namens der Exception 'IndexOutOfRangeException' gar nicht ersichtlich *sarcasm*
 
hallo,
also das mit dem string ist schonmal quark, damit bekommst du lediglich den ascii wert (eine 1 in deinem string wäre nach der ascii tabelle eine 49)
um etwas aus einen string zu extrahieren gibts die funktion substring

hier der geänderte funktionierende code:

Code:
int i, erg;
string svnr, faktor;
faktor = "3790584216";
erg = 0;
do
{
            Console.Write("SV-Nummer eingeben: ");
            svnr = Console.ReadLine();
}
while (svnr.Length != 10);
for (i = 0; i < 10; i++)
            erg = erg + (Convert.ToInt32(faktor.Substring(i,1)) * Convert.ToInt32(svnr.Substring(i, 1)));
int bla = Convert.ToInt32(svnr.Substring(3,1));
if (erg % 11 == Convert.ToInt32(svnr.Substring(3,1)))
             Console.WriteLine("SVNR ist richtig!");
else
             Console.WriteLine("SVNR ist falsch!");
Console.ReadLine();
 
Die Zeile "int bla = Convert.ToInt32(svnr.Substring(3,1));" scheint ja immens wichtig zu sein...
 
vielen dank!
das mit dem substring hat mir geholfen :)
nur was mich verblüfft, ich hab ne andere ähnliche info aufgabe auch so mit dem string gelöst und es hat funktioniert o__O leider hab ich sie nicht hier auf dem pc wenn ich wieder in die schule komme kann ich den code hier posten
 
könnte daran liegen, dass du die Methode "Substring" auch gar nicht brauchst...
 
und wie kann ich das dann noch machen ohne substring? Convert.ToInt32(string) funktioniert nämlich auch nicht...
 
Wieso machst du aus "faktor" nicht einfach ein Array aus ints? Also
Code:
int[] faktor = new int[] { 3,7,9,0,5,8,4,2,1,6 };
und dann genauso wie bisher auf das Array zugreifen. Für svnr geht das klarerweise nicht, aber vielleicht erhellt dich Folgendes:

Wieso das Ergebnis von der substring-Geschichte anders ist:
  • ein Convert.ToInt32(svnr.Substring(3,1)) wird auf einem String-Argument ausgeführt. Wenn im String ein "1" vorkommt, so wird das auch auf eine 1 umgewandelt. Der String wird dazu speziell geparsed. Siehe http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx
  • ein Convert.ToInt32(string) hat als Argument einen Buchstaben (char) und weicht in der Funktionsweise deutlich von der String-Methode ab. Chars sind nach der ASCII-Tabelle gespeichert: http://www.torsten-horn.de/techdocs/ascii.htm Wie du siehst, hat hier ein "a" z.B. den Wert 97, eine 1 den Wert 49 (wurde ja oben bereits angesprochen). Da dieses Char in der Funktion einfach nur gecastet wird, wird deine im String vorhandene 1 hier also tatsächlich zur 49 und somit stimmt natürlich das Ergebnis nicht. Du könntest in diesem Fall aber natürlich einfach vom Wert 48 abziehen, dann würde es wieder stimmen! Also so:
    Code:
    for (i = 0; i < 10; i++)
       erg += faktor[i] * (svnr[i] - 48);      // mit faktor als int-Array, siehe oben! Ansonsten auch dort -48 und Klammern!
    if (erg % 11 == svnr[3] - 48)))
    Dass man damit den Aufruf der Convert-Funktion komplett sparen kann ist performancemäßig natürlich vorteilhaft; sollte aber relativ wenig relevant sein hier da es ja insgesamt wenig rechenaufwändig ist. Näheres zur Funktion siehe Siehe http://msdn.microsoft.com/en-us/library/ww9t2871.aspx
 
Zuletzt bearbeitet:
1668mib schrieb:
könnte daran liegen, dass du die Methode "Substring" auch gar nicht brauchst...

du scheinst mir ja nen ganz schlauer zu sein, code das es einfach mal so mit string und debug es, so bekommst du wie oben beschrieben nur den ascii code zurück und nicht die zahl

was eine ascii tabelle ist weisst du hoffentlich auch wenn ich da grad nicht so sicher bin...
 
@ BerniG danke dir, jetzt verstehe ich das schon besser :)
hast mir echt geholfen
 
madduke schrieb:
du scheinst mir ja nen ganz schlauer zu sein...
Böses Foul!

Dieser Jemand hat auf jeden Fall mehr Ahnung als die meisten, die sich hier in einem Programmierforum herumtreiben (dürfen).

Wenn von solchen Leuten patzige Antworten kommen, dann liegt das meist daran, dass von den Leuten, die hier posten nur sehr wenig Eigeninitiative gezeigt wird, das Problem vorerst selbst zu lösen - nein, da wird sofort jede noch so triviale Kleinigkeit, für die es dutzende Tutorials im Web gibt ins Forum gepostet.

------------------

1668mib schrieb:
könnte daran liegen, dass du die Methode "Substring" auch gar nicht brauchst...
Optimierungsaufwand will man bei solch trivialen Programmen sicher nicht betreiben ;)
 
Zuletzt bearbeitet:
XunnD schrieb:
Dieser Jemand hat auf jeden Fall mehr Ahnung als die meisten, die sich hier in einem Programmierforum herumtreiben (dürfen).

ist ja toll das er ahnung hat, aber beide post bringen dem thread starter 0, da kann man sich das posten auch gleich sparen...

irgendwann hat nunmal jeder angefangen und wenn mir eine frage zu trivial ist, dann lächle ich einfach darüber und spare mir das posten
 
madduke schrieb:
irgendwann hat nunmal jeder angefangen
Das ist wahr. Aber hat auch jeder gleich ganze Foren mit Trivialfragen beschäftigt? Sicher nicht!

Und da liegt der Hase im Pfeffer: zuviele Leute machen es sich zu leicht: statt erst einmal selbst über etwas nachzudenken, oder bereits vorhandenes und publiziertes Wissen zu nutzen (Google ftw) wird erst einmal ein Thread zu einer trivialen Frage eröffnet. "Trial and Error" oder eine andere Art Eigeninitiative? Fehlanzeige! Mittlerweile staune ich sogar darüber, wie manche überhaupt die Energie aufwenden können, einen Thread zustande zu bringen...

Ein Forum ist eine zu mächtige Wissensbasis, als dass es mit Kleinigkeiten aufgehalten oder belangt werden sollte. Weiter sollte ein Forum zu Lösungen anregen, nicht aber sofort fertig präsentieren. Der Lerneffekt beim folgenden Copy & Paste ist minimal.

Wenn also jemand keine direkte Antwort auf Trivialfragen gibt, heißt das vermutlich: "beschäftige Dich selbst damit - Hinweise habe ich Dir gegeben."
Und nur, weil die Hinweise keine offensichtlichen Lösungen darstellen, heißt das noch lange nicht, dass diese nutzlos sind.
 
Zurück
Oben