C程序设计上机实验.pptx
华北电力大学计算机系一、实验目的 通过用C编写一个学生考试成绩信息系统,强化面向对象程序设计思想,使学生能够将C程序设计中的面向对象、重载、模板、文件等各种概念,灵活的运用到实际的程序设计中去。第1页/共22页华北电力大学计算机系二、实验要求 1)录入课程和选课学生的信息;2)录入成绩3)学生信息和成绩的修改;4)统计学生成绩;5)成绩排序;按成绩排序6)统计成绩分布功能:即各成绩段学生的数量:“优”:90100;“良”:8090;“中”:7080;“及格”:6070;“不及格”60。并输出统计分布结果;7)查找:能够查找指定学生的各门成绩和平均分及其名次;第2页/共22页华北电力大学计算机系三、实验原理实验使用面向对象的设计思想,在学生成绩考试系统中,主要涉及的是学生和课程,对于所有的学生,都具有共性,因此可以抽象为一个学生类,同理可以得到课程类。第3页/共22页华北电力大学计算机系1类的设计:实验首先设计两个类:学生类和课程类,并根据面向对象的信息隐蔽原则,设置相应的类成员的访问属性。(1)学生类(a)属性:主要包括学生的个人信息,包括学号、姓名、班级、成绩等。(b)操作:学生信息的输入、输入函数,学生成绩的设置和获取函数。(2)课程类(a)属性:主要包括课程号、课序号、学分、任课教师、选课人数、学生成绩表。(b)操作:包括课程信息的录入、录入选课学生信息、录入选课学生的成绩,(若成绩为-1表示缺考),成绩分析、成绩排序、显示课程及选课学生信息等。第4页/共22页华北电力大学计算机系2.类模板和函数模板的设计:(1)数组类模板的设计:对于某一门课,选课的学生很多,可定义一个数组模板,并将数组模板实例化为学生对象数组。(2)无论对什么数据类型的排序,使用的排序算法都是一样的,因此需要定义一个函数模板,用学生类实例化,实现学生的成绩排序,排序算法可选用插入排序、冒泡排序或者选择排序等。第5页/共22页华北电力大学计算机系3运算符重载的设计(1)学生的信息和成绩以及选课信息要求写入文件并在需要时从文件中读出,需要重载插入、提取运算符“”。(2)学生成绩排序要对学生对象进行比较、赋值等操作,而类实际上是一种复杂数据类型,因此上述这些操作要通过运算符重载(=、)来实现。第6页/共22页华北电力大学计算机系四、实验所需仪器、设备、材料(试剂)本实验基于window平台,使用VC+为开发工具。五、实验预习要求、实验条件、方法及步骤 1理解C面向对象编程的基本概念,包括类和对象、模板、运算符重载等。2根据实验要求,画出相应的类图。3按照类图,编程并实现。第7页/共22页华北电力大学计算机系实验二公司计薪系统第8页/共22页华北电力大学计算机系一、实验目的 类的封装、派生和继承、多态性是C面向对象程序设计三大特征,本实验通过编写一个简单的公司计薪系统,使学生能够将上述三大特征灵活的运用到实际的编程当中去,提高程序的复用性。第9页/共22页华北电力大学计算机系二、实验要求 1问题描述 某公司,员工的薪水每月发一次,每月1日,上报上月个人工作信息。这些信息由会计将信息输入计薪系统。对于该系统要求如下:(1)公司主要分为三种员工:经理、时薪人员、销售人员。(2)对于任何一位员工,计薪系统都能够:(a)计算工资(b)打印该员工的工资单(c)员工也可以查询自己的工资。(3)三种员工的薪金计算方式不同(a)经理:固定月薪(b)时薪人员:时薪每月工时(c)销售人员:时薪每月工时佣金销售额(4)总经理拥有特殊权利,可以更改某人时薪和佣金。第10页/共22页华北电力大学计算机系2.研究计薪系统的问题域,根据研究对象的共性抽取出类,并抽象出各个类之间的派生关系,并画出类图。3.确定哪些类为基类,哪些为派生类,并分别确定基类和派生类的成员属性和操作。第11页/共22页华北电力大学计算机系三、实验原理1类和派生的使用在公司计薪系统中,主要涉及的是三类雇员,对于所有的雇员,都具有共性普通员工的基本信息,包括个人信息,薪金等。只是计算方法和相应的操作不同,如下图所示。雇员Employee经理Manager时薪人员Wage销售人员Sales图 计薪系统的类继承关系第12页/共22页华北电力大学计算机系class Employeeprivate:char m_name30;public:Employee();Employee(const char*nm);Employee:Employee()m_name0=0;Employee:Employee(const char*nm)strcpy(m_name,nm);第13页/共22页华北电力大学计算机系class Manager:public Employeeprivate:float m_salary;public:Manager(const char*nm);void setSalary();float computePay();Manager:Manager(const char*nm):Employee(nm)m_salary=15000.0;void Manager:setSalary(float salary)m_salary=salary;float Manager:computePay()return m_salary;第14页/共22页华北电力大学计算机系class Wage:public Employeeprivate:float m_wage;float m_hours;public:Wage(const char*nm);void setWage(float wg);void setHours(float hrs);float computePay();Wage:Wage(const char*nm):Employee(nm)m_wage=250.0;m_hours=40.0;void Wage:setWage(float wg)m_wage=wg;void Wage:setHours(float hrs)m_hours=hrs;float Wage:computePay()return m_wage*m_hours;第15页/共22页华北电力大学计算机系class Sales:public Wageprivate:float m_comm;float m_sales;public:Sales(const char*nm);void setCommission(float comm);void setSales(float sale);float computePay();Sales:Sales(const char*nm):Wage(nm)m_comm=m_sale=0.0;void Sales:setCommission(float comm)m_comm=comm;void Sales:setSales(float sale)m_sales=sale;float Sales:computePay()Wage:computePay()+m_comm*m_sales;第16页/共22页华北电力大学计算机系考察Sales类具有的成员char m_name30;float m_wage;float m_hours;float m_comm;float m_sales;void setWage(float wg);void setHours(float hrs);void setCommission(float comm);void setSales(float sale);void computePay();第17页/共22页华北电力大学计算机系2多态的使用我们会想以一个通用指针表示所有可能的职员类型Employee *pEmployee;Wage aWager(“陈大”);Sales aSales(“陈二”);Manager aManager(“陈三”);pEmployee=&aWager;.可以把职员指针指向任何一种职员。好处:程序设计的巨大弹性。譬如:设计一个职员链表职员指针数组,各个元素都是职员,我们会想以一个循环处理所有职员的computePay。第18页/共22页华北电力大学计算机系虚拟函数与一般化可以体会,上述的while循环其实就是把操作一般化。一般化之所以重要,在于它可以把现在的、未来的情况统统纳入考虑。将来即使有另一种名曰“顾问”的成员,上述计薪循环仍然能够正常。我们需要的是什么呢?依旧以Employee指针代表每一种职员,而又能够在实际指向不同种类之职员调用到不同版本之computePay的能力第19页/共22页华北电力大学计算机系修改:利用多态性,将computePay函数提到基类Employee中,并在前面加上virtual使之成为虚拟函数,然后Employee的派生类中根据各个具体的雇员类型重新定义computePay函数。这样,定义一个Employee类型的指针代表每一种雇员,通过动态联编,能够在程序运行时,根据实际指向不同种类之雇员对象调用到不同版本的computePay。第20页/共22页华北电力大学计算机系四、实验所需仪器、设备、材料(试剂)本实验基于window 平台,使用VC+为开发工具。五、实验预习要求、实验条件、方法及步骤 1理解C面向对象编程的基本概念,包括类和对象、派生和继承、多态、虚函数等。2根据实验要求,画出相应的类图。3按照类图,编程并实现。第21页/共22页华北电力大学计算机系感谢您的观看!第22页/共22页