计算机八皇后计算机实验报告.docx

上传人:b****6 文档编号:8445986 上传时间:2023-01-31 格式:DOCX 页数:15 大小:56.89KB
下载 相关 举报
计算机八皇后计算机实验报告.docx_第1页
第1页 / 共15页
计算机八皇后计算机实验报告.docx_第2页
第2页 / 共15页
计算机八皇后计算机实验报告.docx_第3页
第3页 / 共15页
计算机八皇后计算机实验报告.docx_第4页
第4页 / 共15页
计算机八皇后计算机实验报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

计算机八皇后计算机实验报告.docx

《计算机八皇后计算机实验报告.docx》由会员分享,可在线阅读,更多相关《计算机八皇后计算机实验报告.docx(15页珍藏版)》请在冰豆网上搜索。

计算机八皇后计算机实验报告.docx

计算机八皇后计算机实验报告

编号:

()字号

《软件课程设计》报告

 

软件课程设计任务书

专业年级:

学生姓名:

任务下达日期:

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(皇后的数目),程序便会将皇后的摆放方法输出。

五、设计心得

作为一名计算机专业的本科生,如果仅仅只是停留在理论阶段,而不亲自动手去上机实践,那么也是徒劳而无所获。

通过本次程序设计,我初步体会到了人机交互的乐趣。

尽管在编程过程中,我遇到了这样或那样的问题,但最终经过自己的反复思考以及小组成员间的讨论,都一一予以解决了。

同时我也深深懂得了与人合作交流的乐趣,在今后的实践当中我将会更加积极的与他人交流合作,虚心向他人学习,一次来提升自己,共同进步。

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

当前位置:首页 > 解决方案 > 学习计划

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

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