当前位置:编程学习 > C#/ASP.NET >>

一个学生类,该如何改进

这是一个控制台的程序,有一个班级,需要为每一个学生输入各科(语文,数学和英语)考试成绩,包括学生姓名,科目和成绩。1、请依次输入每个学生的各科成绩然后输出。2、请计算各科成绩最好的学生以及分数。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace stuConsole {

    //定义学生类
    class student {
        //字段定义
        private string name;            //姓名
        private double engScore;        //英语成绩
        private double chScore;          //语文成绩
        private double mathScore;       //数学成绩
        public static bool isEnd = false;
        public static int count;   //记录学生的个数
        public student() {
            count++;
        }

        //定义属性,通过属性访问、修改相应字段
        public string Name {
            set { name = value; }
            get { return name; }
        }
        public double EngScore {
            set { engScore = value; }
            get { return engScore; }
        }
        public double CScore {
            set { chScore = value; }
            get { return chScore; }
        }
        public double MathScore {
            set { mathScore = value; }
            get { return mathScore; }
        }
        ArrayList arrayList = new ArrayList(4);

        //输入相应的数据
        public void inputText() {
            Console.WriteLine("请输入姓名:");
            Name = Console.ReadLine();
            if (name == "end") {
                student.isEnd = true;
                return;
            }
            Console.WriteLine("请输入英语成绩:");
            EngScore = double.Parse(Console.ReadLine());
            Console.WriteLine("请输入语文成绩:");
            CScore = double.Parse(Console.ReadLine());
            Console.WriteLine("请输入数学成绩:");
            MathScore = double.Parse(Console.ReadLine());
        }
        //输出相应的数据
        public void outputText() {
            Console.WriteLine("当输入姓名为end时结束");
            Console.WriteLine("姓名为:{0}", Name);
            Console.WriteLine("语文成绩为{0}", CScore);
            Console.WriteLine("英语成绩为{0}", EngScore);
            Console.WriteLine("数学成绩为{0}", MathScore);
        }
    }
    class Program {
        static void Main(string[] args) {
            student[] t = new student[100];
            for (int i = 0; i < 100; i++) { t[i] = new student(); }
            student.count = 0;
            while (true) {
                try {

                    //student t;
                    t[student.count] = new student();
                    t[student.count].inputText();
                    if (student.isEnd) {
                        break;
                    }
                    t[student.count].outputText();

                    Console.ReadLine();
                    student.count++;
                }
                catch (Exception ex) {
                    Console.WriteLine(ex.Message.ToString());
                }
            }
            double empty = 0;
            double empty2 = 0;
            double empty3 = 0;
            int bestMath = 0;
            int bestEng = 0;
            int bestChe = 0;
            for (int j = 0; j < student.count; j++) {
                if (t[j].MathScore > empty) {
                    bestMath = j;
                    empty = t[j].MathScore;
                }
                if (t[j].CScore > empty2) {
                    bestChe = j;
                    empty2 = t[j].CScore;
                }
                if (t[j].EngScore > empty3) {
                    bestEng = j;
                    empty3 = t[j].EngScore;
                }
            }
            Console.WriteLine("数学最好的是:");
            Console.WriteLine(t[bestMath].Name + ",成绩是:" + t[bestMath].MathScore.ToString());
            Console.WriteLine("语文最好的是:");
            Console.WriteLine(t[bestChe].Name + ",成绩是:" + t[bestChe].CScore.ToString());
            Console.WriteLine("英语最好的是:");
            Console.WriteLine(t[bestEng].Name + ",成绩是:" + t[bestEng].EngScore.ToString());
            Console.ReadLine();
        }
    }

}

该如何改进,是代码更加优秀 类 C# 学生管理 .Net --------------------编程问答-------------------- 怎么改进,使代码更加简洁,优秀。 --------------------编程问答-------------------- 学生类不需要写输入数据的方法

在主程序里,for 循环来输入学生实体的属性即可 --------------------编程问答-------------------- 表示作业题..  --------------------编程问答-------------------- 用地道的C#风格去写,而不是带着Java的“口音”。 --------------------编程问答--------------------
引用 4 楼 caozhy 的回复:
用地道的C#风格去写,而不是带着Java的“口音”。

--------------------编程问答-------------------- 帮忙把你们改之后的比较好的代码贴上一下哇  --------------------编程问答-------------------- public string Name { get; set; } --------------------编程问答--------------------
引用 7 楼 u011493085 的回复:
public string Name { get; set; }
除了这个之外,还有其他地方可以改进的么? --------------------编程问答--------------------
public static int count;   //记录学生的个数
 你是学生? 你有这个属性? 
还有学生类都有些什么行为? inputText(),outputText()?  不过这挺形象的
现在的学生上学确实都是整天在inputText(),outputText() --------------------编程问答--------------------
引用 4 楼 caozhy 的回复:
用地道的C#风格去写,而不是带着Java的“口音”。

--------------------编程问答--------------------
引用 4 楼 caozhy 的回复:
用地道的C#风格去写,而不是带着Java的“口音”。
--------------------编程问答-------------------- public student() {
            count++;
        }

学生人数的增加写在构造函数中,个人觉得不妥。。

--------------------编程问答--------------------
引用 7 楼 u011493085 的回复:
public string Name { get; set; }


这个写法好像3.5以前的是不支持的。。 --------------------编程问答-------------------- 代码太多,懒得看。 --------------------编程问答--------------------
引用 13 楼 paopaozhu8899 的回复:
Quote: 引用 7 楼 u011493085 的回复:

public string Name { get; set; }


这个写法好像3.5以前的是不支持的。。


嗯,所以说如果一个人的c#水平停留在7年前永远不学习了,那么不会就不会吧! --------------------编程问答--------------------
引用 15 楼 sp1234 的回复:
Quote: 引用 13 楼 paopaozhu8899 的回复:

Quote: 引用 7 楼 u011493085 的回复:

public string Name { get; set; }


这个写法好像3.5以前的是不支持的。。


嗯,所以说如果一个人的c#水平停留在7年前永远不学习了,那么不会就不会吧!
你们把改良之后的代码,贴一份出来吧 --------------------编程问答-------------------- 不是C#代码,怎么分开这么像Java --------------------编程问答-------------------- 你的代码挺好的。反正能完成要求即可,不用听下面的人乱七八糟的说一些没他妈鸟用的废话。 --------------------编程问答-------------------- --------------------编程问答--------------------

1:类、属性、方法的注释用XML的注释比较好
2:属性如果没什么特殊的处理,直接用Get;Set即可,代码简洁(你都引用了linq了,简写方式是支持的)
3:建议私有private变量用_开头的小驼峰写法,受保护变量直接使用小驼峰写法,而且不要写public变量,如果是public的可以写成属性方式,方法名称命名建议使用打驼峰写法
4:ArrayList arrayList = new ArrayList(4);  这变量定义好像没用到 以后建议少定义ArrayList 可以用List<T>来代替,减少拆箱装箱的开销
5:感觉你没必要写inputText这个变量赋值功能的方法,因为你设置的变量都是属性方式,而且又是对外可写的
6:IsEnd和count这两个静态变量感觉没必要定义,对学生类来说有用吗?
7:学生类的功能方法里面建议不要含Console.WriteLine这种控制台关键词,这样的话Student类你放到winform或者webform怎么用?
8:像类似outputText输出的功能可以重写ToString()来返回你需要输出的字符串


以上纯属个人看法 --------------------编程问答-------------------- 楼主去看《重构,改善既有的代码>>, --------------------编程问答-------------------- 楼主结贴的时候别忘了给点分啊~ --------------------编程问答-------------------- 1、學生類裏面只留屬性(name,score(對應學科))和初始化的方法(get,set)------對象
2、如果是要計算班級人數添加新的對象類---class
3、相應的循環放到主程序裏面,對應的賦值和查找什麽的分別放在小的函數裏面,主程序只負責調用就好 --------------------编程问答-------------------- 代码有点多了  其实几行就写完了  定义变量不用那么重复  方法调用的时候直接传参数实现  算法直接写就行了 --------------------编程问答-------------------- 除 --------------------编程问答--------------------

public class Student
{
    public Student(String name)
    {
        if (String.IsNullOrEmpty(name))
        {
            throw new ArgumentNullException("姓名name");
        }
        this._name = name;
    }
    private string _name;
    private double _engScore;
    private double _chScore;
    private double _mathScore;

    /// <summary>
    /// 姓名
    /// </summary>
    public string Name
    {
        private set { this._name = value; }
        get { return this._name; }
    }
    /// <summary>
    /// 英语成绩
    /// </summary>
    public double EngScore
    {
        set
        {
            if (value < 0 || value > 100)
            {
                throw new InvalidOperationException("英语成绩[0-100]");
            }
            this._engScore = value;
        }
        get { return this._engScore; }
    }
    /// <summary>
    /// 语文成绩
    /// </summary>
    public double CScore
    {
        set
        {
            //value检测
            this._chScore = value;
        }
        get { return this._chScore; }
    }
    /// <summary>
    /// 数学成绩
    /// </summary>
    public double MathScore
    {
        set
        {
            //value检测
            this._mathScore = value;
        }
        get { return this._mathScore; }
    }

    public override string ToString()
    {
        return String.Format("[{0}:语文 {1},英语 {2},数学 {3}]\r\n",
            this.Name,
            this.CScore.ToString(),
            this.EngScore.ToString(),
            this.MathScore.ToString());
    }
}
class Program
{
    public static Student GetInputStudent()
    {
        Console.WriteLine("请输入姓名:");
        String name = Console.ReadLine();
        //异常判断
        Student student = new Student(name);
        Console.WriteLine("请输入英语成绩:");
        //异常判断
        student.EngScore = double.Parse(Console.ReadLine());
        Console.WriteLine("请输入语文成绩:");
        student.CScore = double.Parse(Console.ReadLine());
        Console.WriteLine("请输入数学成绩:");
        student.MathScore = double.Parse(Console.ReadLine());
        return student;
    }
    static void Main(string[] args)
    {
        Student[] students = new Student[100];
        for (int i = 0; i < 100; i++)
        {
            try
            {
                students[i] = GetInputStudent();
                Console.WriteLine(students[i]);
                Console.WriteLine("当输入end时结束");
                if (String.Equals(Console.ReadLine(), "end", StringComparison.OrdinalIgnoreCase))
                {
                    break;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}


先改一点吧。。。 --------------------编程问答--------------------
引用 4 楼 caozhy 的回复:
用地道的C#风格去写,而不是带着Java的“口音”。


版主不说我都么注意,LZ的风格还真是Java的。。。。次奥。。。。 --------------------编程问答-------------------- 先从语言规范的方面来说说吧,C#使用PascalCase,而不是Java的camelCase,所有的类名、方法名都应该以大写字母开头。
还有就是类的设计,你的这个类中又了很多不必要的字段、方法,应该删除。
另外一个就是字符串相等的逻辑判断,你的代码是
if (name == "end"){/*code...*/}
,但是推荐使用
String.Equals(String,StringComparison)
,StringComparison.OrdinalIgnoreCase可以忽略大小写。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,