计算机学院软件课程设计报告.docx
《计算机学院软件课程设计报告.docx》由会员分享,可在线阅读,更多相关《计算机学院软件课程设计报告.docx(36页珍藏版)》请在冰豆网上搜索。
![计算机学院软件课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/21/6dabbdc2-f45b-4a88-9e82-53b15ee17f57/6dabbdc2-f45b-4a88-9e82-53b15ee17f571.gif)
计算机学院软件课程设计报告
编号:
()字号
《软件课程设计》报告
班级:
信科10-4班
姓名:
纵兆丹
学号:
08103575
指导老师:
葛欣
中国矿业大学计算机科学与技术学院
2011年10月
软件课程设计任务书
专业年级:
电子信息科学与技术10级
学生姓名:
纵兆丹
任务下达日期:
2011年9月日
课程设计日期:
200年月日至200年月日
课程设计题目:
面向过程
类别
题目序号
成绩
面向过程
2、求n与其反序之和
4----使用最少张数的人民币纸币
6、编写程序求解骑士巡游问题
面向对象
2.自定义一个简单的日期类DateType,它具有数据成员y、m、d,用来表示当前日期的年、月、日。
3、用三种方法通过虚函数求Fibonacci数列
图形界面
创建一个计算器。
数据结构
1用顺序存储结构实现对栈的操作;
3求A矩阵的转置矩阵B
软件课程设计指导教师评阅书
指导教师评语(①基础理论及基本技能的掌握;②独立解决实际问题的能力;③研究内容的理论依据和技术方法;④取得的主要成果及创新点;⑤工作态度及工作量;⑥总体评价及建议成绩;⑦存在问题等):
成绩:
指导教师签字:
年月日
一、面向过程设计题2-----求n与其反序之和
1.1需求分析…………………………………………………………………...….…5
1.2概要设计………………………………………………………………………....5
1.3详细设计与编码………………………………………………………...……...6
1.4调试分析………………………………………………………………………....6
1.5用户使用说明………………………………………………………………….6
1.6设计心得………………………………………………………………………....7
二:
面向过程设计题4----使用最少张数的人民币纸币
2.1需求分析……………………………………………………………………….…7
2.2概要设计………………………………………………………………………...7
2.3详细设计与编码………………………………………………………………...7
2.4调试分析………………………………………………………………………...8
2.5用户使用说明………………………………………………………………….9
2.6设计心得………………………………………………………………………...9
三、面向过程设计题6-----编写程序求解骑士巡游问题
3.1需求分析…………………………………………………………………………9
3.2概要设计………………………………………………………………………....10
3.3详细设计与编码……………………………………………………………….10
3.4调试分析………………………………………………………………………...13
3.5用户使用说明…………………………………………………………………14
3.6设计心得………………………………………………………………………...14
四:
面向对象设计题2——自定义一个简单的日期类可用来实现对天的增加,比较两个日期是否相等,以及对日期的输出等操作。
4.1需求分析…………………………………………………………………………14
4.2概要设计………………………………………………………………………...14
4.3详细设计与代码………………………………………………………………..15
4.4调试分析………………………………………………………………………...17
4.5用户使用说明………………………………………………………………….17
4.6设计心得………………………………………………………………………...17
五:
面向对象设计题3——用三种方法通过虚函数求Fibonacci数列
5.1需求分析…………………………………………………………………………17
5.2概要设计………………………………………………………………………...18
5.3详细设计与代码………………………………………………………………..19
5.4调试分析………………………………………………………………………...21
5.5用户使用说明………………………………………………………………….21
5.6设计心得………………………………………………………………………...21
六:
图形界面1——计算器
6.1需求分析…………………………………………………………………………………...21
6.2概要设计……………………………………………………………………………………21
6.3详细设计与代码…………………………………………………………………………..22
6.4调试分析…………………………………………………………………………………...26
6.5用户使用说明…………………………………………………………………………….26
6.6设计心得…………………………………………………………………………………...26
七:
数据结构1——用顺序存储结构实现对栈的操作
7.1需求分析………………………………………………………………………………26
7.2概要设计……………………………………………………………………………...26
7.3详细设计与代码……………………………………………………………………..27
7.4调试分析……………………………………………………………………………...32
7.5用户使用说明……………………………………………………………………….32
7.6设计心得……………………………………………………………………………...32
八:
数据结构3——求A矩阵的转置矩阵B
8.1需求分析……………………………………………………..………….……32
8.2概要设计……………………………………………………………………...32
8.3详细设计与代码……………………………………………………………...33
8.4调试分析……………………………………………………………………...35
8.5用户使用说明……………………………………………………………….35
8.6设计心得……………………………………………………………………...35
九:
软件课程设计总结……………………………………………………...35
一、面向过程设计题2-----求n与其反序之和
1.1需求分析
编程序,从键盘输入正整数n,求出n与其反序数之和并输出。
例如,输入2038,输出应为2038+8302=10340。
这道题最主要是用什么简单有效的方法求出一个正整数的反序。
用户在程序运行过程中应输入整数,当输入的数大于0时,输出这个数与其反序的和,然后继续输入整数;当输入的数非正时,程序结束运行。
1.2概要设计
求出一个正整数的反序,代码如下:
k=n;
m=0;
while(k){
m=m*10+k%10;
k=k/10;
}
当k为0是停止循环,此时的m就是n的反序。
1.3详细设计与编码
#include
usingnamespacestd;
voidmain()
{
longn,m,k;
cin>>n;
while(n>0){
k=n;
m=0;
while(k){
m=m*10+k%10;
k=k/10;
}
cout<cin>>n;
}
}
1.4调试分析
经调试验证此程序能满足题目设计的要求。
1.5用户使用说明
用户在程序运行过程中应输入整数,当输入的数大于0时,输出这个数与其反序的和,然后继续输入整数;当输入的数非正时,程序结束运行。
1.6设计心得
在设计程序时,首先要明白程序要完成的任务,再分析程序的整体流程,然后找到程序的关键点,也就是最难的地方,比如这道题的关键点在于求反序。
下面才是核心部分程序的编写,写完后,要对程序进行验证分析,看看有没有可以优化、修改的地方。
二:
面向过程设计题4----使用最少张数的人民币纸币
编程序,输入正整数m,它代表一个人民币钱数(元数)。
求取这样一个方案,使用最少张数的人民币纸币,凑成上述的钱数m,并输出求取结果。
注意,现在共有7种元以上面值的人民币纸币,分别为:
100,50,20,10,5,2,1。
2.1需求分析
以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?
明确规定:
·输入的形式和输出、值的范围
从键盘输入正整数money,money为int型变量,m>0;
·输出的形式
输出一种方案:
如100元1张,50元1张,20元1张,5元0张,2元2张,1元0张。
·程序所能达到的功能
这个程序输入一个人民币钱数,得到这样一个方案,使用最少张数的人民币纸币,凑成上述的钱数。
·测试的数据:
包括正确的输入和错误的输入及其相应的输出结果
正确的输入:
如输入125,得到的结果是:
100元1张,,20元1张,5元1张,2元0张,1元0张。
错误的输入:
如输入-2,得到的结果是:
输入错误,您输入的钱数小于零,请重新输入。
2.2概要设计
说明程序中用到的所有抽象数据类型的定义,主程序的流程以及各程序模块之间的层次(调用)关系。
定义了钱数为整型变量,intmoney;
设计了一个得到方案的for循环体;
开始→输入money→进入for循环→得出想要的结果退出
2.3详细设计编码
#include
#include
usingnamespacestd;
intmain()
{
inti,n,money,base[7]={100,50,20,10,5,2,1};
cout<<"请输入钱数"<cin>>money;
cout<<"使用最少张数的人民币纸币的方案为:
"<for(i=0;i<7;i++)
{
n=money/base[i];
if(n!
=0)
cout<money=money%base[i];
if(money==0)
break;
}
return0;
}
2.4调试分析
1.在没有加上setw(3)时输出不是很美观,加上setw(3)后就明显好了。
setw(3)下面打印的数据如果不足三位就补足三位(左留填充字符,由setfill(c)指定)如果数据超过三;位,按数据要求输出。
2.可是在追求美观的时候,我一加上setw(3),就出现了一个错误errorC2065:
'setw':
undeclaredidentifier后来发现用setw(n)一定要包含头文件"iomanip.h"否则出错后来添加了#include就减少了这个错误了。
3.这个程序比较简单,其他没有什么比较大的错误,都是编程过程中的几个符号的错误,还有有时会有字母因为粗心的一些错误,以后一定好仔细。
2.5用户使用说明
用户打开程序后,窗口会自动的显示出提示信息:
请输入钱数(元):
用户可以将需要用来处理的数据输入,然后按enter键,程序经过运算会在下面一行显示出结果。
2.6设计心得
第一阶段的第四题属于比较简单的题目,在做的过程中我感觉到主要是要想到有数组来表示那几种纸币,要复习一维数组的用法,要用到数组在定义数组时要类型标识符数组名[常量表达式]注意数组的引用。
还有就是在设计的过程中要求输出美观用到的setw(n)一定要包含头文件"iomanip.h"对于这个错误收获还是很大的,以后使用setw函数时一定不会漏掉头文件了。
我们需要花很多的时间去学习,才能有所收获,不然我们只会一事无成,我们要有刻苦专研的精神,不能遇到一点困难就不去做,这是我做实验的感悟。
对于我选的几道题目都是比较简单的,我觉得,基础才是学习一种东西最重要的,没有基础是什么都不会做好的,所以,我在所选的题目中,基础题占了很大的比重,有了基础,我就选择了几个提高题,锻炼自己的能力。
这有利于我们的后续课程的学习。
在试验过程中,我们要提前预习,不然我们会走很多的弯路,这是我们可以避免的,其实有些程序中的错误是很低级,不应该出现的,所以这就体现出了预习的重要性。
我们不能轻视预习。
在做题目时,我也有很多题目不会做,但我相信,只要我不放弃就会成功。
三、面向过程设计题6-----编写程序求解骑士巡游问题
3.1需求分析
编写程序求解骑士巡游问题:
在n行n列的棋盘上,假设一位骑士(按象棋中“马走日”的行走法)从初始坐标位置(x1,y1)出发,要遍访(巡游)棋盘中的每一个位置一次。
请编一个程序,为骑士求解巡游“路线图”(或告诉骑士,从某位置出发时,无法遍访整个棋盘—问题无解)。
当n=5且初始坐标位置定为(1,1),如下是一种巡游“路线图”。
程序执行后的输出结果为:
(x1,y1)?
=>(1=>5,1=>5):
11
16151021
14920516
19272211
81324174
251831223
当输入n和初始坐标后,不存在满足条件的路径则输出:
无循环路径。
当输入的n>10或初始坐标不满足条件时输出:
输入有误。
3.2设计概要
(1)“棋盘”可用整形二维数组B表示。
某个位置还没有走用表示,第几步走到就用几表示。
(2)综合分析此题用递归算法设计要简单些。
编制一个具有如下原型的递归函数solve,用于完成任务:
从(i,j)点出发,做第k至第n*n(即n的平方)次的移动—将k直到n的平方这些数码按规则分别摆放到棋盘即数组B中,若成功则将全局bool型变量flag赋值true。
voidsolve(intk,intx,inty,);
(3)编制主函数,让用户输入作为巡游起点的初始坐标位置(x1,y1),而后进行调用“solve(1,x,y);”来完成所求任务。
主函数流程图:
3.3详细设计与编码
#include
#include
constintmax=10;
boolflag=false;
inta[max][max]={0};
intn;
voidsolve(intk,intx,inty)
{
inti,j;
if(!
(x>=0&&x=0&&yreturn;
a[x][y]=k;
if(k==n*n){
flag=true;
for(i=0;i{for(j=0;jcout<cout<}
}
solve(k+1,x+2,y+1);
solve(k+1,x+1,y+2);
solve(k+1,x+1,y-2);
solve(k+1,x+2,y-1);
solve(k+1,x-1,y+2);
solve(k+1,x-2,y+1);
solve(k+1,x-1,y-2);
solve(k+1,x-2,y-1);
a[x][y]=0;
}
voidmain()
{
intx,y,k=1;
cin>>n>>x>>y;
if(n<=0||n>=max||x<=0||x>n||y<=0||y>n){
cout<<"输入有误!
\n";
return;
}
cout<<"(x1,y1)?
=>(1=>"<"<"<solve(k,x-1,y-1);
if(!
flag)
cout<<"无循环路径!
\n";
}
3.4调试分析
情况一:
情况二:
情况三:
经调试,发现程序都能准确执行输出正确结果,但有一个问题,当n过大,n=8、9、10的时候,程序需执行相当长的时间后,才能输出结果。
如果用栈的思想将递归改为非递归,也许会提高效率、
另外对程序调整一点后,可以计算出每种条件下,循环路径的个数。
例如:
3.5用户使用说明
用户在使用本程序时首先要输入棋盘的维数和骑士的初始位置,按下enter键,程序变会根据输入执行输出结果,在棋盘维数过大时,可能要稍等片刻。
要注意,此程序输出的结果只是巡回路径的一种,要想得到所有路径,需要对程序稍加改动。
3.6设计体会
编写此程序后,我对递归思想有了更深刻的理解,递归算法设计的时候比较简单,符合人的思维过程,但在执行中需要更大的时间与空间。
四:
面向对象设计题2——自定义一个简单的日期类可用来实现对天的增加,比较两个日期是否相等,以及对日期的输出等操作。
4.1.需求分析:
本题目要求编写类成员函数,来实现日期的增加、日期的比较、日期的输入、日期的输出。
根据实验要求,输入两个不同的日期加一天后和系统预设时间相对比,输出是否为同一天。
具体数据见下图的运行结果。
4.2.设计概要
(1)完成类的各成员函数的编码;
(2)编写主函数,首先由用户输入一组日期;
(3)然后主函数调用默认的构造函数,再进行一系列的调用类的成员函数;
4.3.详细设计和编码:
(1)流程图
主函数
调用一系列的构造函数
输入两组数据元素
调用一系列的输出函数
调用日期比较函数比较两数据和系统预设数据是否一致
(2)源代码:
#include
usingnamespacestd;
classDateType{
private:
inty,m,d;
public:
DateType(intyo=1,intm0=1,intd0=1);//定义一个天类,包含一些基本的函数
voidincrementDay();
boolequal(DateTypedt2);
voidprintDate();
voidset_DateType();
};
DateType:
:
DateType(inty0,intm0,intd0):
y(y0),m(m0),d(d0){}
voidDateType:
:
set_DateType()
{cin>>y>>m>>d;}
voidDateType:
:
incrementDay()//对输入的日期加一天
{
if(d==28&&m==2)
{
if((y%4==0&&y%100!
=0)||y%400==0)d++;
else{d=0;m=3;}
}
if(d==29&&m==2)
{
if((y%4==0&&y%100!
=0)||y%400==0){d=1;m=3;}
}
if(d==30)
{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)d++;
else{d=1;m++;}
}
if(d==31)
{
if(m==12){d=1;m=1;y++;}
else{d=1;m++;}
}
elsed++;
}
boolDateType:
:
equal(DateTypedt2)//判断该日期是否和系统预设的日期相同,并返回一定值
{
if(y==dt2.y&&m==dt2.m&&d==dt2.d)returntrue;
elsereturnfalse;
}
voidDateType:
:
printDate()
{
cout<<"此时该天的日期是:
"<}
intmain()
{
DateTypedt1(2011,1,1),dt2,dt3;
cout<<"系统预设:
";
dt1.printDate();
cout<<"输入两个不同的日期:
"<dt2.set_DateType();
dt3.set_DateType();
cout<<"系统输入为:
";dt2.printDate();
cout<<"系统输入为:
";dt3.printDate();
dt2.incrementDay();//调用加一天的函数
dt3.incrementDay();
cout<<"输入日期加后:
"<dt2.printDate();
dt3.printDate();
if(dt2.equal(dt1))
cout<<"系统输入与系统预设日期相同。
"<else
cout<<"系统输入与系统预设日期不相同。
"<if(dt3.equal(dt1))
cout<<"系统输入与系统预设日期相同。
"<else
cout<<"系统输入与系统预设日期不相同。
"<return0;
}
运行结果:
4.4.调试分析
编写此程序时类的数据元素以及成员函数已给出,编写程序较为简单主要就是编写函数体以及主函数。
编写过程中也遇到了一些困难,在incrementDay()函数中瑞年的判断就出现了问题,把可被400整除的年份给漏了,还有在月末、年末时增加时需要注意到月份及年份的增加这里用了if语句判断,解决了此问题。
总的来说此题较为容易,但对基本算法要熟悉,以免发生非语法错误,这种错误一般较难发现,编程时要特别小心谨慎!
4.5.用户使用说明:
Step1:
输入两个日期,回车
Step2:
得到两日期的后一天是否与预设日期相同
4.6.测试分析:
通过运行结果所显示的结果可看出所运算的结果与现实中的一致,故本程序通过。
4.7.实验体会
通过此题的编写加深了对类的了解以及对类成员函数的调用,对瑞年的判断的算法也更为熟悉。
五:
面向对象设计题3——用三种方法通过虚函数求Fibonacci数列
5.1需求分析
利用虚函数手段,使用简单变量“数据平移”法、数组的实现法以及递归函数方法来分别求出Fibonacci数列的第n项并输出。
5.2概要设计
在程序中创建基类baseCla及其派生类fib1Cla、fib2Cla和fib3Cla。
基类中声明一个纯虚函数“virtualdoublefib(intn)=0;”