2017-09-06 12 views
-1

私はすでに作成したプロジェクトにビルドしています。これは辞書/リストを使用する私の最初の試みです。これは非常に広範な質問です。私が持っている本は辞書をまったく使っていないため、オンラインでのユーザー入力で辞書の例を見つけることができません。私は、ユーザーに多数の学生と多数の試験を求め、次に各試験のスコアを入力させ、試験の得点に基づいて各生徒の平均成績を出力する多次元配列を使用してプログラムを作成しました。私は今、配列の代わりに辞書とリストを使用して、同じことを達成したい。私はどこから始めるべきか分からない。誰でもこれがどのように機能するのか説明できますか?C#辞書とリストをユーザー入力と共に使用するにはどうすればよいですか?

class MainClass 
{ 
    public static void Main(string[] args) 
    { 
     int TotalStudents = 0; 
     int TotalGrades = 0; 

     Console.WriteLine("Enter the number of students: "); 
     TotalStudents = Convert.ToInt32(Console.ReadLine()); 

     Console.WriteLine("Enter the number of exams: "); 
     TotalGrades = Convert.ToInt32(Console.ReadLine()); 

     int[,] scoresArray = new int[TotalStudents, TotalGrades]; 

     for (int r = 0; r < TotalStudents; r++) 
      for (int c = 0; c < TotalGrades; c++) 
      { 
      Console.Write("Please enter exam score {0} for student {1}: ", c + 1, r + 1); 
       scoresArray[r, c] = Convert.ToInt32(Console.ReadLine()); 
      } 
     for (int r = 0; r < scoresArray.GetLength(0); r++) 
     { 
      int studentSum = 0; 
      int testCount = 0; 
      for (int c = 0; c < scoresArray.GetLength(1); c++) 
      { 
       studentSum += scoresArray[r, c]; 
       testCount++; 
      } 
      string gradeLetter = ""; 
      double average = studentSum/testCount; 
      Console.WriteLine("\nStudent " + (r + 1).ToString() + " Average Score: " + average.ToString()); 

      if (average >= 90) 
      { 
       gradeLetter = "A"; 
      } 
      else if (average >= 80 && average < 90) 
      { 
       gradeLetter = "B"; 
      } 
      else if (average >= 70 && average < 80) 
      { 
       gradeLetter = "C"; 
      } 
      else if (average >= 60 && average < 70) 
      { 
       gradeLetter = "D"; 
      } 
      else 
      { 
       gradeLetter = "F"; 
      } 

      Console.WriteLine("Student " + (r + 1).ToString() + " will recieve a(n) " + gradeLetter + " in the class.\n"); 
     } 
     Console.Write("\nPress the [ENTER] key to exit."); 
     Console.ReadLine(); 
    } 
} 
+0

ヒント:* student *をスコア*のリストにマッピングする辞書を作成します。 –

+0

このコードはコンパイルされません。コンパイルに必要な完全なコードだけを投稿してください。 – Sach

+0

'Dictionary >'ここで、stringは学生IDであり、リスト 'List 'はテストのスコアです。文字列の値はキーであり、値はリストです。 –

答えて

0

辞書は素晴らしいツールです!私はあなたの元の論理を使用しようとしましたが、時には別の方法をとらなければなりませんでした。また、私は "c"と "r"のインデックス変数を失ってしまいました。私はインデックスのために長い名前を好む。お役に立てれば。

//Let's create a gradeTranslator dictionary. 
// As the grades follow the simple divisions along averages divisible by 10, 
// we can just use the first digit of the average to determine the grade. 


using System; 
using System.Collections.Generic; 
using System.Linq; 


namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      bool useSampleData = true; 
      Dictionary<string, List<double>> gradeBook = new Dictionary<string, List<double>>(); 
      Dictionary<int, string> gradeTranslator = new Dictionary<int, string>(); 

      for (int i = 0; i < 6; i++) { 
       gradeTranslator.Add(i, "F"); 
      } 
      gradeTranslator.Add(6, "D"); 
      gradeTranslator.Add(7, "C"); 
      gradeTranslator.Add(8, "B"); 
      gradeTranslator.Add(9, "A"); 
      gradeTranslator.Add(10, "A"); 

      int TotalStudents, TotalGrades; 

      // For testing purposes, it is a lot easier to start with some 
      // sample data. So, I created a query to see if the user wants 
      // to use sample data or to provide her own input. 
      Console.WriteLine("Do you want to input the data (I) or allow me to use sample data (S)?"); 
      var inputMethod = Console.ReadLine(); 

      if(inputMethod.ToUpper().IndexOf("I") >=0) { 
       useSampleData = false; 
      } 

      // User Sample Data 
      if (useSampleData) { // test without using the console input 
       gradeBook.Add("Bob", new List<double>() { 67.8, 26.3, 33.2, 33.1, 67.2 }); 
       gradeBook.Add("Dick", new List<double>() { 88.2, 45.2, 100.0, 89.2, 91.5 }); 
       gradeBook.Add("Jane", new List<double>() { 99.2, 99.5, 93.9, 98.2, 15.0 }); 
       gradeBook.Add("Samantha", new List<double>() { 62, 89.5, 93.9, 98.2, 95.0 }); 
       gradeBook.Add("Estefania", new List<double>() { 95.2, 92.5, 92.9, 98.2, 89 }); 

       TotalStudents = gradeBook.Count(); 
       TotalGrades = gradeBook["Bob"].Count(); 

       TotalStudents = 5; 

      // user will provide their own data. 
      } else { 

       Console.WriteLine("Enter the number of students: "); 
       TotalStudents = Convert.ToInt32(Console.ReadLine()); 

       Console.WriteLine("Enter the number of exams: "); 
       TotalGrades = Convert.ToInt32(Console.ReadLine()); 



       for (int studentId = 0; studentId < TotalStudents; studentId++) { 
        Console.Write("Please enter name of student {0}: ", studentId); 
        var name = Console.ReadLine(); 
        gradeBook.Add(name, new List<double>()); 
        for (int testId = 0; testId < TotalGrades; testId++) { 
         Console.Write("Please enter exam score {0} for " + 
         "student {1}: ", testId + 1, name); 
         gradeBook[name]. 
         Add(Convert.ToDouble(Console.ReadLine())); 
        } 
       } 

      } 

      // Here we will divide the grade by 10 as an integer division to 
      // get just the first digit of the average and then translate 
      // to a letter grade. 
      foreach (var student in gradeBook) { 
       Console.WriteLine("Student " + student.Key + 
      " scored an average of " + student.Value.Average() + ". " + 
       student.Key + " will recieve a(n) " + 
       gradeTranslator[(int)(student.Value.Average()/10)] + 
           " in the class.\n"); 
      } 

      Console.Write("\nPress the [ENTER] key to exit."); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

うわー、役に立つ返信がたくさん...ありがとうございました! – anglr4

0

情報を保持する学生クラスを作成します。これは、すでに作成したコードです。

public class Student 
{ 
    public string ID 
    public List<double> TestScores {get;set;} 
    // in this case average only has a getter which calculates the average when needed. 
    public double Average 
    { 
     get 
     { 
     if(TestScores != null && TestScores.Count >0) 
     { 
      double ave = 0; 
      foreach(var x in TestScores)//basic average formula. 
       ave += x; 
      // using linq this could be reduced to "return TestScores.Average()" 
      return ave/TestScores.Count; 
     } 
     return 0; // can't divide by zero. 
     } 

    } 
    public Student(string id) 
    { 
    ID = id; 
    TestScores = new List<double>(); 
    } 

} 

これで、辞書コレクションで情報を保持できます。ここから始めるには、データにアクセスするための2つの方法があります。間違いなく包括的ではありません。

辞書に要素を追加する:これはどちらかの宿題である、またはあなたがしようとしているので

foreach(var s in dict.Keys) 
{ 
    dict[s].TestScores.Add(50); 
} 
+2

LINQを使用して、単に 'return TestScores.Average();'を実行することができます。 – Sach

+0

はい、私はあまりにも複雑さを追加したくありませんでした。それは良いメモを作るだろうが。 –

+1

複雑ではありませんか? –

0

辞書をループ
string aveScore = dict["Jerry"].Average.ToString("#.00"); 
Console.Write(aveScore); 

Dictionary<string,Student> dict = new Dictionary<string,Student>(); 
Student stud = new Student("Jerry"); 
dict.Add(stud.ID,stud); 

情報を引っ張りますコードをポストするのではなく、辞書を使う方法を学ぶために、私はちょうど正しい方向性に。

DictionaryのC#は、キーと値のペアの集合です。 Keyは一意である必要がありますが、Valueである必要はありません。あなたは辞書を定義するのであれば、次のように:

Dictionary<int, int> dict = new Dictionary<int, int>(); 

それはあなたがKeyタイプintのあるペアのコレクションを作成したこと、およびValueはタイプintでもあります。あなたは辞書にアイテムのカップルを追加するのであれば、それはコンテンツが次のようになります:

enter image description here

index = 0で、あなたはKey=1、およびValue=100でアイテムを持っています。 index = 1には、Key=2Value=200という項目があります。

ただし、辞書のValueは、必ずしも単一の値である必要はありません。 Collection(またはクラスオブジェクト、または別の辞書)でもかまいません。

あなたの要件は、学生一人当たりのスコアのリストを持つことである、とCollectionが、それは辞書を使用してのように見える辞書Value許可は確かに良いアイデアですので。しかし、どんな辞書を使うべきですか?

さて、選択肢はたくさんあります。

1つの方法は、Dictionary<string, List<int>>を使用することです。学生名(またはID)を表すstringとテストスコアを表すList<int>。そう;

Dictionary<string, List<int>> dict = new Dictionary<string, List<int>>(); 

今、あなたは、各生徒のスコアと、この辞書を移入することができます。例:

dict.Add("Arthur Dent", new List<int>() { 75, 54, 26 }); 
dict.Add("Zaphod Beeblebrox", new List<int>() { 12, 13, 7 }); 
dict.Add("Ford Prefect", new List<int>() { 99, 89, 69 }); 

あなたの場合は、各生徒の名前とスコアを入力してユーザーから入力することができます。

しかし、私が言ったように、クラスオブジェクトを辞書Valueとして使用することもできますが、それは実際問題に対するより良いアプローチです。フェリックスの答えはこれを行う方法を示しているので、詳細には触れません。しかし、基本的には、あなたのクラスがStudentであると仮定して、次のように辞書を作成したいと思っています。

Dictionary<string, Student> dict = new Dictionary<string, Student>(); 

そして、ユーザの入力に基づいてStudentのインスタンスを作成し、辞書に追加します。 Studentクラスを使用することの利点は、1人の学生に関連するすべての情報を1か所に持たせることができ、Felixの例でAverage()メソッドなどのヘルパーメソッドを追加することができるため、コードがはるかにクリーンでシンプルになります。

関連する問題