计算机八皇后计算机实验报告.docx
《计算机八皇后计算机实验报告.docx》由会员分享,可在线阅读,更多相关《计算机八皇后计算机实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
计算机八皇后计算机实验报告
编号:
()字号
《软件课程设计》报告
软件课程设计任务书
专业年级:
学生姓名:
任务下达日期:
200年月日
课程设计日期:
200年月日至200年月日
课程设计题目:
面向过程
类别
题目序号
成绩
面向过程
5.判断日期与星期
8:
加减乘除(3、4、6、7。
。
。
)
面向对象
3.用三种方法通过虚函数求Fibonacci数列
7.关于磁盘文档的输入输出(1、2、4、5、6。
。
。
)
图形界面
1.通过MFCAPPWIZARD创建一个计算器(2。
。
。
)
数据结构
2.假设有一个循环链表的长度大于1,且表中既无头结点也无头指针。
已知p为指向链表中某结点的指针,试编写算法在链表中删除结点p的前趋结点。
4 .设计一个统计选票的算法,输出每个候选的得票结果(假设采用单链表存放选票,候选人编号依次为1,2,3,……,N,且每张选票选且只选一人)
(1、3。
。
。
).
软件课程设计指导教师评阅书
指导教师评语(①基础理论及基本技能的掌握;②独立解决实际问题的能力;③研究内容的理论依据和技术方法;④取得的主要成果及创新点;⑤工作态度及工作量;⑥总体评价及建议成绩;⑦存在问题等):
成绩:
指导教师签字:
年月日
目录
面向对象设计题4------4:
计算器(test8.cpp)
1.1需求分析……………………………………………………………………….…6
1.2概要设计………………………………………………………………………...6
1.3详细设计与编码………………………………………………………………..6
1.4调试分析………………………………………………………………………...10
1.5用户使用说明………………………………………………………………….11
1.6设计心得………………………………………………………………………...11
二、面向过程设计题10------8:
八皇后问题(test10.cpp)
2.1需求分析…………………………………………………………………………12
2.2概要设计………………………………………………………………………...12
2.3详细设计与编码………………………………………………………………...12
2.4调试分析………………………………………………………………………...14
2.5用户使用说明………………………………………………………………….15
2.6设计心得………………………………………………………………………...15
面向过程设计题8------8:
加减乘除
一、需求分析
随着社会的发展,科学的进步,人们面临着越来越多的数据,而处理这些数据时,最基本的操作便是对这些数据进行计算。
但是在巨大的计算量面前,人往往显得有些力不从心,于是人们对计算器需求也愈加强烈。
本程序便应此要求编写了一个简易的计算器程序
二、概要设计
本程序的一个主要设计思路便是根据用户输入的表达式,然后求解输出。
本程序所选择的数据结构主要为栈,一个操作数栈,一个运算符栈,之后便根据相应的算术优先级对两个栈进行相应的操作。
同时本程序还可以对表达式的正误进行判断,如果出错就提醒用户。
三、详细设计与编码
/*4.设计一个简单的计算器类(类型),要求:
(1)从键盘读入算式。
(2)可以进行加、减、乘、除运算。
(3)运算要有优先级。
(4)用户可以按任何的运算符出现顺序进行输入。
(5)不限定用户输入的计算式的长度。
(6)可以带有括号()。
(7)有排错功能,当用户输入错误的算式时提示用户。
*/
#include
#include
usingnamespacestd;
constmaxsize=20;
enumError_code//设立一个枚举类型用以返回错误类型
{
success,
overflow,
underflow
};
template//用类模板设立一个栈类
classStack
{
public:
Stack();
boolempty()const;
boolfull()const;
intsize()const;
voidclear();
Error_codetop(T&item)const;
Error_codepop();
Error_codepush(constT&item);
private:
intcount;
Tentry[maxsize];
};
template
Stack:
:
Stack()
{count=0;
}
template//判空
boolStack:
:
empty()const
{returncount==0;
}
template//判满
boolStack:
:
full()const
{returncount==maxsize;
}
template
intStack:
:
size()const
{returncount;
}
template//实现栈的清空
voidStack:
:
clear()
{count=0;
}
template
Error_codeStack:
:
top(T&item)const
{if(empty())returnunderflow;
item=entry[count-1];
returnsuccess;
}
template
Error_codeStack:
:
pop()//弹出操作
{
if(empty())returnunderflow;
count--;
returnsuccess;
}
template
Error_codeStack:
:
push(constT&item)
{
if(full())returnoverflow;
entry[count++]=item;
returnsuccess;
}
booluser_says_qingchu()
{
intd;
boolinitial_response=true;
do{
if(initial_response)
cout<<"(c,A)?
"<else
cout<<"RespondwitheithercorA:
"<do{
d=cin.get();
}while(d=='\n'||d==''||d=='\t');
initial_response=false;
}while(d!
='c'&&d!
='C'&&d!
='A'&&d!
='a');
return(d=='c'||d=='C');
}
Stacksign;
Stacknum;
intset;
voidprocess(charc)
{
intk=0;
doublea,b;
sign.pop();
if(num.top(b)==success)如果栈中有两个操作数则进行相应的运算
{
num.pop();
if(num.top(a)==success)
{
num.pop();
k=1;
}
}
if(k)
{
switch(c){
case'+':
num.push(a+b);break;
case'-':
num.push(a-b);break;
case'*':
num.push(a*b);break;
case'/':
if(b==0)
{
set=4;
num.push(-1);
}
else
num.push(a/b);
break;
}
}
else{set=1;num.push(-1);}
}
voidget_command(string&str)
{
cout<<"\n请输入要进行运算的表达式:
"<cin>>str;
}
doubledo_command(conststring&str)
{
strings="";
doubleoutcome=-1;
charc;
for(inti=0;str[i]!
='\0';i++)
{
if(set!
=0)break;
while
(1)
{
if(str[i]<='9'&&str[i]>='0'||str[i]=='.')
{
s+=str[i];
i++;
}
else
{
if(s!
=""){if(num.push(atof(s.c_str()))==overflow)
set=3;
s="";
}
break;
}
}
charch=str[i];
switch(ch)
{
case'*':
//根据优先级先算乘除
case'/':
if(sign.top(c)==success)
if(c=='*'||c=='/')process(c);
if(sign.push(ch)==overflow)
set=3;
break;
case'+':
//再算加减
case'-':
while(sign.top(c)==success)
{
if(c!
='(')process(c);
elsebreak;
}
if(sign.push(ch)==overflow)
set=3;
break;
case'(':
//右括号的先算括号中的
if(sign.push(ch)==overflow)
set=3;
break;
case')':
while(sign.top(c)==success)
{
if(c!
='(')process(c);
elsebreak;
}
sign.pop();
break;
case'=':
while(sign.top(c)==success)
{
process(c);
}
break;
default:
set=2;break;
}
}
if(num.size()==1&&sign.size()==0)
num.top(outcome);
elseset=1;
if(set==0)
cout<<"运算结果是:
\n"<else{
outcome=-1;
if(set==1)cout<<"\n你输入的不匹配,有错误发生。
"<if(set==2)cout<<"\n你输入了非法字符,请重新输入!
"<if(set==3)cout<<"\nStackisfull,Lostresult!
!
"<if(set==4)cout<<"\n分母为0,不能进行除法运算。
"<}
returnoutcome;
}
intmain()
{
do{
stringstr,s;
set=0;
get_command(str);
s=str;
if(str[0]=='-')str='0'+str;
for(inti=1;str[i]!
='\0';i++)
{
if(str[i]=='-'&&str[i-1]=='(')
{str.insert(i,"0");
i++;
}
}
doubleout=do_command(str);
cout<
num.clear();
sign.clear();
cout<<"\n还要计算其它的吗?
"<}while(user_says_qingchu());
return0;
}
四、调试分析
A、调试过程中遇到以下问题:
1、随机数的产生不“随机”,经过查阅MSDN后知道缺少了一个初始化函数,这样每次得到的随机数就不唯一了
2、怎样才能将程序的终止与否这一控制权转交给用户,最后为了实现这一功能又在程序的最外层加了一层循环,每当一道题目做完以后有用户给出一个是否继续的命令。
3、本程序开始在判断除法运算是否正确的时候出现了一个Bug,原因在于计算机对除法的运算精度很高,因而无论用户输入什么计算机判断都唯错,为解决此问题在进行除法判断的时候进行了一些改变,如果答案的偏差控制在了一定的范围内,那就是正确的。
B、以下为程序运行过程中的部分输出
五、用户使用说明
用户在使用时仅需根据程序的提示去做即可,具体如下;
1、Doyouwanttocontinue,pressYORN
输入Y:
继续做题;
输入N:
退出程序。
2、Entertheoperationyouwant:
+、-、*、/
输入“+”:
题目为加法运算;
输入“-”:
题目为键法运算;
输入“*”:
题目为乘法运算;
输入“/”:
题目为除法运算。
3、Entertherange:
A:
1~10B:
1~100:
输入“A”:
所生成题目为一位数运算;
输入“B”;所生成题目为两位数运算。
六、设计心得
纸上得来终觉浅,绝知此事要躬行。
作为一名计算机专业的本科生,如果仅仅只是停留在理论阶段,而不亲自动手去上机实践,那么也是徒劳而无所获。
通过本次程序设计,我初步体会到了人机交互的乐趣。
尽管在编程过程中,我遇到了这样或那样的问题,但最终经过自己的反复思考以及小组成员间的讨论,都一一予以解决了。
同时我也深深懂得了与人合作交流的乐趣,在今后的实践当中我将会更加积极的与他人交流合作,虚心向他人学习,一次来提升自己,共同进步。
面向过程设计题10------10八皇后问题
一、需求分析
八皇后问题,是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850年提出:
在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
高斯认为有76种方案。
1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
当然如果仅仅是用人力去解决这样一个问题,那么求解的过程毫无疑问是复杂而繁琐的,于是编写一个解决此问题的程序变是顺理成章的事情了。
二、概要设计
本程序对所要求的功能进行了相应的扩展:
它不仅可以解决皇后数目为八个的时候的一种摆放方法,而且还可以求出皇后数目为N(N为一整数)时皇后的摆放方法。
首先先由用户输入一个数字N(皇后数目),然后程序根据相应的输入对棋盘(一个二维数组)进行相应的初始化工作,接着程序调用递归函数,以深度优先收索算法对问题进行求解,最后将所求皇后的摆放位置输出。
三、详细设计与编码
#include
intconstmax=10;
intn;
intcount=0;//已经摆放好的皇后数目
charmap[max][max];//棋盘
voiddfs(intj);
intmain()
{
inti,j;
printf("输入皇后的数目:
\n");
scanf("%d",&n);//读入皇后数目
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
map[i][j]='.';
dfs
(1);//调用递归函数求解
printf("------皇后在棋盘中的摆放------\n");//将结果输出
for(i=1;i<=n;i++)
{printf("");
for(j=1;j<=n;j++)
printf("%c",map[i][j]);
printf("\n");
}
printf("------*************------\n");
return0;
}
voiddfs(intj)
{
inti,k;
boolflag=true;
if(count==n)return;//如果所有皇后都已经摆好则返回
for(i=1;i<=n;i++)
{
flag=true;
for(k=1;k<=j-1&&flag;k++)
if(map[i][k]!
='.')flag=false;//判断是否不在同一行
for(k=1;k<=j-1&&flag;k++)
if(k+i-j>=1&&k+i-j<=n)
if(map[k+i-j][k]!
='.')flag=false;//判断是否不再同一对角线
for(k=1;k<=j-1&&flag;k++)
if(i+j-k>=1&&i+j-k<=n)
if(map[i+j-k][k]!
='.')flag=false;//判断是否不再同一对角线
if(flag)
{map[i][j]='#';
count++;
dfs(j+1);
if(count==n)return;
map[i][j]='.';
count--;}
}
}
三、调试分析
A、本程序在调试过程中组要遇到了一下问题:
1、进行递归函数调用时没有进行返回上一步的条件设置,导致程序进入死循环;
2、在设置了递归调用的返回条件后,没有对当前状态进行适当的清理工作,也未能得到正确的结果;
3、为对二维数组(棋盘)进行相应的初始化,使得在输出错误。
B、以下为程序运行过程中的部分输出
四、用户使用说明
用户对本程序所需进行的操作非常简单,只需输入一个整数N(皇后的数目),程序便会将皇后的摆放方法输出。
五、设计心得
作为一名计算机专业的本科生,如果仅仅只是停留在理论阶段,而不亲自动手去上机实践,那么也是徒劳而无所获。
通过本次程序设计,我初步体会到了人机交互的乐趣。
尽管在编程过程中,我遇到了这样或那样的问题,但最终经过自己的反复思考以及小组成员间的讨论,都一一予以解决了。
同时我也深深懂得了与人合作交流的乐趣,在今后的实践当中我将会更加积极的与他人交流合作,虚心向他人学习,一次来提升自己,共同进步。