2016-06-24 7 views
2

Ich muss ein einfaches Programm schreiben, wo Sie Schüler Namen und ihre Durchschnittsnote eingeben müssen und dann die höchste Durchschnittsnote ausdrucken und wem es gehört. Es gibt verschiedene Themen, um herauszufinden, ob der Wert im Array angezeigt wird. Die Sache, mit der ich zu kämpfen habe, ist, was zu tun ist, wenn es mehr als 1 Schüler mit der maximalen Durchschnittsnote gibt.C# - Überprüfen Sie, wie oft ein Wert im Array erscheint und Indizes finden

Hier ist, was ich bisher:

 Console.WriteLine("Enter the overall count of students."); 


     int stuCount = Convert.ToInt32(Console.ReadLine()); 
     string[] name = new string[stuCount]; 
     double[] avg = new double[stuCount]; 

     for (int i = 0; i < stuCount; i++) 
     { 
      Console.WriteLine("Enter the name of student # {0}.", i + 1); 
      name[i] = Console.ReadLine(); 
      Console.WriteLine("Enter the average grade of {0}.", name[i]); 
      avg[i] = Convert.ToDouble(Console.ReadLine()); 
     } 

     // Finding the max average 
     double maxAvg = avg[0]; 
     for (int i = 1; i < stuCount; i++) 
     { 
      if (avg[i] > maxAvg) 
      { 
       maxAvg = avg[i]; 
      } 
     } 

     // Displaying the max average 
     Console.WriteLine("The highest average grade is {0}.", maxAvg); 

So kann ich Array.IndexOf() Methode mehrere Indizes zu finden?

Vielen Dank.

+0

drucken Verwenden Sie die Überladung von 'Array.IndexOf()' mit dem 'StartIndex' Argument, um mehrere Indizes zu finden: https://msdn.microsoft.com/en-us/ Bibliothek/3b2fz03t (v = vs.110) .aspx –

+1

Aktuelle und aktive Frage zu SO, die sich in mehrfacher Hinsicht mit dem gleichen Problem befasst - [SO link] (http://stackoverflow.com/questions/38006865/how-can -i-make-my-procedure-for-find-the-nth-am häufigsten-Element-in-a-arra/38008666 # 38008666) – pijemcolu

+0

Sie können nur Array oder auch Klassen und Listen verwenden? – Tinwor

Antwort

-1

Nachdem Sie die höchste Durchschnitt nur Schleife gefunden haben wieder durch die Mittelwert Array zu sehen, welche die max diejenigen sind und die Bolzen drucken den Index.

Console.WriteLine("The highest average grade is {0}.", maxAvg); 

Console.WriteLine("The students with this average grade are"); 
     for (int i = 0; i < stuCount; i++) 
     { 
      if (avg[i] == maxAvg) 
      { 
       Console.WriteLine(name[i]); 
      } 
     } 
+0

Mach dir keine Sorgen. Es passiert mir den ganzen Tag. –

2

Verwenden Sie eine Klasse, um die Noten so darzustellen;

class Grade { 
    public String Name {get;set;} 
    public double Average {get;set;} 
} 

Dann kann Ihr Code mehr wie sein;

Console.WriteLine("Enter the overall count of students."); 

     int stuCount = Convert.ToInt32(Console.ReadLine());   

     List<Grade> allGrades = new List<Grade>(); 

     for (int i = 0; i < stuCount; i++) 
     { 
      Console.WriteLine("Enter the name of student # {0}.", i + 1); 
      var name = Console.ReadLine(); 
      Console.WriteLine("Enter the average grade of {0}.", name[i]); 
      var avg = Convert.ToDouble(Console.ReadLine()); 
      Grade current = new Grade(){ 
       Name = name, 
       Average = avg 
      }; 
      allGrades.Add(current); 
     } 

     // Finding the max average 
     double maxAvg = allGrades.Max(g => g.Average); 
     var highestGrades = allGrades.Where(g => g.Average == maxAvg); 

     Console.WriteLine("The following Student(s) have the highest average grade:"); 
     foreach(var grade in highestGrades){ 
       // Displaying the max average 
       Console.WriteLine("Student: {0}. Grade: {1}.", grade.Name, grade.Average); 
     } 
} 
0

Ein anderer Weg ist die Schaffung einer Klasse, die zwei Eigenschaften (name und average grade), dann eine List erzeugen und es in einem for Zyklus zu füllen. Der nächste Schritt ist order by descending die Liste durch average grade und wählen Sie das erste N-Element gleich. Danach können Sie einfach das Ergebnis mit einem ForEach