-1

生徒と科目の詳細を取得するためのギザギザ配列があります。2 つのギザギザ配列を使用しました。特定の学生の場合、どうすればそれを実行できるか教えてもらえますか。以下は私のコード全体です。

public void GetStudentDetails()
        {

            Console.WriteLine("Please enter number of Students");
            int STUDENTS = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Please enter number of Subjects");
            int SUBJECTS = Convert.ToInt32(Console.ReadLine());    //0 is reserved for the student name, so the marks starts from the index 1, hence if you set the marks for 3, it will ask for 2 marks


            string[][] student_details = new string[STUDENTS][];
            string[][] subject_details = new string[SUBJECTS][];
            string[][] result_details = new string[STUDENTS][];

            StringBuilder stud_sub_info = new StringBuilder();
            stud_sub_info.Append("Name\tRoll-No\t");
            for (int a = 0; a < STUDENTS; a++)
            {
                student_details[a] = new string[STUDENTS * 2];
                for (int b = 0; b < 2; b++)
                {
                    Console.WriteLine("Enter Student {0} {1}:", a + 1, (b == 0) ? "Name" : "Roll-No");
                    student_details[a][b] = Console.ReadLine();
                }
                for (int c = 0; c < SUBJECTS; c++)
                {
                    subject_details[c] = new string[SUBJECTS * 2];
                    for (int d = 0; d < 2; d++)
                    {
                        if (d == 0)
                        {
                            Console.WriteLine("Enter Name for Subject {0}", c + 1);
                            subject_details[c][d] = Console.ReadLine();
                            stud_sub_info.Append(subject_details[c][d] + "\t");
                        }
                        else
                        {
                            Console.WriteLine("Enter Marks for {0}", subject_details[c][d - 1]);
                            subject_details[c][d] = Console.ReadLine();
                        }
                    }
                }
            }
            Console.WriteLine(stud_sub_info.ToString());
            for (int a = 0; a < STUDENTS; a++)
            {
                for (int b = 0; b < 2; b++)
                {
                    Console.Write(student_details[a][b] + "\t");
                }
                for (int c = 0; c < SUBJECTS; c++)
                {
                    for (int d = 0; d < 2; d++)
                    {
                        Console.Write(subject_details[c][d] + "\t");
                    }
                }
            }
        }
4

2 に答える 2

2

これは、Linq、コレクションを使用して、ジャグ配列の代わりにクラスを作成する方がはるかに簡単です。これにより、1 人の生徒を多くのコースに連鎖させ、各コースに多くの課題を持たせることができます。次に、次のような Linq ステートメント:

Sum(x => x.StudentGrade)

以下は、合計やその他の情報を使って何ができるかを理解するためだけに、私が最初に使用するもののスタブ コピーです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StudentManagement {
  public class Student {

    public static void Main(string[] args) {
      List<Student> students = new List<Student>();

      Console.Write("Enter number of students: ");
      int numStudents = int.Parse(Console.ReadLine());

      for (int i = 0; i < numStudents; i++) {
        Student s = new Student();
        students.Add(s);
      }

      Console.Write("Press any key to continue...");
      Console.ReadKey(true);
    }

    public string FirstName { get; set; }
    public List<Course> Courses { get; set; }

    public Student() {
      this.Courses = new List<Course>();

      Console.Write("Enter First Name: ");
      this.FirstName = Console.ReadLine();

      Console.Write("Enter in number of courses: ");
      int numCourses = int.Parse(Console.ReadLine());

      for (int i = 0; i < numCourses; i++) {
        Course course = new Course();
        this.Courses.Add(course);
      }

    }
  }

  public class Course {
    public string Title { get; set; }
    public string Code { get; set; }
    public string Section { get; set; }
    public List<Assignment> Assignments { get; set; }

    public Course() {
      this.Assignments = new List<Assignment>();

      // Set Title, Code, Section
      Console.Write("Enter nuber of assignments: ");
      int numAssignments = int.Parse(Console.ReadLine());

      for ( int i = 0; i < numAssignments; i++) {
        Assignment assignment = new Assignment();
        this.Assignments.Add(assignment);
      }

    }
  }

  public class Assignment {
    public string Name { get; set; }
    public double MaxGrade { get; set; }
    public double StudentGrade { get; set; }

    public Assignment() {
      // Prompt for Name, MaxGrade, StudentGrade
    }
  }
}
于 2012-12-04T21:40:26.017 に答える
1

私は確かにこのようなジャグ配列を使用しません。コーディングが難しくなります。

たとえば、コードでは、各学生の件名をキャプチャしていますが、キャプチャすると、前の学生のデータが消去されます。ジャグ配列にはstudentのsubject_detailsインデックスがありません。移動しながらデータを効果的に上書きしています。配列をとして宣言する必要がありますstring[][][]

これがあなたのコードです、より単純にされて、それはうまくいくでしょう:

string[][] student_details = new string[STUDENTS][];
string[][][] subject_details = new string[STUDENTS][][];
string[][] result_details = new string[STUDENTS][];

for (int a = 0; a < STUDENTS; a++)
{
    student_details[a] = new string[STUDENTS * 2];
    subject_details[a] = new string[SUBJECTS][];
    Console.WriteLine("Enter Student {0} {1}:", a + 1, "Name");
    student_details[a][0] = Console.ReadLine();
    Console.WriteLine("Enter Student {0} {1}:", a + 1, "Roll-No");
    student_details[a][1] = Console.ReadLine();
    for (int c = 0; c < SUBJECTS; c++)
    {
        subject_details[a][c] = new string[SUBJECTS * 2];
        Console.WriteLine("Enter Name for Subject {0}", c + 1);
        subject_details[a][c][0] = Console.ReadLine();
        Console.WriteLine("Enter Marks for {0}", subject_details[a][c][0]);
        subject_details[a][c][1] = Console.ReadLine();
    }
}
for (int a = 0; a < STUDENTS; a++)
{
    Console.Write(student_details[a][0] + "\t");
    Console.Write(student_details[a][1] + "\t");
    for (int c = 0; c < SUBJECTS; c++)
    {
        Console.Write(subject_details[a][c][0] + "\t");
        Console.Write(subject_details[a][c][1] + "\t");
    }
}

すべての学生が同じ数の科目を持っている必要があり、科目スコアの数値以外の入力を許可するという事実を無視すると、次のLINQクエリを使用して、ジャグ配列を実行可能なものに変えることができます。

var query =
    from i in Enumerable.Range(0, STUDENTS)
    let Name = student_details[i][0]
    let RollNo = student_details[i][1]
    let Subjects = (
        from j in Enumerable.Range(0, SUBJECTS)
        let Subject = subject_details[i][j][0]
        let Marks = int.Parse(subject_details[i][j][1])
        select new { Subject, Marks }
    )
    select new { Name, RollNo, Subjects };

これにより、次のような構造になります。

クエリデータ構造

これで、このクエリを使用して合計点数を取得できます。

var results =
    query
        .Select(x => new
        {
            x.Name,
            TotalMarks = x.Subjects.Sum(y => y.Marks)
        });

そして今、これは次のようになります:

合計点数

于 2012-12-05T03:56:27.887 に答える