Index ist nicht im Array vorhanden ?

K

kcinay055679

Gast
Visual Studio gibt mir die Fehlermeldung: System.IndexOutOfRangeException aus
Dabei sind alle Zahlen innerhalb des Index

Der für diese Frage relevante Code befindet sich auf den Zeilen 42 -207 ( Ich schreibe das weil: als ich den Code in einer neuen Datei ausgeführt habe gab es keine Fehlermeldung.)


Mein Code:
C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Media;
using System.Drawing;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;


namespace Kcinay_environment
{

    class Hauptklasse
    {
        public static void Main( string[] args )
        {
            string AdminEingabe;
            string AdminPasswort = "Abc123";
            string RechnerZahl1;
            string RechnerZahl2;
            string Operator;
            string EingabeModul;
            string EingabeZahlenspiel;
            string AktuellerBenutzer;
            string EingabeBenutzer;
            string[] BenutzerListe = new string[6];
            {

                BenutzerListe[0] = "Yanick";
                BenutzerListe[1] = "Pfanner";
                BenutzerListe[2] = "Housi";
                BenutzerListe[3] = "Barbara";
                BenutzerListe[4] = "Gast";
                BenutzerListe[5] = "Admin";

            }
            string[,,] StatistikListe = new string[6, 10, 11];
            {
                /* x ,y, z
                // x = User
                // y = Zeit
                 z = Versuche
                    */
                //Benutzer "Yanick = 0"
                {
                    //Die letzten 10 zeit Messungen des Benutzers "0"
                    StatistikListe[0, 0, 0] = null;
                    StatistikListe[0, 1, 0] = null;
                    StatistikListe[0, 2, 0] = null;
                    StatistikListe[0, 3, 0] = null;
                    StatistikListe[0, 4, 0] = null;
                    StatistikListe[0, 5, 0] = null;
                    StatistikListe[0, 6, 0] = null;
                    StatistikListe[0, 7, 0] = null;
                    StatistikListe[0, 8, 0] = null;
                    StatistikListe[0, 9, 0] = null;
                    
                    //Die letzten 10 Versuche des Benutzers "0"
                    StatistikListe[0, 0, 1] = null;
                    StatistikListe[0, 0, 2] = null;
                    StatistikListe[0, 0, 3] = null;
                    StatistikListe[0, 0, 4] = null;
                    StatistikListe[0, 0, 5] = null;
                    StatistikListe[0, 0, 6] = null;
                    StatistikListe[0, 0, 7] = null;
                    StatistikListe[0, 0, 8] = null;
                    StatistikListe[0, 0, 9] = null;
                    StatistikListe[0, 0, 10] = null;
                }
                //Benutzer "Pfanner = 1"
                {
                    //Die letzten 10 zeit Messungen des Benutzers "1"
                    //StatistikListe[1, 0, 0] = null;
                    StatistikListe[1, 1, 0] = null;
                    StatistikListe[1, 2, 0] = null;
                    StatistikListe[1, 3, 0] = null;
                    StatistikListe[1, 4, 0] = null;
                    StatistikListe[1, 5, 0] = null;
                    StatistikListe[1, 6, 0] = null;
                    StatistikListe[1, 7, 0] = null;
                    StatistikListe[1, 8, 0] = null;
                    StatistikListe[1, 9, 0] = null;
                    StatistikListe[1, 10, 0] = null;
                    //Die letzten 10 Versuche des Benutzers "1"                   
                    StatistikListe[1, 0, 1] = null;
                    StatistikListe[1, 0, 2] = null;
                    StatistikListe[1, 0, 3] = null;
                    StatistikListe[1, 0, 4] = null;
                    StatistikListe[1, 0, 5] = null;
                    StatistikListe[1, 0, 6] = null;
                    StatistikListe[1, 0, 7] = null;
                    StatistikListe[1, 0, 8] = null;
                    StatistikListe[1, 0, 9] = null;
                    StatistikListe[1, 0, 10] = null;
                }
                //Benutzer "Housi = 2"
                {
                    //Die letzten 10 zeit Messungen des Benutzers "2"
                    StatistikListe[2, 0, 0] = null;
                    StatistikListe[2, 1, 0] = null;
                    StatistikListe[2, 2, 0] = null;
                    StatistikListe[2, 3, 0] = null;
                    StatistikListe[2, 4, 0] = null;
                    StatistikListe[2, 5, 0] = null;
                    StatistikListe[2, 6, 0] = null;
                    StatistikListe[2, 7, 0] = null;
                    StatistikListe[2, 8, 0] = null;
                    StatistikListe[2, 9, 0] = null;
                    StatistikListe[2, 10, 0] = null;
                    //Die letzten 10 Versuche des Benutzers "2"
                    StatistikListe[2, 0, 1] = null;
                    StatistikListe[2, 0, 2] = null;
                    StatistikListe[2, 0, 3] = null;
                    StatistikListe[2, 0, 4] = null;
                    StatistikListe[2, 0, 5] = null;
                    StatistikListe[2, 0, 6] = null;
                    StatistikListe[2, 0, 7] = null;
                    StatistikListe[2, 0, 8] = null;
                    StatistikListe[2, 0, 9] = null;
                    StatistikListe[2, 0, 10] = null;
                }
                // Benutzer "Barbara = 3"
                {
                    //Die letzten 10 zeit Messungen des Benutzers "3"
                    StatistikListe[3, 0, 0] = null;
                    StatistikListe[3, 1, 0] = null;
                    StatistikListe[3, 2, 0] = null;
                    StatistikListe[3, 3, 0] = null;
                    StatistikListe[3, 4, 0] = null;
                    StatistikListe[3, 5, 0] = null;
                    StatistikListe[3, 6, 0] = null;
                    StatistikListe[3, 7, 0] = null;
                    StatistikListe[3, 8, 0] = null;
                    StatistikListe[3, 9, 0] = null;
                    StatistikListe[3, 10, 0] = null;
                    //Die letzten 10 Versuche des Benutzers "3"
                    
                    StatistikListe[3, 0, 1] = null;
                    StatistikListe[3, 0, 2] = null;
                    StatistikListe[3, 0, 3] = null;
                    StatistikListe[3, 0, 4] = null;
                    StatistikListe[3, 0, 5] = null;
                    StatistikListe[3, 0, 6] = null;
                    StatistikListe[3, 0, 7] = null;
                    StatistikListe[3, 0, 8] = null;
                    StatistikListe[3, 0, 9] = null;
                    StatistikListe[3, 0, 10] = null;

                }
                // Benutzer "Gast = 4"
                {
                    //Die letzten 10 zeit Messungen des Benutzers "4"
                    StatistikListe[4, 0, 0] = null;
                    StatistikListe[4, 1, 0] = null;
                    StatistikListe[4, 2, 0] = null;
                    StatistikListe[4, 3, 0] = null;
                    StatistikListe[4, 4, 0] = null;
                    StatistikListe[4, 5, 0] = null;
                    StatistikListe[4, 6, 0] = null;
                    StatistikListe[4, 7, 0] = null;
                    StatistikListe[4, 8, 0] = null;
                    StatistikListe[4, 9, 0] = null;
                    StatistikListe[2, 10, 0] = null;
                    //Die letzten 10 Versuche des Benutzers "4"
                    StatistikListe[4, 0, 1] = null;
                    StatistikListe[4, 0, 2] = null;
                    StatistikListe[4, 0, 3] = null;
                    StatistikListe[4, 0, 4] = null;
                    StatistikListe[4, 0, 5] = null;
                    StatistikListe[4, 0, 6] = null;
                    StatistikListe[4, 0, 7] = null;
                    StatistikListe[4, 0, 8] = null;
                    StatistikListe[4, 0, 9] = null;
                    StatistikListe[4, 0, 10] = null;
                }
                // Benutzer "Admin = 5"
                {
                    //Die letzten 10 zeit Messungen des Benutzers "5"
                    StatistikListe[5, 0, 0] = null;
                    StatistikListe[5, 1, 0] = null;
                    StatistikListe[5, 2, 0] = null;
                    StatistikListe[5, 3, 0] = null;
                    StatistikListe[5, 4, 0] = null;
                    StatistikListe[5, 5, 0] = null;
                    StatistikListe[5, 6, 0] = null;
                    StatistikListe[5, 7, 0] = null;
                    StatistikListe[5, 8, 0] = null;
                    StatistikListe[5, 9, 0] = null;
                    StatistikListe[5, 10, 0] = null;
                    //Die letzten 10 Versuche des Benutzers "5"
                    StatistikListe[5, 0, 1] = null;
                    StatistikListe[5, 0, 2] = null;
                    StatistikListe[5, 0, 3] = null;
                    StatistikListe[5, 0, 4] = null;
                    StatistikListe[5, 0, 5] = null;
                    StatistikListe[5, 0, 6] = null;
                    StatistikListe[5, 0, 7] = null;
                    StatistikListe[5, 0, 8] = null;
                    StatistikListe[5, 0, 9] = null;
                    StatistikListe[5, 0, 10] = null;
                }
            }
            Random rnd = new Random();
            int löschcounter = 0;
            int Zahl = rnd.Next(0, 1000);
            int Versuche = 0;
            int RechnerZahl1Int;
            int RechnerZahl2Int;
            int RechnerErgebnis;
            String OperatorWort;


            while (true)
            {
                Console.WriteLine("Bitte melde dich mit deinem Benutzernamen an");
                EingabeBenutzer = Console.ReadLine();
                if (BenutzerListe[0] == EingabeBenutzer)
                {
                    AktuellerBenutzer = "Yanick";
                    break;
                }
                if (BenutzerListe[1] == EingabeBenutzer)
                {
                    AktuellerBenutzer = "Pfanner";
                    break;
                }
                if (BenutzerListe[2] == EingabeBenutzer)
                {
                    AktuellerBenutzer = "Housi";
                    break;
                }
                if (BenutzerListe[3] == EingabeBenutzer)
                {
                    AktuellerBenutzer = "Barbara";
                    break;
                }
                if (BenutzerListe[4] == EingabeBenutzer)
                {
                    while (true)
                    {
                        Console.Clear();
                        Console.WriteLine("Bitte melde dich mit dem Admin Passwort an");
                        AdminEingabe = Console.ReadLine();
                        if (AdminEingabe.Equals(AdminPasswort))
                        {
                            AktuellerBenutzer = "Admin";
                            break;
                        }
                        else
                        {
                            Console.WriteLine("Bitte gib das korrekte Passwort ein");
                            Console.ReadKey();
                        }
                    }
                    break;
                }
                else
                {
                    Console.Clear();
                    Console.WriteLine("Bitte melde dich mit einem gültigen Benutzernamen an");
                    Console.ReadKey();
                    Console.Clear();
                }
            }
            Console.WriteLine(" ");
            Console.WriteLine("Du bist als " + AktuellerBenutzer + " angemeldet");
            Console.WriteLine(" ");
            Console.WriteLine(" ");

            Console.WriteLine("Dir stehen folgende Möglichkeiten zur verfügung");
            Console.WriteLine(" ");
            Console.WriteLine("Zahlenspiel");
            Console.WriteLine("Rechner");
            Console.WriteLine("Dieses Produkt wird noch entwickelt");
            Console.WriteLine("Dieses Produkt wird noch entwickelt");
            Console.WriteLine("Statistik (noch nicht verfügbar) ");
            Console.WriteLine("Zum benutzen den Programmnamen eingeben ");
            Console.ReadKey();

            while (true)
            {
                EingabeModul = Console.ReadLine();
                switch (EingabeModul)
                {
                    case "Zahlenspiel":
                        {
                            Console.Clear();
                            SoundPlayer simpleSound = new SoundPlayer(@"C:\Tickende_Uhr.wav");
                            simpleSound.Play();
                            Console.WriteLine("Dies ist ein Zahlenerratungs Spiel");
                            Console.WriteLine("Das Spiel beinhaltet eine Zahlenspanne von 0 - 1000");
                            Console.WriteLine("Tippe eine Zahl und das Program sagt dir ob die Gesuchte Zahl kleiner oder Grösser ist als die Eingegebene.");
                            Console.WriteLine("   ");

                            Task.Delay(3000).Wait();
                            Console.Clear();
                            startTime();
                            while (true)
                            {
                                Console.WriteLine("Tippe eine Zahl: ");
                                EingabeZahlenspiel = Console.ReadLine();

                                if (EingabeZahlenspiel == "Lösung")
                                {
                                    Console.Clear();
                                    Console.WriteLine("Die Lösung war: " + Zahl);
                                    Console.WriteLine("   ");
                                    Console.WriteLine("Du hast " + getTime() + " gebraucht um die Richtige Zahl zu finden :-)");
                                    simpleSound.Stop();
                                    Console.ReadKey();
                                    break;
                                }

                                int Ausgabe = Convert.ToInt32(EingabeZahlenspiel);

                                if (Zahl == Ausgabe)
                                {
                                    Console.Clear();
                                    Console.WriteLine("Du hast die Richtige Zahl gefunden");
                                    Console.WriteLine("Es war die Zahl " + Zahl);
                                    Console.WriteLine("Du hast " + getTime() + " gebraucht um die Richtige Zahl zu finden :-)");
                                    Console.WriteLine("Du hast Insgesammt " + Versuche + " Versuche gebraucht.");
                                    simpleSound.Stop();
                                    Console.ReadKey();
                                    Console.Clear();
                                    break;
                                }

                                if (Ausgabe > Zahl)
                                {
                                    löschcounter += 1;
                                    if (löschcounter == 3)
                                    {
                                        löschcounter = 0;
                                        Console.Clear();
                                        Console.WriteLine(Ausgabe);
                                    }
                                    Versuche += 1;
                                    Console.WriteLine("Die eingegebene Zahl ist zu gross");
                                    Console.WriteLine("   ");
                                    Console.WriteLine("Du hast bisher " + getTime() + " gebraucht.");
                                    Console.WriteLine("Du hast bisher " + Versuche + " Versuche gebraucht.");
                                    Console.WriteLine("   ");
                                    Console.WriteLine("   ");

                                }

                                if (Ausgabe < Zahl)
                                {
                                    löschcounter += 1;
                                    if (löschcounter == 3)

                                    {
                                        löschcounter = 0;
                                        Console.Clear();
                                        Console.WriteLine(Ausgabe);
                                    }
                                    Versuche += 1;
                                    Console.WriteLine("Die eingegebene Zahl ist zu klein");
                                    Console.WriteLine("   ");
                                    Console.WriteLine("Du hast bisher " + getTime() + " gebraucht.");
                                    Console.WriteLine("Du hast bisher " + Versuche + " Versuche gebraucht.");
                                    Console.WriteLine("   ");
                                    Console.WriteLine("   ");
                                    Console.WriteLine("   ");
                                }
                            }
                            break;


                        }
                    case "Rechner":
                        {
                            Console.WriteLine("Das ist mein Rechner");
                            Console.WriteLine("Zuerst die 1. Zahl eingeben danach Enter ");
                            Console.WriteLine("Anschlissend den Operator eingeben (+,-,*,/) danach Enter ");
                            Console.WriteLine("Zahl 1 eingeben ");
                            RechnerZahl1 = Console.ReadLine();
                            RechnerZahl1Int = Convert.ToInt32(RechnerZahl1);

                            while (true)
                            {
                                Console.WriteLine("Operator eingeben(+,-,*,/)");
                                Operator = Console.ReadLine();
                                if (!Operator.Equals("+") && !Operator.Equals("-") && !Operator.Equals("*") && !Operator.Equals("/"))
                                {
                                    Console.WriteLine("Bitte einen gültigen Operator eingeben");
                                }
                                else
                                {
                                    break;
                                }


                            }

                            Console.WriteLine("Zahl 2 eingeben ");


                            RechnerZahl2 = Console.ReadLine();
                            RechnerZahl2Int = Convert.ToInt32(RechnerZahl2);

                            switch (Operator)
                            {
                                case "+":
                                    RechnerErgebnis = RechnerZahl1Int + RechnerZahl2Int;
                                    OperatorWort = " Plus ";
                                    break;
                                case "-":
                                    RechnerErgebnis = RechnerZahl1Int - RechnerZahl2Int;
                                    OperatorWort = " Minus ";
                                    break;
                                case "*":
                                    RechnerErgebnis = RechnerZahl1Int * RechnerZahl2Int;
                                    OperatorWort = " mal ";
                                    break;
                                case "/":
                                    RechnerErgebnis = RechnerZahl1Int / RechnerZahl2Int;
                                    OperatorWort = " durch ";
                                    break;
                                default:
                                    // we are sure that this cannot happen, as we checked "Operator"
                                    throw new InvalidOperationException("A programming mistake occurred!");



                            }

                            Console.WriteLine("Die Rechnung lautet " + RechnerZahl1Int + OperatorWort + RechnerZahl2Int + "ergibt" + RechnerErgebnis);
                            Console.ReadKey();
                            break;
                        }
                    case "Statistik":

                        Console.WriteLine("Versuche                       Zeit" );
                        break;

                    default:
                        {
                            Console.Clear();
                            Console.WriteLine("Bitte wähle ein existierendes Programm aus ");
                            Console.ReadKey();
                            Console.Clear();
                            Console.WriteLine("Dir stehen folgende Möglichkeiten zur verfügung");
                            Console.WriteLine(" ");
                            Console.WriteLine("Zahlenspiel");
                            Console.WriteLine("Dieses Produkt wird noch entwickelt");
                            Console.WriteLine("Dieses Produkt wird noch entwickelt");
                            Console.WriteLine("Dieses Produkt wird noch entwickelt");
                            Console.WriteLine("Statistik (noch nicht verfügbar) ");
                            Console.WriteLine("Zum benutzen den Programmnamen eingeben! ");
                            EingabeModul = Console.ReadLine();
                            break;
                        }
                }
            }
        }
        static Stopwatch stopWatch;
        static void startTime()
        {
            stopWatch = new Stopwatch();
            stopWatch.Start();
        }

        static String getTime()
        {
            long ms = stopWatch.ElapsedMilliseconds;
            int minuten = (int)(ms / 1000 / 60);
            int sekunden = (int)((ms - minuten * 1000 * 60) / 1000);
            String strReturn = "";

            if (minuten != 0)
                strReturn = minuten + " Minute" + (minuten == 1 ? "" : "n");

            if (sekunden != 0)
            {
                if (strReturn.Length != 0)
                    strReturn += " und ";

                strReturn += sekunden + " Sekunde" + (sekunden == 1 ? "" : "n");
            }

            return strReturn;
        }
    }
}
 
kcinay055679 schrieb:
Visual Studio gibt mir die Fehlermeldung: System.IndexOutOfRangeException aus
...
Mein Code:
Code:
...
            string[,,] StatistikListe = new string[6, 10, 11];
...
                //Benutzer "Pfanner = 1"
                {
                    //Die letzten 10 zeit Messungen des Benutzers "1"
                    //StatistikListe[1, 0, 0] = null;
                    StatistikListe[1, 1, 0] = null;
                    StatistikListe[1, 2, 0] = null;
                    StatistikListe[1, 3, 0] = null;
                    StatistikListe[1, 4, 0] = null;
                    StatistikListe[1, 5, 0] = null;
                    StatistikListe[1, 6, 0] = null;
                    StatistikListe[1, 7, 0] = null;
                    StatistikListe[1, 8, 0] = null;
                    StatistikListe[1, 9, 0] = null;
                    StatistikListe[1, 10, 0] = null;
                    //Die letzten 10 Versuche des Benutzers "1"                
                    StatistikListe[1, 0, 1] = null;
                    StatistikListe[1, 0, 2] = null;
                    StatistikListe[1, 0, 3] = null;
                    StatistikListe[1, 0, 4] = null;
                    StatistikListe[1, 0, 5] = null;
                    StatistikListe[1, 0, 6] = null;
                    StatistikListe[1, 0, 7] = null;
                    StatistikListe[1, 0, 8] = null;
                    StatistikListe[1, 0, 9] = null;
                    StatistikListe[1, 0, 10] = null;
                }
...

Kein Wunder, schon beim 2. Benutzer Pfanner verwendest du für den 2. Index einen ungültige Indexzugriff und diesen Fehler machst du danach noch häufiger.
Der 2. Index wird von dir mit new string[6, 10, 11] definiert. 10 Elemente erreichbar mit Index 0 bis 9. Beim Pfanner greifst du auf den 2. Index mit 10 zu, was nicht geht und den Fehler erzeugt (Index ausserhalb des zulässigen Bereichs).
 
Ab Benutzer 1 weist du im zweiten Eintrag mit Indizes 1 bis 10 statt 0 bis 9 zu. Deshalb der Fehler.

Du solltest dir übrigens ganz dringend mal Schleifen anschauen, glaube ich.
 
  • Gefällt mir
Reaktionen: pcBauer, sebbolein und Jesterfox
Das initialisiert ein Array mit 3 Dimensionen. Quasi ein Quader mit den Kantenlängen 6, 10 und 11.

Siehe auch Dokumentation von Microsoft.
 
Zuletzt bearbeitet: (Würfel != Quader)
  • Gefällt mir
Reaktionen: Hayda Ministral
1. Verwendung von Schleifen für die Initialisierung der ganzen StatistikListe Arrays, du musst doch selbst sehen dass hier gefühlt > 100 Zeilen (Line 52 - 205!!!) redundant und auch fehler anfällig sind, wenn du die Zahlen da per Hand einträgst? Hat dich das beim Schreiben nicht genervt? Versuch mal mit for oder so
2. so ein if freut sich auch gerne mal über ein else wenn sich Bedingungen gegenseitig ausschließen
 
Hallo kcinay055679, schön zu sehen das Du am Ball bleibst, aber leider wird Dein Code immer mehr zu Spaghetticode, hier ein paar Anregungen wie Du einiges Verbessern kannst:

Code:
    class Program {
        static void Main(string[] args) {
            String AdminPasswort = "Abc123";
            String AktuellerBenutzer = null;

            String[] BenutzerListe = {
                "Admin",
                "Yanick",
                "Pfanner",
                "Housi",
                "Barbara",
                "Gast"
            };

            while (true) {
                Console.Clear();
                Console.WriteLine("Bitte melde dich mit deinem Benutzernamen an");
                AktuellerBenutzer = Console.ReadLine();
                int BenutzerIndex = 0;
                // Alle Benutzernamen testen
                for (; BenutzerIndex < BenutzerListe.Length; BenutzerIndex++) {
                    // Groß/kleinschreibung für die Anmeldung ignorieren
                    if (BenutzerListe[BenutzerIndex].ToLower() == AktuellerBenutzer.ToLower()) {
                        AktuellerBenutzer = BenutzerListe[BenutzerIndex];
                        break;
                    }
                }

                // Nicht das Ende der Liste erreicht ? Wenn doch war der eingebene Name nicht in der Benutzerliste
                if (BenutzerIndex != BenutzerListe.Length) {
                    // Benutzer 0 == Admin
                    if (BenutzerIndex == 0) {
                        while (true) {
                            Console.Clear();
                            Console.WriteLine("Bitte melde dich mit dem Admin Passwort an");
                            if (Console.ReadLine().Equals(AdminPasswort))
                                break;
                        }
                    }
                    break;
                }

            }
            Console.WriteLine("\nDu bist als " + AktuellerBenutzer + " angemeldet");
            Benutzer CurrentUser = new Benutzer(AktuellerBenutzer);

            Console.WriteLine("Versuche 0: " + CurrentUser.Versuche[0]);

            Console.ReadLine();
        }
    }

    public class Benutzer {
        public const int MAXENTRIES = 10;
        public String[] Zeiten = new String[MAXENTRIES];
        public int[] Versuche = new int[MAXENTRIES];

        public Benutzer(String BenutzerName) {
            // Hier evtl. Prüfen ob für BenutzerName die Daten schon einmal gespeichert wurden und hier laden ..
            // if (File.Exists(BenutzerConfigname)) {
            // ...
            // }
            // else {

            for (int i = 0; i < MAXENTRIES; i++)
                Zeiten[i] = null;

            // }
        }
    }
 
Ich habe eine Frage zu meinem Spaghetti code.
Deine Lösung ist zwar viel kürzer aber auch viel Komplexer, wenn ich meine Code benutze weiss ich welcher Abschnitt was macht
Deshalb ist meine Frage wie schlimm ist es einen Spaghtti Code zu haben denn ich verstehe meinen Code viel besser als deine kürzere und komplexere Version.


Wirkt sich mein Code irgendwie negativ auf die Benutzerobefälche aus??

Lg Kcinay
 
Spaghetti Code führt nur dazu, dass das Programm schlecht wartbar ist. In erster Linie von anderen, mit steigender Zeitdifferenz zwischen erstellen und (wieder-)anschauen und mit steigender Programmlänge aber auch von Dir selbst.

Du kannst nun darauf vertrauen dass Du eine der Ausnahmen von dieser Regel bist (solche Ausnahmen gibt es). Oder aber Du versuchst so früh wie möglich aus den Erfahrungen anderer zu lernen und Spaghetti-Code zu vermeiden.
Wobei ich selbst nicht in der Lage bin zwischen solchem zu unterscheiden. Ich kann nur versuchen Dir eine Erklärung zu liefern. Hope that helps.
 
Vorweg: Ich habe mir beide Lösungen nicht im Detail angeschaut/nachvollzogen, weil ich gerade nebenbei TV gucke ;)

kcinay055679 schrieb:
Deshalb ist meine Frage wie schlimm ist es einen Spaghtti Code zu haben denn ich verstehe meinen Code viel besser als deine kürzere und komplexere Version.
Du musst das so sehen: Knapp die Hälfte deines Codes besteht aus der Initialisierung deines Statistikarrays. Das ist sogesehen noch gar kein richtiger Programmcode, sondern eigentlich nur die Vorbereitung der Datenbasis. Als ich mir eben deinen Code rauskopiert und im Editor angeschaut habe, musste ich also erstmal laaaaaaaaaaaaange scrollen. Für solche repetitiven Aufgaben gibt es beispielsweise Schleifen. Was machst du, wenn du weitere Benutzer hinzufügen willst? Noch mehr initialisieren? Und was ist, wenn du die Statistik erweitern möchtest auf zB von 10 auf 20? Oder gar 100? Bei deiner Version würde man plötzlich das eigentliche Programm wie die Nadel im Heuhaufen suchen müssen, weil der Code fast nur noch aus Initialisierung bestehen würde.

Apropos neue Benutzer: Du initialisierst ein Benutzerarray und vergleichst dann in zahlreichen ifs die Eingabe mit dem Benutzer in dem Array, um dann AktuellerBenutzer händisch auf denselben Wert zu setzen wie er im Array steht? Den kompletten if if if if if if Block ab Zeile 222 kannst du mit einer Schleife abfrühstücken. Das mag komplexer wirken, ist aber deutlich effizienter, weil komplett unabhängig von der Anzahl der Benutzer. Egal ob 2, 8, 17 oder 236 Benutzer, die Schleife würde einfach den aktuellen Benutzer suchen und finden. Du müsstest dann knapp 230 neue ifs dazu bauen, für jeden der 230 neuen Benutzer ein weiteres if. Knapp die Hälfte des Codes bestünde nun also aus Initialisierung, die knappe andere Hälfte aus ifs und dein Spiel befände sich im letzten Prozent des Codes.

Spaghetti-Code hat leider die elendige Eigenschaft, immer länger zu werden.

Wie auch immer, das sind alles nur gut gemeinte Ratschläge, niemand meint es böse. Mit der Zeit wirst du selbst auf den Trichter kommen, dass kurzer, wenn auch minimal komplexerer Code besser ist, als Seitenweise repetitives Zeug, das sich aufbläht wie eine Milchtüte, die man in die Sonne stellt ;)
Es gibt aber Grenzen. Manch ein Programmierer - oftmals c++ Veteranen - liebt es, Einzeiler zu schreiben. Die sind zwar schön kurz, aber nicht immer sofort nachzuvollziehen. Man muss das gesunde Mittelmaß aus Komplexität und Lesbarkeit finden.
 
Hallo, ja wie die anderen schon richtig angemerkt haben wird der Code immer aufgeblähter/unübersichtlicher, es schleichen sich Fehler ein, bei Deinem obigen Code muss man sich z.B als "Gast" anmelden um die Admin-Passwortabfrage zu bekommen .. oder der Fehler mit dem Index-Array, weil eben alles Copy & Paste war, aber dann händisch die Offsets nachträglich geändert wurden, so das in Zeile 89 die IndexOutOfRangeException auftritt und Du dann nicht weisst woran es liegt - weil Du hast es ja kopiert, sollte doch laufen!? .. Ausserdem sind mehrdimensionale Arrays zwar ein faszinierendes Thema mit dem man viel machen kann, aber für solche Daten völlig übertrieben, weil erstens sowieso immer nur ein Benutzer angemeldet sein kann, also würde "
string[,,] StatistikListe = new string[10, 11];" schon reichen, aber auch das ist noch viel zu groß da du ja nur zwei verschiedene Werte-Gruppen a 10 Werte ablegen willst, das Array so aber aus 110 (10*11) Feldern besteht. Ausserdem leidet auch die Lesbarkeit/Wartbarkeit darunter wenn Du unter StatistikListe[4, 5, 1] etwas ablegst .. Das weisst Du vielleicht im Moment noch, aber wenn Du den Code jemand zeigst oder in 2 Monaten nochmal ansiehst verstehst Du vermutlich nur noch Bahnhof - das gleiche gilt für uns die Dich unterstützen wollen ...
Und ich hab ja schon Kommentare eingefügt wo ich dachte das es nicht so klar ist was es macht, falls dazu Fragen sind immer her damit. :)

P.S: Wollte eigentlich noch den User in der Klasse ablegen, das macht es einfach wenn Du z.B seine Highscores mal speichern willst usw ..
Code:
    public class Benutzer {
        public const int MAXENTRIES = 10;
        public String[] Zeiten = new String[MAXENTRIES];
        public int[] Versuche = new int[MAXENTRIES];
        public String Name { get; }

        public Benutzer(String BenutzerName) {
            this.Name = BenutzerName;
            // Hier evtl. Prüfen ob für BenutzerName die Daten schon einmal gespeichert wurden und hier laden ..
            // if (File.Exists(BenutzerConfigname)) {
            // ...
            // }
            // else {

            for (int i = 0; i < MAXENTRIES; i++)
                Zeiten[i] = null;

            // }
        }
    }

In Deiner Hauptklasse kannst Du dann den Namen per CurrentUser.Name ansprechen.
 
Zuletzt bearbeitet:
MAXENTRIES ist eine Konstante mit dem Wert 10. Hätte man auch es MAX_ENTRIES nennen können.

Damit wird die Größe des Array angegeben new String[MAXENTRIES] -> new String[10]. Eine Konstante hat den Vorteil, dass du sie später wieder nutzen kannst. Z.B. beim Durchlauf der For-Schleife. Damit stellst du sicher, dass du keine ArrayOutOfBoundsException bekommst.

String[] Zeiten entspricht deinem y (y = zeit) - analog Versuche (z). Hier wurde anstelle der Matrix eine Klasse Benutzer erstellt, die die Daten dann für einzelne Nutzer trennt. Anstelle in einer großen Matrix zu arbeiten, kann man dediziert für den Nutzer nachfragen. Vereinfacht die Nutzung und Handhabung im Generellen.

Gruß
 
Nochmal eine Frage kann mir und erklären was "to lower/.lenght" macht bzw. Wie es funktioniert??
 
Das sollen zwei verschiedene Fragen sein, oder? Die Namen (so man sie richtig schreibt) halte ich eigentlich für relativ selbsterklärend, aber nun gut:
Die Klasse string hat verschiedene Methoden, die verschiedene Aufgaben bewältigen können. Diese Methoden kannst du von jedem string-Objekt aus aufrufen. Dazu schreibst du den Namen des Objekts, gefolgt von einem Punkt, gefolgt von dem Namen der gewünschten Methode.
string.ToLower() gibt dir den String in abgewandelter Form zurück, sodass alle Großbuchstaben nun durch ihr Pendant in Kleinbuchstaben ersetzt wurden.
string.length() gibt die die Länge des Strings in Zeichen als numerischen Wert zurück. Bspw. hat "Hello World" eine Länge von 11 Zeichen, "abcdefg" hingegen nur eine Länge von 7 Zeichen.
 
tolower() setzt man beispielsweise ein, wenn man Strings miteinander vergleicht und die Groß-/Kleinschreibung ignorieren will. Das geht je nach Sprache zwar auch mit compare() und entsprechendem Parameter, aber man sieht beides recht häufig. Ich vergleiche eigentlich auch meistens mit tolower() und "blabla".

Allerdings tut compare noch mehr als nur Groß-/Kleinschreibung zu ignorieren und ist daher insbesondere bei Unicode deutlich zuverlässiger.

Soweit ich weiß gibt es aber keine Möglichkeit ein switch-Statement mit compare auszuführen und so "switched" man in der Regel mit String.tolower() und bei den Cases entsprechend mit kleingeschriebenen case-Strings.
 
kcinay055679 schrieb:
Nochmal eine Frage kann mir und erklären was "to lower/.lenght" macht bzw. Wie es funktioniert??
Ach z.B BenutzerListe.Length meinst Du, das gibt einfach die Länge des Arrays zurück und wenn man Schleifen damit definiert verhindert man auf einfachen wege das eine ArrayOutOfBounds-Exception auftritt.
.ToLower() wurde ja schon erklärt, in Java gibt es .equalsIgnoreCase(...) direkt beim vergleich, falls Unicode-Zeichen (oder z.B Deutsche Umlaute) im Text vorkommen kann man auch .ToLowerInvariant() verwenden.
Ich habe es eingebaut damit man z.B auch mit "admin" einloggen kann, statt nur "Admin".
 
Richtig, Switch in CS ist statisch.
String Vergleiche sind immer so eine Sache. Da muß man sich ggfs ein paar Gedanken zur Implementierung machen.

Zunächst: vorsichtig mit .Equals().
Dann kann man prüfen mit simpler Identität (==).
String.CompareTo ist meist die beste, weil flexibelste Variante für simple Vergleiche.
Erweiterte Vergleiche gehen dann mit sogenannten regulären Ausdrücken.

Außerdem haben die meisten Stringfunktionen einen optionalen Parameter Provider. Der gibt Spezifika an, wie mit dem String verfahren werden soll: ob klein/groß berücksichtigt werden soll usw. Das wird dann wichtig, wenn andere Sprachen als die eigene berücksichtigt werden muß. Paradebeispiel ist immer Türkisch. Das hat zwei Buchstaben I und İ. Klein dann ı und i. Das kleine i ist eben nicht dasselbe wie das große I, sodaß man nicht einfach ToLower() sagen kann, ohne außerdem über den provider zu sagen: hey, hierfür gelten spezielle Regeln.

Ansonsten wurde ja das wichtigste gesagt. Für die Programmierung ist Lesbarkeit natürlich wichtig. Sie ist aber sekundär. Wichtiger ist effiziente Verarbeitung und minimierter Code, wobei es wie angemerkt ein gewisses Optimum gibt und weniger nicht absolut besser ist.

Dennoch, wenn Wiederholungen da sind: Schleifen oder extra Funktionen, zur selben Zeit aber auch Schleifen vermeiden, wenn es auch ohne geht. Beispiel: man kann eine Schleife bauen, die 10x 10 dazu addiert... oder man kann einmal + 100 sagen. Hier ist der Punkt, wo Programmieren eigenen Regeln genügt und von anderen Paradigmen abweicht, zB mathematischen.
 

Ähnliche Themen

W
  • Gesperrt
  • Frage
2 3
Antworten
45
Aufrufe
2.610
Antworten
10
Aufrufe
759
Zurück
Oben