《面向对象程序设计》课程设计教学大纲设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《⾯向对象程序设计》课程设计教学⼤纲设计
《⾯向对象程序设计》课程设计教学⼤纲
适⽤专业:计算机科学与技术
课程周数:2周
⼀、⼤纲说明
本⼤纲根据计算机科学与技术专业⼈才培养⽅案制订。
(⼀)课程设计性质
课程设计是学⽣对课程所学知识的综合运⽤,它与课堂听讲、上机实验、课外练习、⾃学研究相辅相成,构成⼀个完整的课程教学体系。
(⼆)主要先修课程和后续课程
1.先修课程:《C语⾔程序设计》
2.后续课程:《Java程序设计》、《软件⼯程》
⼆、课程设计⽬的及基本要求
本课程全⾯系统的学习⾯向对象程序设计的基本概念,基本语法和编程⽅法。
正确理解掌握C++⾯向对象程序设计的基本特性:类,对象,继承与派⽣,多态,虚函数,模板,流类库等。
遵循软件过程的各个环节进⾏系统分析、设计、实现、集成、测试,并相应给出软件规格说明书等制品,了解当前常⽤的软件开发⼯具(Visual C++),要求熟练掌握基于Win32 Console Application的程序设计,培养解决实际问题的能⼒。
三、课程设计容及安排
1、有理数运算
问题描述:有理数是⼀个可以化为⼀个分数的数,例如2/3,533/920,-12/49都是有理数,⽽就为⽆理数。
在C++中,并没有预先定义有理数,需要时可以定义⼀个有理数类,将有理数的分⼦和分母分别存放在两个整型变量中。
对有理数的各种操作都可以⽤重载运算符来实现。
基本要求:定义并实现⼀个有理数类,通过重载运算符+、-、*、/对有理数进⾏算术运算,通过重载运算符==实现判定两个有理数是否相等。
写⼀个优化函数,它的作⽤是使有理数约去公分母,也即是使保存的有理数分⼦和分母之间没有公约数(除去1以外)。
此外,还要定义⼀个将有理数转换为实数的函数,再加上构造函数和有理数输出函数。
测试数据:在应⽤程序中,创建若⼲有理数对象,通过带参数的构造函数使得各有理数对象值各不相同,然后分别进⾏各类运算,输出运算结果,检验其正确性。
实现提⽰:
设有两个有理数a/b和c/d,则有:
(1)有理数相加分⼦=a*d+b*c;分母=b*d
(2)有理数相减分⼦=a*d-b*c;分母=b*d
(3)有理数相乘分⼦=a*c;分母=b*d
(4)有理数相除分⼦=a*d;分母=b*c
优化函数在创建有理数对象时应执⾏,在执⾏其它各种运算之后也需执⾏它,这样可保证所存储的有理数随时都是最优的。
对于判断两个有理数是否相等,由于在对有理数进⾏各种运算后都对其进⾏优化,所以判定两个有理数是否相等只需判定它们两个的分⼦和分母分别相等即可。
选做容:重载插⼊(<<)和提取(>>)运算符,使得对有理数可以直接输⼊输出。
设有理数输⼊格式为:
整数1 整数2 //整数1为分⼦,整数2为分母
有理数输出格式为:
分⼦/分母
2、通讯录管理
问题描述:编写⼀个简单的通讯录管理程序。
通讯录记录有,地址(省、市(县)、街道),,邮政编码等四项。
基本要求:程序应提供的基本基本管理功能有:
1)添加:即增加⼀个⼈的记录到通信录中
2)显⽰:即在屏幕上显⽰所有通信录中的⼈员信息,应能分屏显⽰。
3)存储:即将通讯录信息保存在⼀个⽂件中。
4)装⼊:即将⽂件中的信息读⼊程序。
5)查询:可根据查找某⼈的相关信息,若找到显⽰其、地址、和邮政编码。
6)修改:可修改⼀个⼈的除外其它信息。
测试数据:程序应输⼊不少于10个⼈员的通讯录信息,应考虑到⼈员可以同名的情况。
实现提⽰:程序可⽤⼀个单向链表来管理⼈员信息,每个⼈员的,地址,和邮政编码⽤⼀个类Cperson来实现,作为链表的值指针指向这些Cperson类对象,通过链表的遍历可以操作这些数据。
选做容:为了加快数据定位查找的速度,采⽤常⽤优先的⽅法对链表的各个节点进⾏排序,即⼀旦操作了⼀个⼈员的数据,他的数据就将被调⽤到链表的链⾸。
这样经过有限次操作,经常查阅的⼈员的信息就将排在链表的前端。
虽然不能说链⾸的节点⼀定是最常⽤的,但常⽤的节点⼀定会排在较靠前的部分,链表查找时所要⾛的平均距离⼀定较短。
3、商品销售统计
问题描述:编写商品销售统计程序,商品的信息有:商品的名称,计量单位(重量或件),单价。
所有商品的信息事先已存⼊计算机,屏幕上显⽰所有商品的名称,选择商品名,输⼊商品计量单位(如重量,件数等),根据单价算出总价。
客户⼀次购物可能购买多种商品,程序应计算出客户应付的钱款数。
基本要求:程序分为两个部分:第⼀部分⽤于输⼊商品的信息并允许修改和删除;第⼆部分实现销售统计。
程序运⾏时由⽤户选择进⼊哪⼀部分功能,并能在运⾏时在两部分之间切换。
第⼆部分运⾏时,⾸先显⽰所有商品名称及代码(商品数⽬较多时,应考虑分屏显⽰),⽤户输⼊商品代码及商品重量或件数,⽤户⼀次操作可输⼊若⼲商品的购买信息,然后输⼊⼀个特殊的代码(如-1)表⽰本次购物结束。
此时。
程序计算出应付钱款数并显⽰。
测试数据:程序应输⼊不少于10种商品的信息,并进⾏模拟运⾏。
实现提⽰:本程序的商品信息管理可采⽤与课程设计题⽬⼆类似的数据结构,既定义⼀个商品类,每种商品作为商品类的实例(对象)存储在链表节点中。
选做容:程序在营业结束时统计每种商品的销售量,销售⾦额及总营业额。
因此第⼆部分应有营业结束的选择,当⽤户选择此项时屏幕上显⽰当天营业的每种商品的销售量,销售⾦额及总营业额。
注意,商品类的数据成员应增加有商品的销售量和销售⾦额。
总营业额是所有商品的营业额之和,可⽤静态数据成员实现。
或可由原商品类派⽣出⼀个特殊的类,增加上⾯的数据成员及相应的成员函数。
4、研究⽣初试录取
问题描述:研究⽣考试课程为4门,其中数学、外语、政治为统⼀命题,⽽专业基础课则根据不同的专业由招⽣学校⾃⾏命题。
国家对初试录取分数有总分要求(如某⼀年要求4门课总分应达到310分),另外还有对每门课的最低分数要求(如总分为100的试卷最低应达到40分,总分为150的试卷最低应达到65分)。
编程统计初试合格的⼈数,并按总分由⾼到低的顺序输出合格考⽣的信息。
基本要求:程序运⾏时⾸先要求输⼊:考⽣,号,报考专业,是否应届⽣,4门课程(政治、数学、外语、专业基础课)成绩。
这些原始数据应保存到⼀个⽂件中。
然后输⼊:录取的总分要求,各课程的最低分数要求。
输出要求:过线考⽣的,号,报考专业,是否应届⽣,4门课程(政治、数学、外语、专业基础课)成绩及总分,这些信息应存放到另⼀个⽂件中。
测试数据:程序应输⼊不少于10名考⽣的信息,其中应届⽣和历届⽣分别有若⼲名,并且都有合格和不合格的情况。
实现提⽰:可定义⼀个考⽣类存放有关信息和实现相应的操作。
分数线数据(总分要求和各门课程的要求)可定义另外的类来存放,但应能被考⽣类及其派⽣类直接访问。
选做容:初试合格的考⽣应经过复试才能决定是否录取,复试成绩合格(⼤于⼀给定分值)可以录取,否则被淘汰。
⽽录取的顺序假设是按照专业基础课和复试成绩的平均值来确定的(因为这涉及到是计划还是委培问题)。
因此,应⾸先输⼊初试合格考⽣的复试成绩及复试的合格线分数,然后按上⾯要求排序输出并标明被淘汰的学⽣。
5、⾜球联赛积分
问题描述:⾜球联赛采⽤主客场双循环赛制,胜⼀场得3分,平局各得1分,负⼀场得0分,联赛排名以积分多者在前,当两队(或多队)积分相同时,则净胜球(即进球数与失球数之差)多者在前,若净胜球相同,则进球数多者在前,若仍相同,则抽签或踢附加赛决定名次(这在联赛结束后进⾏,联赛未结束则两队名次并列,本程序不做这⽅⾯要求)。
试编⼀程序统计最近⼀轮⽐赛后,各队积分及排名。
基本要求:设积分表结构如下:队名(不超过15个字符),已⽐赛的场数,赢的场数,平的场数,负的场数,进球数,失球数,积分。
积分表放在正⽂⽂件中。
最近⼀轮的结果从键盘输⼊,其形式为:主队名(可⽤代码),客队名(可⽤代码),主队得分(即进球数),客队得分(即进球数)。
程序应根据此轮结果修改各队的积分和名次,所得的最新记分表仍在原积分⽂件中并同时在屏幕上显⽰。
测试数据:可选择我国当年的甲A或甲B联赛的数据输⼊,并检查与报章公布的数据是否⼀致。
实现提⽰:定义⼀个球队类,每个球队是均是此类的对象。
由于联赛中参赛的队伍数是固定的,因此可⽤对象数组来实现(当然也可以⽤链表结构)。
每输⼊两个队的⽐赛成绩,则相应的队的有关数据(⽐赛场数,赢的场数,平的场数,负的场数,进球数,失球数,积分等)即可进⾏修改,⽐赛成绩录⼊完成,调⽤联赛排序⽅法(对象数组作为参数)排出名次并输出。
选做容:篮球联赛(如NBA)往往采⽤胜率来决定名次,胜率就是取胜的场数⽐赛场数之⽐。
若胜率相同,再由净胜球及进球数来决定名次,通过继承性完成上述要求。
6、银⾏账户管理程序
问题描述:设计⼀个银⾏账户管理程序,账户的信息有账号(唯⼀)、、余额、、单位、、地址等,允许⽤户进⾏如下操作:开户、销户、存款、取款、转账、查询,⼀个⽤户可以有多个户头,账户的数值没有上限。
基本要求:程序运⾏时,可以由⽤户选择进⾏何种操作,开户操作要求输⼊⽤户信息后⾃动获取账号,⽤户销户后账号被回收,并且该账号可以继续分配给其它账户,不
允许⽤户透⽀,根据或账号可以进⾏⽤户的信息查询,所有的账户信息应存放到⼀个⽂件中,可以随时的访问和更新。
测试数据:程序应输⼊不少于10⼈的账户信息,应考虑到⼈员同名的情况。
实现提⽰:可定义⼀个账户类存放账户信息以及执⾏相应的操作,可以⽤⼀个链表类来管理账户。
选作容:在上述程序的基础上,添加联名账户(⼀个联名账户有两个拥有者)的管理。
7、模拟计算器程序
问题描述:设计⼀个程序来模拟⼀个简单的⼿持计算器。
程序⽀持算术运算+、-、*、/、=、以及C(清除)、A(全清除)操作。
基本要求:程序运⾏时,显⽰⼀个窗⼝,等待⽤户输⼊,⽤户可以从键盘输⼊要计算的表达式,输⼊的表达式显⽰在窗⼝中,⽤户键⼊’=’符号后,窗⼝显⽰出结果。
测试数据:程序输⼊不少于5种不同的表达式进⾏测试。
实现提⽰:可定义⼀个计算器类,该类包括两个组件对象,⼀个计算引擎和⼀个⽤户接⼝,⽤户接⼝对象处理接受的键盘输⼊信息,并显⽰答案,计算引擎对象对给出的数据执⾏相应操作,并存储操作的结果。
选作容:如果⽤户输⼊的表达式不合法,可以判别出来并给出相应的错误提⽰。
8、设计⼀个排课程序
问题描述:每位教师都有教学⼯作量,教师对他所希望讲授的课程表达为⼀个期望值,1,2…,n,其中1位最⾼的期望值。
课程也有优先级,1,2…,n,⽤来决定将课程分给教师的顺序,其中1时最⾼的优先级。
设计⼀个程序针对某些课程给某些教师进⾏排课。
基本要求:程序运⾏时,⽤户输⼊教师信息(、教师号、⼯作量)、课程信息(课程名、课程号、周学时、总学时、优先级)、教师对所希望讲授课程的期望值以及教学⼯作量等相关信息,所有信息应保存在⽂件中,程序根据课程的优先级以及教师对课程的期望值进⾏排课。
为了公平起见,程序随机分配课程,如果10门课程都有优先级1,程序以随机的顺序将这些课程分给教师,如果10位教师对某门课程的期望值为1,程序应从10位教师中随机选择⼀个。
最后输出排课情况,即某位⽼师上某门课程,以及某位⽼师的⼯作量。
测试数据:程序应能实现对不少于20门课和10个教师的排课,并且使每个教师的满意度达到最⼤,不存在⼯作量不满的教师以及未分配的课等情况。
实现提⽰:可定义⼀个教师类存放教师信息,所有教师的信息可以⽤链表存储;定义⼀个课程类存放课程信息,所有课程的信息可以⽤链表存储;定义⼀个排课类进⾏排课,排课类可以访问课程和教师信息。
选作容:对两个同类班级安排⼀学期(20周)的课程,程序应能处理某些限制,如⼀个⽼师不能同时给两个班上课。
9、设计⼀个Database类
问题描述:设计⼀个Database类。
Database类是⼀个表的集合,⽽表⼜由⾏和列组成。
例如,下⾯的雇员信息表包含三个记录,每个记录有四个字段(Employee、Name、
基本要求:能够完成对数据库的基本操作;包括创建数据库,实现对数据库⾥⾯的表的添加,删除;以及能够完成对表结构的修改(如添加或删除字段),以及对表中的记录进⾏添加和删除;能够完成对使⽤适当的查询语⾔从⼀个或多个表中查找相关信息。
测试数据:可以选取⾼校⼈员(教师、学⽣、职⼯等)数据库作为测试数据
实现提⽰:Database 类的公有接⼝包含如下数据成员:
创建⼀个表。
通过增加或删除字段修改表结构。
删除⼀个表。
在表中增加⼀个记录。
从表中删除记录。
⽤适当的查询语⾔从⼀个或多个表中查找信息。
选做容:⾼校⼈员信息通常保存在⽂件⾥⾯,可以从⽂件⾥⾯读取⼈员信息;然后完成上⾯操作。
10、电煤⽓管理系统
问题描述:设计⼀个⽔电管理信息系统,能够对⾼校的⽔电费⽤进⾏管理,包括了登记费⽤,查询费⽤,以及住户信息管理等。
在设计时要考虑到学⽣和教⼯在⽤⽔电时的不同,学⽣可以免费使⽤⼀定额度的⽔电,超过这个额度的随便以后必须⾃费使⽤,且⾃费部分⽔电费的价格标准要⾼于教⼯的收费标准(主要是节约资源)。
基本要求:
实现对⽤户信息的录⼊
实现⽔电煤⽓数据的录⼊
计算并查询⽤户应缴费⽤
查询未缴纳费⽤
测试数据:可选⽤⼩区物业管理部门的数据,也可采⽤⼿⼯输⼊不少于10个⽤户信息的数据。
实现提⽰:⽤户基本信息类,教⼯⽤户信息类,学⽣⽤户信息类,收费标准类,该类存储⽔电煤⽓标准单位的收费标准,如:煤⽓,1.0元/⽴⽅⽶;
不同类型⼈员⽔、电、煤⽓信息类,这些类可以包括⽔表,电表,煤⽓表ID,抄表时间,上次抄表时间,本次抄表时间,上次抄表度数,本次抄表度数,本次使⽤度数,费⽤,是否缴费标记等信息。
在实现的时候考虑继承和多态技术的合理使⽤。
选做容:实现⽤户查询系统能够找出该⽤户半年之的交费记录和本次应交费的数据。
11.对参赛结果分数进⾏处理:参赛选⼿n⼈(n>1),评委m⼈(m>2),评委给每⼀选⼿打⼀个分数score(分数score为⼩于等于10的⼀个正实数)。
选⼿的最后得分lastScore计算⽅法为
(1)m<9时,去掉⼀个最⾼分和⼀个最低分后另m-2个得分的平均值。
(2)m≥9时,去掉两个最⾼分和两个最低分后另m-4个得分的平均值。
假设事先已经建⽴了text型的数据⽂件f1.txt,其中依次记录着n个选⼿的编号(⼀个正整数)、(⼀个字符串)以及m个评委给出的得分。
请编制程序,依次从数据⽂件f1.txt中读⼊n个选⼿的有关信息,⽽后按上述规定⽅法计算出每⼀个选⼿的最后得分,⽽且往屏幕上以及另⼀个text型⽂件f2.txt中同时输出如下形式的结果信息。
假设参赛选⼿⼈数n=5,评委⼈数m=7,磁盘⽂件f1.txt中的初始数据为:
1 zhangjin 8.8 9.3 7.9 8.7 8.9 9.7 9.2
2 lintao 8.9 8.2 8.6 8.8 8.5 9.1 9.3
3 guojian 8.9 8.
4 8.7 8.6 8.6 8.4 8.6
4 maling 7.9 8.3 8.
5 8.
6 8.5 8.9 8.3
5 liuyifan 9.5 9.1 9.8 9.2 9.0 9.5 8.9
那么,程序执⾏后,屏幕显⽰结果以及磁盘⽂件f2.txt中的结果均应该为:
参赛号姓名最⾼分最低分累积分最后得分
1 zhangjin 9.7 7.9 44.9 8.98
2 lintao 9.
3 8.2 43.9 8.78
3 guojian 8.9 8.
4 42.9 8.58
4 maling 8.9 7.9 42.2 8.44
5 liuyifan 9.8 8.9 46.3 9.26
思考:可进⼀步考虑找出⽐赛的第1⾄第k名,也在屏幕以及f2.txt中同时输出相关的结果信息(k⼩于等于n,并规定若多个选⼿最后得分相同时,则有效分(即已删除原来的最⾼分后)中最⾼分⾼者名次优先)。
12、设计⼀个类CStudent,类中包含⼀个学⽣的基本数据如下:
编号,,性别,年龄,数学成绩,计算机成绩,外语成绩。
并假设编号为整数,且从1号往后连续编码;为字符串,性别为字符。
如:
1 LiPing m 18 89 98 94
请采⽤binary⽂件形式,并使⽤随机读写处理⽅式,对⾃定义CStudent类的对象数据进⾏存储与读写处理(即是说,总按具有连续编码的编号num为“序”来对⽂件中的各对象数据进⾏随机读写处理)。
并设计该类的成员函数,⽽且对输出运算符“<<”进⾏重载,使该运算符能够完成将⼀个学⽣的信息输出到屏幕上。
要求成员函数完成以下功能:
(1)从键盘输⼊⼀个学⽣的有关信息,并将它们存⼊到数据⽂件中(按编号来确定写出位置)。
(2)按编号对学⽣信息进⾏检索并将检索结果显⽰在屏幕上。
(3)按对学⽣信息进⾏检索并将检索结果显⽰在屏幕上。
(4)计算某编号学⽣的总成绩与平均成绩。
(5)列出所有总成绩超过n分的性别为s同学的有关信息(n,s由⽤户从键盘输⼊)。
思考:可进⼀步对上述程序进⾏扩充,如,添加学⽣基本数据(籍贯,专业,班级,其他各门成绩,奖惩记录等),并添加所需要的其他相关处理函数(如可通过咨询教学办公室管理⼈员后确⽴),进⽽将其编制成为⼀个简单⽽实⽤的⼩型学籍与成绩
管理软件。
13、⽇期时间显⽰
(1)定义⼀个时间类Time,能提供时、分、秒组成的时间,并提供时间增加的⽅法(按秒)。
(2)定义⼀个⽇期类Date,记录年、⽉、⽇,并提供⽇期增加的⽅法(按天)。
(3)由类Time和⽇期类Date,派⽣出DateTime类,除具有年、⽉、⽇、时、分、秒外,还增加国名和与格林威治时间的差。
编⼀应⽤程序,输⼊年、⽉、⽇、时、分、秒,在屏幕上模拟显⽰⼀电⼦计时器,不断输出下⼀秒的时间和⽇期,以及格林威治的⽇期和时间。
注意,当对⽇期增加1天后,会涉及所谓的“进位”问题:⾸先算出本“⽇”所在的⽉份具有的天数N,若加1之后的“⽇”数值超过所在的⽉份具有的天数N时,“进。