软件课程设计 第一阶段实验报告.docx
《软件课程设计 第一阶段实验报告.docx》由会员分享,可在线阅读,更多相关《软件课程设计 第一阶段实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
![软件课程设计 第一阶段实验报告.docx](https://file1.bdocx.com/fileroot1/2022-12/7/d8699798-9bf0-4a77-acf3-9e986f5fccd4/d8699798-9bf0-4a77-acf3-9e986f5fccd41.gif)
软件课程设计第一阶段实验报告
编号:
()字号
《软件课程设计》报告
中国矿业大学计算机科学与技术学院
年月
软件课程设计任务书
专业年级:
学生姓名:
任务下达日期:
200年月日
课程设计日期:
200年月日至200年月日
课程设计题目:
面向过程
类别
题目序号
成绩
面向过程
5计算星座
6.骑士巡游问题
软件课程设计指导教师评阅书
指导教师评语(①基础理论及基本技能的掌握;②独立解决实际问题的能力;③研究内容的理论依据和技术方法;④取得的主要成果及创新点;⑤工作态度及工作量;⑥总体评价及建议成绩;⑦存在问题等):
成绩:
指导教师签字:
年月日
目录
一、面向过程设计题5-------计算星座问题(第一阶段第五题(提高).cpp)
1.1需求分析……………………………………………………………………….…4
1.2概要设计………………………………………………………………………...4
1.3详细设计与编码………………………………………………………………...4
1.4调试分析………………………………………………………………………...6
1.5用户使用说明………………………………………………………………….7
1.6设计心得………………………………………………………………………...7
二、面向过程设计题6-------骑士巡游问题(第一阶段第六题.cpp)
2.1需求分析…………………………………………………………………………7
2.2概要设计………………………………………………………………………...8
2.3详细设计与编码………………………………………………………………..8
2.4调试分析………………………………………………………………………...12
2.5用户使用说明………………………………………………………………….14
2.6设计心得………………………………………………………………………...14
1.1需求分析
程序达到的功能:
需要输入年月日,从而计算所属的星座。
输入形式:
整型;中间以空格为分隔符
年(1<=year)月(1<=month<=12)日(由月份而定,1、3、5、7、8、10、12月是31天,2月闰年29天,平年28天,其余月均为30天)
程序测试数据:
1995217
输出形式:
字符
1.2概要设计
定义三个整型变量分别为年月日,在主函数中输入数据,然后使用switch~case语句进行判断总天数,最后使用if~else语句判断星座
先使用if~else语句判断是否是闰年,然后再分别判断星座(注意:
闰年的时候所有判断的日期都要+1)
1.3详细设计与编码
#include
usingnamespacestd;
voidmain()
{
cout<<"请输入你的出生年月日"<intyear,month,day,d;
cin>>year>>month>>day;
switch(month)//switch语句判断总天数
{
case1:
d=day;break;
case2:
d=31+day;break;
case3:
d=31+28+day;break;
case4:
d=31+28+31+day;break;
case5:
d=31+28+31+30+day;break;
case6:
d=31+28+31+30+31+day;break;
case7:
d=31+28+31+30+31+30+day;break;
case8:
d=31+28+31+30+31+30+31+day;break;
case9:
d=31+28+31+30+31+30+31+31+day;break;
case10:
d=31+28+31+30+31+30+31+31+30+day;break;
case11:
d=31+28+31+30+31+30+31+31+30+31+day;break;
case12:
d=31+28+31+30+31+30+31+31+30+31+30+day;break;
}
if(((year%400==0)||(year%4==0&&year%100==0)))
{
if(month>2)d++;
d-=19;//从水瓶座开始算
if(d<=0)cout<<"摩羯座"<elseif((d>0)&&(d<31))cout<<"水瓶座"<elseif((d>30)&&(d<62))cout<<"双鱼座"<elseif((d>61)&&(d<92))cout<<"白羊座"<elseif((d>91)&&(d<123))cout<<"金牛座"<elseif((d>122)&&(d<154))cout<<"双子座"<elseif((d>153)&&(d<185))cout<<"巨蟹座"<elseif((d>184)&&(d<215))cout<<"狮子座"<elseif((d>214)&&(d<245))cout<<"处女座"<elseif((d>244)&&(d<276))cout<<"天秤座"<elseif((d>275)&&(d<305))cout<<"天蝎座"<elseif((d>304)&&(d<334))cout<<"射手座"<elsecout<<"摩羯座"<}
else
{
d-=19;//从水瓶座开始算
if(d<=0)cout<<"摩羯座"<elseif((d>0)&&(d<31))cout<<"水瓶座"<elseif((d>30)&&(d<61))cout<<"双鱼座"<elseif((d>60)&&(d<91))cout<<"白羊座"<elseif((d>90)&&(d<122))cout<<"金牛座"<elseif((d>121)&&(d<153))cout<<"双子座"<elseif((d>152)&&(d<184))cout<<"巨蟹座"<elseif((d>183)&&(d<214))cout<<"狮子座"<elseif((d>213)&&(d<244))cout<<"处女座"<elseif((d>243)&&(d<275))cout<<"天秤座"<elseif((d>274)&&(d<304))cout<<"天蝎座"<elseif((d>303)&&(d<333))cout<<"射手座"<elsecout<<"摩羯座"<}
}
主函数流程图:
具体判断语句不再给出流程图,思路是将全年划分为十二个阶段(分别是十二个星座)从水瓶座开始算起,将日期减去19,以水瓶座的开始日期为第一天开始计算,然后依次判断(主要使用if~else语句)
1.4调试分析
输入:
19950217
正确的输出结果:
错误的输出结果有很多,但究其原因一样,并无太大分析意义,在此不一一列举。
错误原因:
计算上的错误,对边界判断不准确,可见,在程序设计方面,还需增加程序设计者的严密性与科学性。
1.5用户使用说明
输入很简单,只需要输入出生年月日(阿拉伯数字)年月日之间以空格、TAB键、回车分隔即可。
1.6设计心得
①本程序主要复习了switch~case语句的运用。
②通过设计锻炼了逻辑上的思考能力与计算能力。
2.1需求分析
该程序需要一个n×n(n>=2)列的棋盘,任意输入一个坐标(在该棋盘内),通过走“马”的方式,遍历棋盘,看是否可以在不重复走的情况下走遍棋盘。
棋盘需要一个二维数组B表示。
并需要其他两个二维数组分别用来记录是否走过以及走的步数。
编写一个递归函数solve用来遍历棋盘(传递bool变量用来判断是否可以成功走完棋盘):
编写两个一维数组用来表示走法,并通过循环的方式走“马”字。
(以八种走法是否走完为循环是否进行的条件)使用if语句判断是否走完
将solve函数返回结果,并使用setw函数输出棋盘。
(输出形式,以标准的表格形式输出,无表格线)
2.2概要设计
先定义一个变量n用来表示棋盘的大小。
定义递归函数solve,solve函数主流程:
使用for循环将每种走法都走完;使用if语句判断是否走过,若没走过,则改变二维数组A,表示该处已走过,并使用数组B记录走的步数;在上一个if语句中使用if语句判断步数是否已走完(若未走完,则再次调用solve函数实现递归,若走完,则输出棋盘)
函数主流程:
输入坐标,调用solve函数,返回ok变量判断是否可以找到答案,若可以找到答案,则solve函数中将输出棋盘,若找不到答案,则输出无法找到答案。
2.3详细设计与编码
流程图
Main函数流程图
Solve函数流程图
#include
#include
usingnamespacestd;
voidsolve(inti,intj,intk,bool&ok);
intB[20][20]={0};//用来输出每个位置是第几步
intA[20][20]={0};//用来记录每个位置是否已经走过
intX[9]={0,-1,-1,1,1,-2,-2,2,2};
intY[9]={0,-2,2,-2,2,-1,1,-1,1};//数组X和数组Y用来表示走法
intn;//矩阵的大小
voidmain()
{
intx1,y1;//定义初始位置
boolok=false;
cout<<"请输入矩阵的大小"<cin>>n;
cout<<"请输入初始位置"<cin>>x1>>y1;
B[x1-1][y1-1]=1;
A[x1-1][y1-1]=1;
solve(x1-1,y1-1,2,ok);
if(!
ok)cout<<"从该点无法遍访整个棋盘!
";
}
voidsolve(inti,intj,intk,bool&ok)
{
intx,y;
for(intp=1;p<9;p++)
{
x=i+X[p];
y=j+Y[p];
if((x>=0)&&(x<=(n-1))&&(y>=0)&&(y<=(n-1))&&(A[x][y]==0))
{
A[x][y]=1;
B[x][y]=k;
if(k{
solve(x,y,k+1,ok);
}
else
{ok=true;
cout<for(inta=0;a{
for(intb=0;b{
cout<}
cout<}
}
A[x][y]=0;
}
}
}
2.4调试分析
输入:
请输入矩阵的大小
5
请输入初始位置
11
正确的输出结果(因答案较多,故只截有含有题目要求的答案的一部分)
======================================================================
错误的输出结果:
遇到的问题:
总是无法输出结果
解决方法:
从头到尾读一遍程序,检查其中的细节部分,经检查后发现对二维数组的了解不透彻,在if语句的执行部分中A[x][y]=0;出错。
错误的输出结果2:
遇到的问题:
无法输出正确的结果
解决方法:
检查solve函数看是否有思路错误。
经检查,在递归实现的部分出错。
即错写为:
solve(x-1,y-1,k+1,ok);
2.5用户使用说明
程序会提示输入矩阵大小,请输入一个正整数。
而后程序会提示输入坐标,请输入一个在你输入的矩阵中的坐标否则程序将会输出无法找到。
2.6设计心得
1.通过此程序锻炼了使用递归函数的能力。
2.加强了逻辑能力上的使用以及提高了对题目的分析、辨析能力。
3.学会使用流程图去表示程序的运行流程
4.巩固了布尔变量的使用,学会使用布尔变量来更好的优化程序