面向过程思维下的年级排名 C#


前言

提示:面向过程,面向对象,相信很多刚学编程的人都听过这两个词。面向对象定义网上铺天盖地,一个个例子也很生动,但要是联系到代码实例中,可能也处理不是很好,下面是一个简单的例子,希望大家体会。如有不当之处,还望大家指导。


提示:以下是本篇文章正文内容,下面案例可供参考

一、面向过程是什么?

简单的举个例子,是如何将大象装进冰箱

为了解决这个问题,我们采用两种方案,一种是面向过程方案,另一种是面向对象方案

面向过程:

总共分三个过程,第一个过程:冰箱门打开(关着门的冰箱) 返回值是打开门的冰箱

第二个过程:大象装进去(打开门的冰箱) 返回值是打开着门,装着大象的冰箱

第三个过程:冰箱门关上(打开着门,装着大象的冰箱) 返回值关着门的装着大象的冰箱

面向对象:

总共分三个动作,(每个动作都有一个对象去执行)

第一个动作:冰箱.开门()

第二个动作:冰箱.装进(大象)

第三个动作:冰箱.关门()

或者是链式调用冰箱.开门().装进(大象).关门()


运用到实例中呢?

再举个例子,现在期末考试下来了,年级一共8个班,一个班50到56人若干不等。有三门考试科目,语文数学英语,分数也是随机不定,请写出年级大榜,按照三科总成绩进行排名,并奖励前十名同学。下面试着用面向对象的思想去写出代码。

二、代码

1.学生类

代码如下(示例):

namespace ConsoleApplication1
{
    class Student
    {
        public string Name { get; set; }
        public double English { get; set; }
        public double Chinese { get; set; }
        public double Maths { get; set; }
        public double SumScore { get; set; }
        public double Average
        {
            get { return Math.Round(SumScore / 3, 2); }
        }
        public Student(string names)
        {
            this.Name = names;
        }
        public Student()
        {
        }
    }
 }

2.班级类

代码如下(示例):

class Banji
    {
        public string BanjiName { get; set; } //班级名
        public int BanjiNumber { get; set; } //班级学生数量
        public List<Student> Students { get; set; } //学生集合
        public Teacher[] Ttype = new Teacher[3];
        public double AvgTotal
        {
            get { return Students.Average(p => p.SumScore); }
        }
        public double AvgChinese
        {
            get { return Students.Average(p => p.Chinese); }
        }
        public double AvgMath
        {
            get { return Students.Average(p => p.Maths); }
        }
        public double AvgEnglish
        {
            get { return Students.Average(p => p.English); }
        }
        public List<Student> UseInit()
        {
            Init a = new Init();
            var stu = a.Students;
            return stu;
        }
    }

3.初始化

代码如下(示例):

 /// <summary>
    /// 实例化各种类
    /// </summary>
    class Init
    {
        public List<Student> Students { get; set; } //学生集合
        public List<Banji> Banjilist { get; set; } //班级集合
        public void InitBanji() // 初始化班级,班级只管班级自己的事,班级名,班级号,班级人数
        {
            Banjilist = new List<Banji>();
            Random r = new Random(DateTime.Now.Millisecond);
            for (int j = 0; j < 8; j++)
            {
                Banji bj = new Banji();
                bj.BanjiNumber = r.Next(50, 56); 
                bj.BanjiName = "C" + (j + 1).ToString();
                this.Banjilist.Add(bj); //前面是个空的集合,后面方法无效
            }
        }

        public void InitStudent() //初始化学生,学生只管学生自己的事,学生姓名,语数英分数,总分,平均分
        {
            Students = new List<Student>();
            Random r = new Random(DateTime.Now.Millisecond);
            for (int i = 0; i < 8; i++)  //外层是班级,八个班
            {
                Banjilist[i].Students = new List<Student>();
                for (int j = 0; j < Banjilist[i].BanjiNumber; j++)  //Banjilist里面放着banjinumber数量,一个班的人数
                {
                    Student student = new Student();  //new 一个实例
                    student.Maths = r.Next(70, 150);
                    student.English = r.Next(80, 150);
                    student.Chinese = r.Next(90, 145);  
                    student.SumScore = student.Maths + student.English + student.Chinese;
                    student.Name = ("C" + (i + 1).ToString()) + (j + 1).ToString().PadLeft(3, '0'); //学生名字是 本班名字+在班级第几个(如c101,c102)
                    Banjilist[i].Students.Add(student);  //加入到数组里
                    Students.Add(student);
                }
            }
        }
    }

4 方法

 public static void Student_Sort()
        {
            Init Is = new Init(); //实例化一个对象
            //var LS = Is.InitStudent(); //调用Init里的InitBanji方法            
            Is.InitBanji();
            Is.InitStudent();
            #region
            //for (int i = 0; i < banjilist.Count; i++) //班级个数
            //{
            //    foreach (var csl in banjilist[i].Students) //班级里的学生数量
            //    {
            //        Stotal.Add(csl);
            //    }
            //}
            #endregion
             var stuOrder = Is.Students.OrderByDescending(p => p.SumScore).ToList();
            for (int i = 0; i < stuOrder.Count; i++)
            {
                Console.WriteLine("排名:{0},姓名:{1},成绩:{2}", i + 1, stuOrder[i].Name, stuOrder[i].SumScore);
            }
            Console.ReadKey();
            Console.WriteLine("表扬以下前十的学生:");
            var topten = (from a in Is.Students orderby a.SumScore descending select a).Take(10).ToList();
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(topten[i].Name);
            }
            Console.ReadKey();
        }

最后在Main函数里调用方法
效果如下
在这里插入图片描述
在这里插入图片描述

这是实例中的一个功能,所以还有别的数据…


总结

这个例子里,面向对象思想,对于学生来说,就考虑学生自己的事,什么是自己的事,叫什么(名字)学号,考了哪几门,总分多少就可以了;以至于一个班里有多少个学生,我是哪个班的不是学生该管的事。相应的班级也是,考虑到遍历年级所有学生时,要把学生集合加到班级类里面去,以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值