计算机学院软件课程设计报告.docx

上传人:b****5 文档编号:7163192 上传时间:2023-01-21 格式:DOCX 页数:36 大小:430.48KB
下载 相关 举报
计算机学院软件课程设计报告.docx_第1页
第1页 / 共36页
计算机学院软件课程设计报告.docx_第2页
第2页 / 共36页
计算机学院软件课程设计报告.docx_第3页
第3页 / 共36页
计算机学院软件课程设计报告.docx_第4页
第4页 / 共36页
计算机学院软件课程设计报告.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

计算机学院软件课程设计报告.docx

《计算机学院软件课程设计报告.docx》由会员分享,可在线阅读,更多相关《计算机学院软件课程设计报告.docx(36页珍藏版)》请在冰豆网上搜索。

计算机学院软件课程设计报告.docx

计算机学院软件课程设计报告

编号:

()字号

《软件课程设计》报告

 

班级:

信科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&&y

return;

a[x][y]=k;

if(k==n*n){

flag=true;

for(i=0;i

{for(j=0;j

cout<

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;”

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1