-2

私のプログラムには、マークのリストと、studentId を格納する辞書があります。ユーザーが StudentId を入力し、その ID に従ってマークのリストを指すようにしたいと考えています。私はそれを間違って実装していると思います。誰かがそれを実装するのを手伝ってくれますか? ありがとう

 public class Student() {
        private string name;
        private string surname;
        private string dob;
        private string address;
        private int id;

        public Student()
        {
        }
        public Student(string year,string name, string surname, string dob, string address)
        {
            this.name = name;
            this.surname = surname;
            this.dob = dob;
            this.address = address;
            this.year = year;
        }


      public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public string Surname
        {
            get { return surname; }
            set { surname = value; }

        }

        public string DOB
        {
            get { return dob; }
            set { dob = value; }
        }

        public string Addr
        {
            get { return address; }
            set { address = value; }

        }
        public int Id
        {
            get { return id; }
            set { id = value; }
        }


        private string year;

        public string Year
        {
            get { return year; }
            set { year = value; }

        }
         public Student(string s)
        {
            string[] splitted = s.Split(',');
            name = splitted[0];
            surname = splitted[1];
            dob = splitted[2];
            address = splitted[3];
           // id = splitted[4];          
         }
        public Dictionary<int,List<Marks>> dictionary= new Dictionary<int,List<Marks>>();
        public List<Marks> Mathematics = new List<Marks>();
        public List<Marks> English = new List<Marks>();
        public List<Marks> Maltese = new List<Marks>();
        public List<Marks> ReligiousStudies = new List<Marks>();
        public List<Marks> SocialStudies = new List<Marks>();
        public Dictionary<int, List<Marks>> dictionar = new Dictionary<int, List<Marks>>();


        public void AddMarks(int hyexam, int anexam)
        {
            {
                Console.WriteLine("enter id of student to input marks to:");
                string id = Console.ReadLine();
                if (dictionar.ContainsKey(Id).Equals(id))
                {
                    Mathematics.Add(new Marks(hyexam, anexam));
                    English.Add(new Marks(hyexam, anexam));
                    Maltese.Add(new Marks(hyexam, anexam));
                    ReligiousStudies.Add(new Marks(hyexam, anexam));
                    SocialStudies.Add(new Marks(hyexam, anexam));
                    dictionar.Add(id, (Mathematics)); //dont know how to implement it
                }
                else
                {
                    Console.WriteLine("id not found");
                }

            }
        }

   public class Marks
    {
        private int hyexam;
        private int anexam;
        private string id;
        public int HYEXAM
        {
            get { return hyexam; }
            set { hyexam = value; }
        }

        public int ANEXAM
        {
            get { return anexam; }
            set { anexam = value; }
        }

        public string Id
        {
            get { return id; }
            set { id = value; }
        }

        public Marks(int hyexam, int anexam)
        {          
            this.hyexam = hyexam;
            this.anexam = anexam;
        }
        public Marks(string id)
        {
            this.id = id;
        }

        public double OverallExam()
        {
            return (0.4 * hyexam) + (0.6 * anexam);
        }

    }
}
4

3 に答える 3

4

主な問題はあなたのモデリングだと思います。Dictionary<int, List<Marks>>内のフィールドとしてを含めましたStudent。つまり、 Studentオブジェクトには辞書があります。それは意味がありません - 辞書のキーは学生 ID であるためですよね?

Studentあなたが現在持っているように、各オブジェクトがマークのリストにあることはおそらく理にかなっています(ただし、パブリックフィールド、IMOとしてではありません)。Dictionaryその情報を考えると、本当にマークに行く必要がありますか? 各学生 ID を にマッピングし、からマークを取得できるDictionary<int, Student>場所 (クラス内ではなくStudentおそらくクラス内?)を持つ方がクリーンではないでしょうか?SchoolStudentStudent

何を達成しようとしているのか、データが実際にどこに属しているのかをよく考えてください。私の経験では、データ モデリングが適切に行われている場合、通常、コードはきれいに続きます。

(名前とデザインの両方の観点から、クラスにも質問しますMarks。これらのプロパティは何を表すことを意味していますか?それは実際には試験の単一のマークではありませんか?おそらくExamResultもっと明確になるでしょう?それは本当に変更可能である必要がありますか? )

于 2012-12-04T17:45:28.453 に答える
1

これは間違いなくモデリングの問題であるというジョンに同意します(OPの他の投稿に基づく)。オブジェクト指向プログラミングに慣れていない場合、最初に行う必要があるのは、問題を解決するために作成する必要があるオブジェクトを決定することです。

学生とは?学生には、名前、ID、生年月日、学年などがあります。学生が持つ属性ごとに、フィールドまたはプロパティを設定する必要があります。

public class Student
{
    public int ID { get; set; }
    public string Name { get; set; }
    public DateTime DoB { get; set; }
    ... etc ...
}

マークとは何ですか?あなたの説明によると、マークには科目、中間試験の点数、年次試験の点数があります。

public class Mark
{
    public string Subject { get; set; }
    public int MidScore { get; set; }
    public int FinalScore { get; set; }
}

生徒とマークの関係は? 生徒には、自分に関連付けられたマークのリストがあります。これは List<> オブジェクトで最もよく説明されています。

public class Student() // continued
{
    public List<Mark> Marks { get; set; }
}

オブジェクトの基本設定が完了すると、必要のないものを除外するのが簡単になり、質問に答えるのがずっと簡単になります。:)

于 2012-12-04T19:34:45.520 に答える
0

わたしの提案:

「マーク」クラスには、サブジェクトを識別する何かが必要です (サブジェクトと呼ばれる列挙型、文字列、またはデータベースに保存されている場合はサブジェクトの ID を持つ int である可能性があります)

次に、次のことができます。

Console.WriteLine("enter id of student to input marks to:");
string id = Console.ReadLine();

var marks = new Dictionary<int, List<Mark>>();

if (UserExists(id))
{
    Console.WriteLine("mark for subject1:");        
    string s1 = Console.ReadLine();
    Console.WriteLine("mark for subject2:");        
    string s2 = Console.ReadLine();

    var list = new List<Mark>();
    list.Add(new Mark { Subject = SubjectEnum.Subject1, Value = Convert.ToDecimal(s1), });
    list.Add(new Mark { Subject = SubjectEnum.Subject2, Value = Convert.ToDecimal(s2), });

    marks.Add(Convert.ToInt32(id), list)
}
else
{
    Console.WriteLine("id not found");
}

お役に立てれば。

于 2012-12-04T17:59:06.440 に答える