In einem Programm, das nach Name, Nachname und Alter von 10 Schülern fragt, müssen wir am Ende den Namen eines von ihnen eingeben und das Programm muss seinen Platz im Array angeben. Es sagt mir immer, dass der Ort 0 ist. Hier ist der Code:

public class Program_pinakes
{
    public static void Main(string[] args)
    {
        int i; 
        string[] a = new string[10]; 
        string[] b = new string[10]; 
        int[] c = new int[10]; 
        int index = 0;

        for (i = 0; i < 10; i++)
        {  
            Console.Write("Name: ");
            a[i] = Console.ReadLine();
            Console.Write("Surname: ");
            b[i] = Console.ReadLine();
            Console.Write("Age: ");
            c[i] = Int32.Parse(Console.ReadLine());
        }

        Console.Write("Name of student you are looking for: ");
        string name = Console.ReadLine();
        if (name == a[i])
            index = i;

        Console.Write("Student"+a[i]+" is located at"+index+" place.");
    }       
}

Bearbeiten: Vielen Dank für Ihre Antworten. Ich habe von dem IndexOutOfRange-Problem erfahren und es leicht gelöst. Das Hauptproblem bestand darin, dass der Index 0 zurückgibt. Nachdem ich ihn in die Schleife gesetzt habe, um das Array erneut zu durchsuchen, wird 0 für den Vornamen, 1 für den zweiten usw. zurückgegeben. Ist dies der richtige Weg oder sollte 1 für den Vornamen, 2 für den zweiten usw. zurückgegeben werden?

c#
0
Sts013 18 Apr. 2018 im 15:30

4 Antworten

Beste Antwort

Am Ende der Schleife hat i den Wert 10. (Dies ist der Grund, warum die Abbruchbedingung: i < 10 zu true wird und die Schleife beendet wird).

Wenn Sie also versuchen, nach der Schleife auf a[i] zuzugreifen, wird eine IndexOutOfRange-Ausnahme ausgelöst. Weil Sie nicht genug Elemente in Ihrem Array haben.

Lösung: Um ein Element zu finden, müssen Sie erneut das Array durchlaufen und jeden Wert mit dem Suchnamen vergleichen:

 for(int i = 0; i < 10; i++ )
 {
    if (name == a[i])
    {
       index = i;
       break; // finish the loop, you have found the first occurence
    }
 }
 Console.Write("The first occurence of Student: "+name+" is located at"+index+" place.");

Bearbeiten: Es kann natürlich vorkommen, dass der Suchname nicht in der Liste enthalten ist. Sie können einen solchen Fall behandeln, indem Sie den Wert index mit -1 initialisieren und nach der Suchschleife danach suchen:

int index = -1;

// search loop here

if (index > -1)
{
    Console.Write("The first occurence of Student: " + name + " is located at" + index + " place.");
}
else
{
    Console.Write("Student: "+ name +" could not be found!");
}
3
Mong Zhu 19 Apr. 2018 im 06:58

Dieser von Ihnen veröffentlichte Code funktioniert nicht, da eine Ausnahme System.IndexOutOfRangeException ausgelöst wird.

Abgesehen von dieser Ausnahme wäre meine Antwort jedoch: weil,

       if (name == a[i])
            index = i;
         Console.Write("Student"+a[i]+" is located at"+index+" place.");

Auf diese Weise prüfen Sie, ob der i-te Eintrag des Arrays der gewünschte ist oder nicht. Wenn ja, setzen Sie den Index mit i.

Aber was ist damit, dass es nicht passt? index bleibt bei dem Wert, mit dem er initialisiert wurde. Hier ist es Null, was Sie in der Ausgabe erhalten.

Sie sollten wie unten tun.

             index = -1;
             for(int j = 0; i < a.Length; j++ )
             {
                if (name == a[j])
                {
                   index = j;
                   break;
                }
             }
             if(index != -1)
                Console.Write("Student" + name + " is located at" + (index + 1) + " place.");
             else
               Console.Write("Student" + name + " is not in list");
2
Amit 18 Apr. 2018 im 13:08

Erstellen Sie ein Student -Objekt, das alle schülerspezifischen Daten enthält:

class Student
{
   public string Name { get; set; }
   public string Surename { get; set; }
   public int Age { get; set; }
}

Erstellen Sie nun eine Liste von Student:

var students = new List<Student>();

Und erstellen Sie in Ihrer Schleife für jede Wiederholung ein neues Student Objekt:

for (i = 0; i < 10; i++)
{  
   Console.Write("Name: ");
   var name = Console.ReadLine();
   Console.Write("Surname: ");
   var surname = Console.ReadLine();
   Console.Write("Age: ");
   var age = Int32.Parse(Console.ReadLine());

   students.Add(new Student {Name = name, Surname = surname, Age = age});
}

Nach der Schleife fragen Sie nach dem Namen des Schülers, für den Sie den Index haben möchten, und verwenden LINQ, um ihn in der Liste zu finden:

Console.Write("Name of student you are looking for: ");
string name = Console.ReadLine();
var foundStudent = students.FirstOrDefault(s => s.Name.Equals(name));
if(foundStudent != null)
{
   var index = students.IndexOf(foundStudent);
   Console.Write($"Student {foundStudent.Name} is located at {index} place.");
}
else
{
   Console.WriteLine($"No student for name {name} found");
}

HINWEIS :
Schauen Sie sich die String-Interpolation von C # zum Erstellen an Zeichenfolgen mit Variablen. Ich finde es viel sauberer.

1
croxy 18 Apr. 2018 im 12:52

Der Index ist immer 0, da sich Ihre if (name == a[i]) -Anweisung nicht in einem Lopp befindet. Sie suchen also nicht im Array, sondern prüfen nur, ob es dem 11. Element (Array beginnt bei 0 zu zählen) entspricht. (i wird nach Ihrer for-Schleife auf 10 gesetzt)

0
misanthrop 18 Apr. 2018 im 12:43