admin 管理员组

文章数量: 1086019


2024年4月27日发(作者:基因编程可怕的技术)

一、 实验设计方案

1、实验内容与目的(简单介绍实验内容,说明实验目的)

实验目的:实现扑克牌游戏:对于任意的四个1到13的整数(四张扑克牌),求能

算出24的表达式;运算符有()+-*/;若无解则输出相应的信息。

实验内容:

你的具体选择(要详细)

文件输入()输出(),输出全部结果;

——————————————————————————————————————

2、实验准备工作(阐述解决问题所涉及的算法思想,至少要画一个算法流程图来说明)

本次实验相当于,给出四个数字,要求,在其间添加运算符和括号,使得计算结果

等于24。

括号的放置即为决定哪几个数先进行计算。所以,我们先确定首先进行计算的两个

相邻的数,计算完成后,就相当于剩下三个数字,仍需要在它们之间添加符号;然后再

决定在这三个数中哪两个相邻的数先计算。由此,我们就成功解决了数字的运算次序问

题,此时不需要再考虑不同运算符号的优先级问题,因为括号的优先级高于加减乘除。

通过循环,我们可以得到第一第二第三次计算的运算符,再通过计算,就可以得出

和,若和等于24,即为所求解。

在输出格式中,由于括号的放置共六种情况,故根据计算先后顺序的不同,输出时

在不同地方放置括号;

以下为循环计算的流程图:

选择先

行计算

的两个

相邻数

第一

个数

第二

个数

第三

个数

第四

个数

第一个

符号

选择先

行计算

的两个

相邻数

第一

个数

第二

个数

第三

个数

第二个

符号

第一

个数

第二

个数

第三个

符号

表示循环获取;

表示计算数值

以下为计算函数的流程图:

数字2

数字1

数字1

数字2

结果

+或-

或*

符号

/

返回

结果

若数字2

不为0

——————————————————————————————————————

二、实验步骤、测试与结果分析

1、源程序的设计(在此附上源程序(cpp文件)清单)

#include

#include

#include

using namespace std;

char sign[4]={'+','-','*','/'};

//定义一个全局变量,用于储存加减乘除符号,方便下面符号判断

class game24point

//24点纸牌游戏类

{

private:

double a[4];

//为实现精确计算,防止计算结果为小数却被强制转换为整数,采用double变量

public:

game24point();

//构造函数

double calcute(double,double,char);

//计算函数,给出一个符号两个有顺序的数,计算结果

void search();

//搜索函数,用于寻找合适的解

void print();

//打印得到的四张纸牌的数值

};

game24point::game24point()

{

char ch[4];

//由于纸牌中除了数字还有AJQK等字符,故使用字符数组

ifstream infile("");

if(!infile)

//若打开失败

{

cout<<"打开文件失败!"<

exit(1);

}

for(int i=0;i<4;i++) infile>>ch[i];

//在input文件中读取数据

cout<<" ##########################################"<

cout<<" ## ##"<

cout<<" ## 正在从中读取数据 ##"<

cout<<" ## ##"<

cout<<" ##########################################"<

for(i=0;i<4;i++)

{

if(ch[i]=='A') a[i]=10;

else if(ch[i]=='J') a[i]=11;

else if(ch[i]=='Q') a[i]=12;

else if(ch[i]=='K') a[i]=13;

else if(ch[i]=='1') a[i]=1;

else if(ch[i]=='2') a[i]=2;

else if(ch[i]=='3') a[i]=3;

else if(ch[i]=='4') a[i]=4;

else if(ch[i]=='5') a[i]=5;

else if(ch[i]=='6') a[i]=6;

else if(ch[i]=='7') a[i]=7;

else if(ch[i]=='8') a[i]=8;

else if(ch[i]=='9') a[i]=9;

else

{

cout<<"第"<

exit(1);

}

}

//纸牌字符转换为数值

();

}

double game24point::calcute(double a,double b,char index)

{

if(index=='+') return a+b;

//若为+,则返回相应结果

else if(index=='-') return a-b;

else if(index=='*') return a*b;

else if(index=='/') if(b!=0) return a/b;

//只有当分母不为0时,返回结果

}

void game24point::search()

{

double temp[3],tem[2];

//第一个符号放置后,经过计算后相当于剩下三个数,这个数组用于存储这三个数

double sum;

//求得的和

int judge=0;

//判断是否找到一个合理的解

ofstream outfile("",ios::app);

//以输出的方式打开文件

if(!outfile)

//若文件打开失败

{

cout<<"打开文件失败"<

exit(1);

}

cout<<" ##########################################"<

cout<<" ## ##"<

cout<<" ## 正在计算结果,请等待 ##"<

cout<<" ## ##"<

cout<<" ##########################################"<

outfile<<"===============================================================

========"<

outfile<<" ##########################################"<

outfile<<" ## ##"<

outfile<<" ## 本次24点游戏求得结果如下 ##"<

outfile<<" ## ##"<

outfile<<" ##########################################"<

for(int i=0;i<4;i++)

//第一次放置的符号

{

for(int j=0;j<4;j++)

//第二次放置的符号

{

for(int k=0;k<4;k++)

//第三次放置的符号

{

for(int m=0;m<3;m++)

//首先计算的两个相邻数字,共有3种情况,相当于括号的作用

{

if(a[m+1]==0 && sign[i]=='/') break;

temp[m]=calcute(a[m],a[m+1],sign[i]);

temp[(m+1)%3]=a[(m+2)%4];

temp[(m+2)%3]=a[(m+3)%4];

//先确定首先计算的两个数字,计算完成相当于剩下三个数,按顺序

储存在temp数组中

for(int n=0;n<2;n++)

//三个数字选出先计算的两个相邻数字,两种情况,相当于第二个括

{

if(temp[n+1]==0 && sign[j]=='/') break;

tem[n]=calcute(temp[n],temp[n+1],sign[j]);

tem[(n+1)%2]=temp[(n+2)%3];

//先确定首先计算的两个数字,计算完成相当于剩下两个数,按

顺序储存在temp数组中

if(tem[1]==0 && sign[k]=='/') break;

sum=calcute(tem[0],tem[1],sign[k]);

//计算和

if(sum==24)

//若和为24

{

judge=1;

//判断符为1,表示已求得解

if(m==0 && n==0)

outfile<<"(("<

]<<"="<

else if(m==0 && n==1)

outfile<<"("<

<<")="<

else if(m==1 && n==0)

outfile<<"("<

<<"="<

else if(m==1 && n==1)

outfile<

="<

else if(m==2 && n==0)

outfile<<"("<

<<")="<

else if(m==2 && n==0)

outfile<

="<

//m=0,1,2 n=0,1表示六种括号放置可能,并按照这六种

可能输出相应的格式的计算式

}

}

}

}

}

}

if(judge==0) outfile<<"这四张扑克牌无法找到一个合理的解"<

//如果没有找到结果,符号位为0

outfile<<"===============================================================

========"<

outfile<

();

cout<<"计算完成,结果已保存在文件中!"<

}

void game24point::print()

{

cout<<"读取成功!"<

for(int i=0;i<4;i++)

{

cout<<"第"<

}

}

int main(void)

{

game24point obj;

();

cout<

();

cout<

system("PAUSE");

return 0;

}

——————————————————————————————————————

2、实验现象及结论(应用文字和程序运行的截图说明程序测试现象,并解释结果)

截图

Exe执行文件截图

执行截图

输入截图如下:

执行截图如下:

输出截图如下:

输入截图如下:

执行截图如下:

输出截图如下:

——————————————————————————————————————

3、实验总结(是否成功解决问题,总结实验中最有价值的内容,程序能够在哪些方面进

一步改善,自我评价成败得失)

试验中,我们按照从简单到复杂的方法,一步一个脚印编写代码,使得程序不易发

生错误,并且容易更正,编写出来的程序代码简洁明朗,效率较高;

通过对例题的学习,我们最终将正确的代码编写出,并在不断地修改之下做到方便

用户使用的要求;

编码的速度有一个从慢到快的过程,在本次试验中,我们的速度依然比较慢,这看

出我们平时编码比较少,缺乏熟练度,并对算法了解不深入;

但是我们的代码看起来仍然有些凌乱,效率还没有带到真正的高效,每次运行都需

要等待几秒钟。再以后我们将通过练习基础功,简化程序代码,实现简单代码完善功能

的理想。

1. 编码要尽量使程序简单,采用最切实可靠的算法,实现封装,不同部分的代码应分工

明确,最后由主函数统一调用;

2. 编写完成后先自己检查一遍代码,然后由机器检测,找出错误的根源,从不同角度思

考如何解决问题;

3. 测试时应尽可能输入各种可能情况的数据以确保程序准确无误。

4. 应避免任何可能的漏洞,使代码的可用性和可靠性增强。

5. 试验中,我按照从简单到复杂的方法,一步一个脚印编写代码,使得程序不易发生错

误,并且容易更正,编写出来的程序代码简洁明朗,效率较高;

6. 通过对例题的学习,我最终将正确的代码编写出,并在不断地修改之下做到方便用户

使用的要求;

7. 编码的速度有一个从慢到快的过程,在本次试验中,我的速度依然比较慢,这看出我

平时编码比较少,缺乏熟练度,并对算法了解不深入;

8. 但是我的代码看起来仍然有些凌乱,效率还没有带到真正的高效,每次运行都需要等

待几秒钟。再以后我将通过练习基础功,简化程序代码,实现简单代码完善功能的理

想。

本次试验中,我们先将书上的代码编译通过,通过讨论,认为书上检查异常的方式不

便于理解,于是直接采用输出到dos窗口的方式,所以没有使用到utility.h头文件,

同时,由于我们电脑上安装的编译系统不方便对.h文件进行调试修改,所以我们采用

的cpp文件,在一个cpp文件中写下所有代码。

对于txt文件输出的格式,我们做的稍微人性化,界面简洁,容易区分


本文标签: 计算 代码 实验 数字 文件