C++课程设计指导.docx
- 文档编号:5878194
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:49
- 大小:90.91KB
C++课程设计指导.docx
《C++课程设计指导.docx》由会员分享,可在线阅读,更多相关《C++课程设计指导.docx(49页珍藏版)》请在冰点文库上搜索。
C++课程设计指导
程序设计基础
课程设计指导书
合肥工业大学
计算机与信息学院
2006年4月
一、概述
课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的、必不可少的一个教学环节。
通常,课程设计中的问题比平时的习题复杂的多,也更接近实际。
课程设计着眼于原理与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。
平时的习题较偏重于如何编写功能单一的“小”算法,局限于一个或两个知识点,而课程设计题是软件设计的综合训练,包括问题分析,总体结构设计,用户界面设计、程序设计基本技能和技巧,多人合作,以至一整套软件工作规范的训练和科学作风的培养。
此外,还有很重要的一点是:
计算机是比任何教师更严厉的检查者。
为达到上述目的,使学生更好地掌握程序设计的基本方法和C++语言的应用,本课程安排了课程设计环节,提供了各类题目供学生选择。
每个设计题采取了统一的格式,由问题描述、基本要求、测试数据、实现提示和选做内容等五个部分组成。
问题描述旨在为学生建立问题提出的背景,指明问题“是什么”。
基本要求则对问题进一步求精,划出问题的边界,指出具体的参量或前提条件,并规定该题的最低限度要求。
测试数据部分旨在为检查学生上机作业提供方便。
在实现提示部分,对实现中的难点及其解法思路等问题作了简要提示,提示的实现方法未必是最好的,学生不应拘泥与此,而应努力设计和开发更好的方法和结构。
选做部分向那些尚有余力的读者提出了更高的要求,同时也能开拓其它读者的思路,在完成基本要求时就力求避免就事论事的不良思想方法,尽可能寻求具有普遍意义的解法,使得程序结构合理,容易修改、扩充和重用。
二、总体要求
1.系统分析与系统设计
“分析就是在采取行动之前,对问题的研究”(Demarco,1978)。
系统分析在软件开发过程中是非常重要的,其任务就是通过对问题本身的研究,产生一个系统需要做什么的规范的、一致的和可行的需求说明。
在此基础上,确定系统中所需考虑的类(对象)、类之间的关系、本系统中各个类所涉及的属性及针对这些属性的操作。
类及类之间的关系可用类图来表示,对象之间的消息传递可用箭头表示,另外一些重要的操作应给出规格说明。
2.详细设计与编码
对类中的属性和操作从实现的角度(如可扩充、在派生类中能否直接使用或只需少量修改、访问的效率和方便性等)进一步考察;对类中的操作(即方法)进一步求精:
用if、while、for和赋值语句加上自然语言写出算法框架;同时考虑能否使用已有类库(包括直接使用或通过派生)以减少编程的工作量和提高程序的可靠性。
编码,即程序设计,是对详细设计的结果的进一步求精,用面向对象语言(如C++)表达出来。
在充分理解和把握语言运行机制的基础上,编写出正确的、清晰的、易读易改和高效率的程序。
另外,在标识符的命名、代码的长度(一个方法长度一般不超过40行,否则应划分为两个或多个方法)、程序书写的风格(如缩进格式、空格(空行)的应用、注释等)方面也应注意,遵循统一的规范。
3.上机调试和测试
上机时要带一本面向对象语言的教材,若有开发环境的用户指南(手册)及类库(库函数)手册则更好。
应仔细阅读程序编译和连接时的错误信息(通常是英文的),弄清其确切含义,提高调试效率。
要学习并掌握开发环境所提供的调试工具。
经过调试,能够运行的的程序并非就是一个正确的程序。
实际上,在上机之前,就应根据系统的需求设计相应的测试数据集,特别是一些异常情况的处理(如用户输入数据未按指定格式、数据极大或极小时程序如何处理等一些极端的情况)。
4.课程设计报告
课程设计报告的内容及要求:
一.需求和规格说明
描述问题,简述题目要解决的问题是什么?
规定软件做什么。
原题条件不足时补全
二.设计
1.设计思想:
程序结构(如类图),重要的数据结构。
主要算法思想(文字描述,不要画框图)
2.设计表示:
类名及其作用,类中数据成员名称及作用,类中成员函数原型及其功能,可以用表格形式表达。
3.实现注释:
各项要求的实现程度、在完成基本要求的基础上还实现了什么功能?
4.详细设计表示:
主要算法的框架及实现此算法的成员函数接口。
三.用户手册
即使用说明(包括数据输入时的格式要求)。
四.调试及测试
调试过程中遇到的主要问题是如何解决的;对设计和编码的回顾讨论和分析;程序运行的时空效率分析;测试数据集;运行实例;改进设想;经验和体会等。
附录
源程序清单:
打印文本和磁盘文件,磁盘文件是必须的。
源程序要加注释,除原有注释外再用钢笔加一些必要的注释和断言。
测试数据:
即列出测试数据集
运行结果:
上面测试数据输入后程序运行的结果
注意事项:
1.以上要求为一般的要求,针对具体问题和具体的开发过程,某些方面可以做适当的增减。
2.各种文档资料要在程序开发过程中逐渐形成,而不是最后补写(但不排斥最后誉清)。
3.各种文档要以统一格式的稿纸用钢笔书写,也可录入计算机用Word及其它文字编辑软件排版后打印输出。
三、课程设计示例
封面:
课程设计报告
设计题目:
小型公司人员信息管理
学生姓名:
专业:
班级:
学号:
指导教师:
完成日期:
合肥工业大学计算机与信息学院
(一)需求和规格说明
某小型公司,主要有四类人员:
经理、技术人员、销售经理和推销员。
要求存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。
人员编号基数为1000,每输入一个人员的信息,编号顺序加1。
程序要对所有人员有提升级别的功能。
为简单起见,所有人员的初始级别均为1级,然后进行升级,经理升为4级,技术人员和销售经理升为3级,推销员仍为1级。
月薪计算办法是:
经理拿固定月薪8000元;技术人员按每小时100元领取月薪;推销员的月薪按该推销员当月销售额的4%提成;销售经理既拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的5‰。
(二)设计
根据上述需求,设计一个基类employee,然后派生出technician(技术人员)类、manager(经理)类和salesman(推销员)类。
由于销售经理(salesmanager)既是经理又是销售人员,兼具两类人员的特点,因此同时继承manager和salesman两个类。
在基类中,除了定义构造函数和析构函数以外,还应统一定义对各类人员信息都应有的操作,这样可以规范各派生类的基本行为。
但是各类人员的月薪计算方法不同,不能在基类employee中统一定义计算方法。
各类人员信息的显示内容也不同,同样不能在基类中统一定义显示方法。
因此,在employee类中用纯虚函数的方式定义了计算月薪函数pay()和显示信息函数displayStatus(),然后在派生类中再根据各自的同名函数实现具体的功能。
由于salesmanager的两个基类又有公共基类employee,为避免二义性,这里将employee类设计为虚基类。
系统类图
属性和方法定义
类名
成员类别
类型
成员名
描述
employee
属性
char*
name
雇员姓名
int
individualEmpNo
个人编号
int
grade
级别
float
accumPay
月薪总额
int
employeeNo
本公司雇员编号目前最大值
方法
void
pay()
计算月薪函数(为纯虚函数)
void
promote(int)
升级函数
void
DisplayStatus()
显示人员信息(为纯虚函数)
类名
成员类别
类型
成员名
描述
technician
属性
float
hourlyRate
每小时酬金
int
workHours
当月工作时数
方法
void
pay()
accumPay=hourlyRate*workHours
void
DisplayStatus()
显示技术人员信息
manager
属性
float
monthlyPay
固定月薪数
方法
void
pay()
AccumPay=monthlyPay
void
DisplayStatus()
显示经理信息
salesman
属性
float
CommRate
按销售额提取酬金百分比
float
sales
当月销售额
方法
void
pay()
accumPay=sales*CommRate
void
DisplayStatus()
显示推销员信息
salesmanager
属性
方法
void
pay()
accumPay=monthlyPay+CommRate*sales
void
DisplayStatus()
显示销售经理信息
(三)用户手册
程序运行时,首先提示输入雇员姓名。
对于经理直接输出其工资及其它信息;
对于技术人员,程序提示输入其本月工作时数,然后输出其工资及其它信息;
对于推销员,程序提示输入其本月销售额,然后输出其工资及其它信息;
对于销售经理,程序提示输入其管辖部门本月销售总额,然后输出其工资及其它信息。
(四)调试及测试
由于公司每增加一个雇员,无论他(她)是哪一类人员,其编号均是顺序加1,也就是employee类的所有派生类对象创建时,都要访问同一个employeeNo,因此将employeeNo定义为静态数据成员。
运行实例:
pleaseinputemployee'sname:
zhang
pleaseinputemployee'sname:
wang
pleaseinputemployee'sname:
Li
pleaseinputemployee'sname:
zhao
inputzhangtheworkHoursofthismonth:
56
Technician:
zhangNo:
1001monthsalary:
5600
Technician:
zhangNo:
1001grade:
3thismonthsalary:
5600
Manager:
wangNo:
1002monthsalary:
8000
Manager:
wangNo:
1002grade:
4thismonthsalary:
8000
inputLithesalesofthismonth:
47900
Salesman:
LiNo:
1003monthsalary:
1916
Salesman:
LiNo:
1003grade:
1thismonthsalary:
1916
inputzhaothetotalsalesofthedepartmentofthismonth:
123654
salesman:
zhaoNo:
1004monthsalary:
5618.27
salesmanager:
zhaoNo:
1004grade:
3thismonthsalary:
5618.27
进一步改进
(1)目前程序中,经理月薪,技术人员的小时酬金和销售人员的销售额提成比例均是固定的,这不适应不同公司的需要,可考虑用带参数的构造函数来解决。
(2)销售经理月薪计算中,要输入其管辖部门当月销售总额。
实际上,这可以通过将本部门所有推销员销售额相加而得到。
可以考虑在推销员类中增加所属部门等属性来完成这方面的功能。
附录源程序
//employee.h
classemployee
{
protected:
char*name;
intindividualEmpNo;
intgrade;
floataccumPay;
staticintemployeeNo;
public:
employee();
~employee();
virtualvoidpay()=0;
voidpromote(int);
virtualvoiddisplayStatus()=0;
};
classtechnician:
publicemployee
{
private:
floathourlyRate;
intworkHours;
public:
technician();
voidpay();
voiddisplayStatus();
};
classmanager:
virtualpublicemployee
{
protected:
floatmonthlyPay;
public:
manager();
voidpay();
voiddisplayStatus();
};
classsalesman:
virtualpublicemployee
{
protected:
floatCommRate;
floatsales;
public:
salesman();
voidpay();
voiddisplayStatus();
};
classsalesmanager:
publicmanager,publicsalesman
{
public:
salesmanager();
voidpay();
voiddisplayStatus();
};
//empfunc.cpp
#include
#include
#include
#include"employee.h"
intemployee:
:
employeeNo=1000;//职工编号基数为1000
employee:
:
employee()
{
charstr[30];
cout<<"pleaseinputemployee'sname:
";
cin>>str;
name=newchar[strlen(str)+1];
strcpy(name,str);
individualEmpNo=++employeeNo;
grade=1;
accumPay=0;
}
employee:
:
~employee()
{
delete[]name;
}
voidemployee:
:
promote(intincre)
{
grade+=incre;
}
technician:
:
technician()
{
hourlyRate=100;
}
voidtechnician:
:
pay()
{
cout<<"input"< "; cin>>workHours; accumPay=hourlyRate*workHours; cout<<"Technician: "< "< <<"monthsalary: "< } voidtechnician: : displayStatus() { cout<<"Technician: "< "< <<"grade: "< "< } salesman: : salesman() { CommRate=0.04; } voidsalesman: : pay() { cout<<"input"< "; cin>>sales; accumPay=sales*CommRate; cout<<"Salesman: "< "< <<"monthsalary: "< } voidsalesman: : displayStatus() { cout<<"Salesman: "< "< <<"grade: "< "< } manager: : manager() { monthlyPay=8000; } voidmanager: : pay() { accumPay=monthlyPay; cout<<"Manager: "< "< <<"monthsalary: "< } voidmanager: : displayStatus() { cout<<"Manager: "< "< <<"grade: "< "< } salesmanager: : salesmanager() { monthlyPay=5000; CommRate=0.005; } voidsalesmanager: : pay() { cout<<"input"< : name <<"thetotalsalesofthedepartmentofthismonth: "; cin>>sales; accumPay=monthlyPay+CommRate*sales; cout<<"salesman: "< "< <<"monthsalary: "< } voidsalesmanager: : displayStatus() { cout<<"salesmanager: "< "< <<"grade: "< "< } //APP.CPP #include #include"employee.h" intmain() { techniciant1; managerm1; salesmans1; salesmanagersm1; t1.promote (2); t1.pay(); t1.displayStatus(); m1.promote(3); m1.pay(); m1.displayStatus(); s1.promote (2); s1.pay(); s1.displayStatus(); sm1.promote(3); sm1.pay(); sm1.displayStatus(); getch(); return0; } 四、设计题 本手册提供的设计题大致可分为为3类: 第一类侧重于算法设计与实现;第二类侧重于文件操作;第三类则属于综合类(侧重于程序结构的设计与实现,当然也包括算法设计与文件操作)。 前两类问题可用C++面向过程的方式来实现,而后一类则需用C++面向对象的方式来实现。 当然,这种划分不是绝对的,我们期望同学尽可能用面向对象的方式来完成这些题目。 (一)算法设计类题目 1.Fibonacci数列。 Fibonacci数列的计算公式如下: fib (1)=1; fib (2)=1; fib(n)=fib(n-1)+fib(n-2); //对大于等于3的任意n (1)简单变量“数据平移”方法计算Fibonacci数列的第n项(正整数n通过键盘输入): 说明变量old1=1,old2=1,newItem;新的Fibonacci项newItem总是“距它最近”的前两项(old1与old2)的累加和。 而后通过“old1=old2;old2=newItem;”进行所谓的“数据平移”。 接着计算另一个新的Fibonacci项newItem,依次循环,直到求出数列的第n项时为止。 (2)使用数组求出Fibonacci数列的第n项(正整数n通过键盘输入)并显示在屏幕上: 说明数组f用来存放Fibonacci数列的各项之值,且仅初始化前两个元素f[0]=1,f[1]=1,而后通过f[i]=f[i-2]+f[i-1];依次计算出f[2]到f[n-1](注意f[n-1]恰为所要求出的第n项)并将该值显示在屏幕上。 2.编程序,循环进行如下的处理过程: 由计算机生成简单的四则运算题;用户给出答案;计算机判断对错。 直到用户回答说不再继续做了时结束程序。 提示: 可让用户选择指定出加、减、乘、除哪一种运算题,以及出一位数还是两位数的运算题;而后通过使用“rand()%10”或“rand()%100”来获得一个0到9的一位整数随机值或得到0到99的两位整数随机值来为用户出题。 还可进一步对用户所做算术题的对错次数进行记录,结束程序时给出一个某种形式的成绩。 3.数的进制转换 (1)将输入的2进制数(一个非“0”即“1”的字符串)化为10进制数。 提示: 用字符数组a盛放所输入的二进制数;而后从后往前逐一计算每一位的“位权”w(2的0次方、2的1次方、...),再计算“位权”乘以“位值”并累加到一个初值为0的变量value上,最后输出该value。 (2)如何把8进制数或16进制数化为10进制数。 (3)如何把某一个k进制的数化为10进制数呢? 4.编程序,输入正整数m,它代表一个人民币钱数(元数)。 求取这样一个方案,使用最少张数的人民币纸币,凑成上述的钱数m,并输出求取结果。 注意,现在共有7种元以上面值的人民币纸币,分别为: 100,50,20,10,5,2,1。 5.在体育、文艺比赛及选举等打分类项目中,为了公平起见,往往n个评委打出分数后,要去掉一个最高分和一个最低分,然后求取平均得分。 当n较大时(本题设为9),则应取掉两个最高分和两个最低分,然后求取平均分。 编程实现该算法。 6.用户任意输入一个年份以及该年的1月1日是星期几,而后再输入该年的任意一个月份,由程序负责在屏幕上按照你所设计的格式显示出这一个月的月历。 思考: 利用元年元月元日(即1年1月1日)是星期一的已知事实,可对程序进行改造,让用户仅输入任意一个年份和一个月份,则程序就应按格式显示出该年那一个月的月历。 7.有n人围坐成一圈(假设他们的编号沿顺时针方向依次为1到n)。 编程序,使用数组
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课程设计 指导