C#课程实验

本文通过C#代码示例展示了如何创建一个包含属性和方法的人类类,以及如何进行派生,如学生类、工人类和学生干部类。实现了属性限制、构造函数和析构函数、索引器、运算符重载、排序功能等面向对象特性。同时,演示了如何在主函数中初始化和操作这些类的对象,包括对学生数组的排序。
摘要由CSDN通过智能技术生成

题目:定义一个人类(Person),包括属性:姓名(name)、性别(sex)、年龄(age);包括方法:display(),输出个人信息,吃饭(eat)、睡觉(sleep)、工作(work)。
(1) 定义带参构造函数,初始化属性值;
(2) 定义析构函数,输出Person对象的信息;
(3) 定义默认构造函数,实现构造函数重载,测试构造函数和析构函数的构造和析构顺序;
(4) 对属性sex和age的赋值范围进行限制;
(5) 根据Person类,派生一个学生类(Student),增加属性:学校(school)、学号(number)、语数外各科成绩(scores,一个数组)、和平均成绩,为该数组实现索引器,实现索引器注意分数的赋值范围0-100分;
(6)定义Student的带参构造函数,实现学生属性的初始化,部分属性调用父类构造函数来实现;
(7)定义Student的非静态函数total和average求学生总成绩和平均成绩
(8)在Student中重写工作方法(学生的工作是学习),重写display方法,输出学生信息
(9)重载加法运算符,两个学生对象相加等价于学生平均成绩相加
(10)根据Person类,派生一个工人类(Worker),增加属性:单位,工龄;重写工作方法(工人的工作是……自己想想吧)。
(11)根据学生类,派生一个学生干部类(StudentLeading),增加属性:职务(job);增加方法:开会(meeting)。
(12)编写主类分别对上述3类具体人物进行测试。
(13)在主函数中定义学生数组或者集合,并对集合初始化,实现对学生数组的排序(实现按学号、按姓名、按平均成绩排序)

实现代码:

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

namespace Person
{
    public class Person         //人类
    {//包括属性:姓名(name)、性别(sex)、年龄(age);包括方法:display(),输出个人信息,吃饭(eat)、睡觉(sleep)、工作(work)。
        public string Name;      //姓名
        protected int Age;          //年龄
        protected char Gender;      //性别

        public Person()             //默认构造函数
        {
            Console.WriteLine("===默认构造函数===");
        }

        public Person(string name, int age, char gender)        //定义带参构造函数,初始化属性值
        {
            this.Name = name;
            //对属性sex和age的赋值范围进行限制
            if (age < 0 || age > 200)
            {
                Console.WriteLine("年龄不得小于0 或大于200!");
                age = 0;
            }
            this.Age = age;

            if (gender != '男' && gender != '女')
            {
                Console.WriteLine("性别只能为“男”或“女”!");
                gender = '男';
            }
            this.Gender = gender;
        }
        ~Person()                   //定义析构函数,输出Person对象的信息
        {
            Console.WriteLine("===析构函数===");
            Console.WriteLine("姓名:" + Name + "   年龄:" + Age + "   性别:" + Gender);
        }
        public virtual void display()               //display()函数
        {
            Console.WriteLine("你好,我叫" + Name + ",性别" + Gender + ",今年" + Age + "岁。");
        }

        public void eat() { Console.WriteLine("我在吃饭。"); }       //吃饭方法
        public void sleep() { Console.WriteLine("我在睡觉。"); }     //睡觉方法
        public virtual void work() { Console.WriteLine("我在工作。"); }      //工作方法
    }
    public class Student : Person           //根据Person类,派生一个学生类(Student)
    {
        //属性:学校(school)、学号(number)、语数外各科成绩(scores,一个数组)、和平均成绩
        //const int MAX = 3;
        protected string School;
        public int Number;
        //protected double[] Scores = new double[MAX];
        public double AvrScore
        {
            get { return Average(); }
        }
        protected double _Math;
        protected double Chinese;
        protected double English;
        public double this[int index]
        {
            get
            {
                if (index == 0) return _Math;
                else if (index == 1) return Chinese;
                else if (index == 2) return English;
                else return 0;
            }
            set
            {
                if (value > 0 && value <= 100)                  //赋值范围0-100分
                {
                    if (index == 0) _Math = value;
                    else if (index == 1) Chinese = value;
                    else if (index == 2) English = value;
                }
                else Console.WriteLine("成绩范围为0-100!");
            }
        }

        //定义Student的带参构造函数,实现学生属性的初始化,部分属性调用父类构造函数来实现
        public Student(string school, int number, double math, double chinese, double english, string name, int age, char gender) :base(name,age,gender)
        {
            this.School = school;
            this.Number = number;
            if (math < 0 || math > 100) { Console.WriteLine("数学成绩范围为0-100!");    math = 0; }
            this._Math = math;
            if (chinese < 0 || chinese > 100) { Console.WriteLine("语文成绩范围为0-100!"); chinese = 0; }
            this.Chinese = chinese;
            if (english < 0 || english > 100) { Console.WriteLine("英语成绩范围为0-100!"); english = 0; }
            this.English = english;
        }
        public double Total()           //总成绩
        {
            double total = _Math + Chinese + English;
            return total;
        }
        public double Average()         //平均成绩
        {
            return Total() / 3;
        }
        public override void display()          //重写display方法,输出学生信息
        {
            Console.WriteLine("姓名:" + Name + "    性别:" + Gender + "    年龄:" + Age + "    所在学校:" + School + "    学号:" + Number + "    语数外成绩:" 
            + Chinese + "  " + _Math + "  " + English + "    平均成绩:" + AvrScore);
        }
        public override void work()             //重写工作方法(学生的工作是学习)
        {
            Console.WriteLine("学生的工作是学习。");
        }
        public static double operator +(Student s1, Student s2)     //重载加法运算符,两个学生对象相加等价于学生平均成绩相加
        {
            return s1.AvrScore + s2.AvrScore;
        }
    }

    //根据Person类,派生一个工人类(Worker),增加属性:单位,工龄;重写工作方法
    public class Worker : Person
    {
        protected string Career;       //工作单位
        protected int Years;        //工龄
        public Worker(string name, int age, char gender,string career,int years) : base(name, age, gender)
        {
            this.Career = career;
            this.Years = years;
        }
        public override void display()
        {
            Console.WriteLine("姓名:" + Name + "    性别:" + Gender + "    年龄:" + Age + "    职业:" + Career + "    工龄:" + Years);
        }
        public override void work()         //重写工作方法
        {
            Console.WriteLine("我的工作是:"+Career);
        }
    }
    public class StudentLeading : Student           //根据学生类,派生一个学生干部类(StudentLeading)
    {//增加属性:职务(job);增加方法:开会(meeting)
        protected string Job;

        public StudentLeading(string school, int number, double math, double chinese, double english, string name, int age, char gender, string job) : base(school, number, math, chinese, english, name, age, gender)
        {
            this.Job = job;
        }
        public void meeting()
        {
            Console.WriteLine("我是学生干部,我在开会。");
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            //编写主类分别对上述3类具体人物进行测试。
            Student student = new Student("南华大学", 0001, 89, 88, 90, "张三", 21, '男');
            Student student1 = new Student("南华大学", 00015, 79, 98, 87, "王五", 19, '男');
            Worker worker = new Worker("赵六", 33, '男', "工程师", 3);
            StudentLeading studentLeading = new StudentLeading("南华大学", 0002, 90, 93, 87, "李四", 21, '女', "学生会会长");
            student.display();
            Console.WriteLine(student.Name + "总成绩为:" + student.Total());
            student.work();
            var result = student.AvrScore + student1.AvrScore;
            Console.WriteLine(student.Name + "和" + student1.Name + "的平均成绩之和为:" + result);
            student.eat();
            Console.WriteLine("================以上为Student类信息================");
            Console.WriteLine();
            worker.display();
            worker.work();
            Console.WriteLine("================以上为Worker类信息================");
            Console.WriteLine();
            studentLeading.meeting();
            Console.WriteLine("================以上为StudentLeading类信息================");

            //在主函数中定义学生数组或者集合,并对集合初始化,实现对学生数组的排序(实现按学号、按姓名、按平均成绩排序)
            Student[] students = new Student[5];
            students[0] = new Student("南华大学", 2018, 79, 98, 87, "王五", 19, '男');
            students[1] = new Student("南华大学", 2023, 66, 99, 84, "小红", 18, '女');
            students[2] = new Student("南华大学", 2020, 79, 88, 85, "小花", 20, '女');
            students[3] = new Student("南华大学", 2019, 67, 67, 69, "小明", 22, '男');
            students[4] = new Student("南华大学", 2022, 77, 98, 87, "小刚", 25, '男');
            List<Student> stu=new List<Student>();
            for (int i = 0; i < 5; i++)                 //将数组加入list集合中
            {
                stu.Add(students[i]);
            }
            Console.WriteLine("数组排序前序列:");          //输出数组排序前序列
            for(int i = 0; i < 5; i++)
            {
                Console.WriteLine("学号:"+students[i].Number+"    姓名:"+students[i].Name+"    平均成绩:"+students[i].AvrScore);
            }
            //按照学生学号进行排序
            List<Student> sortedNum = stu.OrderBy(s => s.Number).ToList();
            Console.WriteLine();
            Console.WriteLine("==========数组按照学生学号进行排序后序列==========");          //输出数组排序后序列
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("学号:" + sortedNum[i].Number + "    姓名:" + sortedNum[i].Name + "    平均成绩:" + sortedNum[i].AvrScore);
            }
            //按照学生姓名进行排序
            List<Student> sortedName = stu.OrderBy(s => s.Name).ToList();
            Console.WriteLine();
            Console.WriteLine("==========数组按照学生姓名进行排序后序列==========");          //输出数组排序后序列
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("学号:" + sortedName[i].Number + "    姓名:" + sortedName[i].Name + "    平均成绩:" + sortedName[i].AvrScore);
            }
            List<Student> sortedAvrScore = stu.OrderBy(s => s.AvrScore).ToList();
            Console.WriteLine();
            Console.WriteLine("==========数组按照学生平均成绩进行排序后序列==========");          //输出数组排序后序列
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("学号:" + sortedAvrScore[i].Number + "    姓名:" + sortedAvrScore[i].Name + "    平均成绩:" + sortedAvrScore[i].AvrScore);
            }
            Console.ReadKey();
        }
    }
}

对属性sex和age的赋值范围进行限制:

http://t.csdn.cn/kBY24

不懂怎么将成绩作为一个数组,然后在构造函数里面得到三门科目的成绩,为这个数组实现索引器也不懂。

在主函数中定义学生数组或者集合,并对集合初始化,实现对学生数组的排序(实现按学号、按姓名、按平均成绩排序):
如何实现按照数组元素中的属性进行排序,并且能输出数组中元素的值。不知道是不是这样子写。
对于ArrayList、Array了解不深,还有List。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值