数据结构课程设计 24点游戏源代码

合集下载

数据结构课程设计(计算24点)

数据结构课程设计(计算24点)
3
程序采用穷举法,对输入的4个数进行排列,有 4!=24种。用for来循环,if来判断,算法如下。
for (i=0;i<4;i++)
for (j=0;j<4;j++)
if (j!=i)
for (k=0;k<4;k++)
if (k!=j && k!=i)
for (l=0;l<4;l++)
if (l!=i && l!=j && l!=k)
4
程序第一次编译时,有19个错误,都是语法错误,修改后,能通过编译。第一次运行,并不能输出正确结果,主要原因有两个:一个是运算符号的穷举次数不对,另一个是 4个数的运算先后顺序不对。其他的错误有除数不能为零,括号的位置不对。经过修改,调试后,能运算出正确的结果。
输入 3.1测试用例的数据,程序运行成功,运行结果如图2,3,4,5,6所示(见 附录 F2 运行结果)
接着输入数据2,9,7,14,提示输入错误,重新输入2,7,5,13,能得到正确运行结果。
输入4,9,11,13,不能运算得到24,显示“你所输入的数,经过四则运算后,不等于24点”
输入5,5,5,1,这组数据要运算得到24,一定会出现小数,因为只有一种运算,即5*(5 - 1 / 5),程序显示出正确结果。
}
}
void calculate(float a,float b,float c,float d) //进行加、减、乘、除运算
{
int i,j,k;
float sum1,sum2,sum3; //储存3次两两运算的结果
for (i=0;i<4;i++) // "+ - * /" 4个运算符号选3个,有4*4*4=64种

24点游戏代码

24点游戏代码
{
int i,j,k;
float sum1,sum2,sum3;
for (i=0;i<4;i++)
for (j=0;j<6;j++)
for (k=0;k<6;k++)
{
if ((!(i==3 && b==0)) && (!(j==3 && c==0)) && (!(k==3 && d==0)))
{
sum1=myF(i,a,b);
//printf ("sum2:myF(%d,%2.0f,%2.0f) sum2=%f\n",j,c,d,sum2);
//printf ("2:myF(%d,myF(%d,%2.0f,%2.0f),myF(%d,%2.0f,%2.0f)) sum3=%f\n\n",k,i,a,b,j,c,d,sum3);
sum2=myF(j,sum1,c);
sum3=myF(k,sum2,d);
if (fabs(sum3-24)<0.1)
{
temp++;
myPrint(1,i,j,k,a,b,c,d);
//printf ("sum1:myF(%d,%2.0f,%2.0f) sum1=%f\n",i,a,b,sum1);
}
}
if (k==2)
{
sum1=myF(i,a,b);
sum2=myF(j,c,d);
sum3=sum1*sum2;
if (fabs(sum3-24)<0.1)
{
temp++;

24点游戏课程设计说明书

24点游戏课程设计说明书

课程设计课程设计名称:算 24 点游戏2 设计模块5 原程序#include <stdio.h>#include <string.h>int c24;char expr3[80];char expr4[80];void count2( int a, int b )if ( a + b == 24 ){c24 ++;printf( "%s\t%s\t%d+%d=24\n", expr4, expr3, a, b );}if ( a * b == 24 ){c24 ++;printf( "%s\t%s\t%d*%d=24\n", expr4, expr3, a, b );}if ( a - b == 24 ){c24 ++;printf( "%s\t%s\t%d-%d=24\n", expr4, expr3, a, b );}if ( b - a == 24 ){c24 ++;printf( "%s\t%s\t%d-%d=24\n", expr4, expr3, b, a );}if ( (b!=0) && (a==24*b) ){c24 ++;printf( "%s\t%s\t%d/%d=24\n", expr4, expr3, a, b );}if ( (a!=0) && (b==24*a) ){c24 ++;printf( "%s\t%s\t%d/%d=24\n", expr4, expr3, b, a );}}void count3( int a, int b, int c ){int dd[3];int i,j,k,nd;dd[0] = a;dd[1] = b;dd[2] = c;for ( i = 0; i < 3; i++ )for ( j = i+1; j < 3; j++ ){k = 3 - i - j;nd = dd[i] + dd[j];sprintf( expr3, "%d+%d=%d", dd[i], dd[j], nd );count2( nd, dd[k] );nd = dd[i] * dd[j];sprintf( expr3, "%d*%d=%d", dd[i], dd[j], nd );count2( nd, dd[k] );if ( dd[i]>dd[j] )nd = dd[i] - dd[j];sprintf( expr3, "%d-%d=%d", dd[i], dd[j], nd ); }else{nd = dd[j] - dd[i];sprintf( expr3, "%d-%d=%d", dd[j], dd[i], nd ); }count2( nd, dd[k] );if ( (dd[j]!=0) && (dd[i]%dd[j]==0) ){nd = dd[i] / dd[j];sprintf( expr3, "%d/%d=%d", dd[i], dd[j], nd );count2( nd, dd[k] );}else if ( (dd[i]!=0) && (dd[j]%dd[i]==0) ){nd = dd[j] / dd[i];sprintf( expr3, "%d/%d=%d", dd[j], dd[i], nd );count2( nd, dd[k] );}}void count4( int a, int b, int c, int d ){int dd[4];int i,j,k,m,nd;dd[0] = a;dd[1] = b;dd[2] = c;dd[3] = d;for ( i = 0; i < 4; i++ )for ( j = i+1; j < 4; j++ ){for ( k = 0; (k==i) || (k==j); k++ ) ;m = 6 - i - j - k;nd = dd[i] + dd[j];sprintf( expr4, "%d+%d=%d", dd[i], dd[j], nd );count3( nd, dd[k], dd[m] );nd = dd[i] * dd[j];sprintf( expr4, "%d*%d=%d", dd[i], dd[j], nd ); count3( nd, dd[k], dd[m] );if ( dd[i]>dd[j] ){nd = dd[i] - dd[j];sprintf( expr4, "%d-%d=%d", dd[i], dd[j], nd ); }else{nd = dd[j] - dd[i];sprintf( expr4, "%d-%d=%d", dd[j], dd[i], nd ); }count3( nd, dd[k], dd[m] );if ( (dd[j]!=0) && (dd[i]%dd[j]==0) ){nd = dd[i] / dd[j];sprintf( expr4, "%d/%d=%d", dd[i], dd[j], nd );count3( nd, dd[k], dd[m] );}else if ( (dd[i]!=0) && (dd[j]%dd[i]==0) ){nd = dd[j] / dd[i];sprintf( expr4, "%d/%d=%d", dd[j], dd[i], nd );count3( nd, dd[k], dd[m] );}}}main(){int a,b,c,d;printf( "Input 4 Number for Count 24: " );scanf( "%d%d%d%d", &a, &b, &c, &d );c24 = 0;count4( a, b, c, d );if ( c24==0 )printf( "No Answer\n" );/***/printf("End of C Program, Press Enter.\n");getchar();getchar();return 0;}六运行效果七参考资料1:《C语言程序设计与应用》2:《C语言设计》(谭浩强)3:《C语言程序设计与应用教程》(周虹) 4:计算机程序设计 VC/C++ 课程设计指导八课程设计的感受与收获二十一世纪是计算机的世纪,是一个全新的世纪,计算机正逐步入侵我们的生活。

24点游戏C语言代码及报告

24点游戏C语言代码及报告

24点游戏C语言代码及报告24点游戏一,问题分析二十四点游戏规则:给出4个数字,所给数字均为有理数,用加、减、乘、除(可加括号)把给出的数算成24(每个数必须用一次且只能用一次,先算出结果者获胜。

步骤:比如下面的例子:例:3、8、8、9,答案1:(9—8)×8×3答案2: 3×8 ?(9—8)答案3:(9—8?8)×3利用3×8,24、4×6,24求解我的主要想法是首先穷举的可行性问题。

我把表达式如下分成三类—— 1、无括号的简单表达式。

2、有一个括号的简单表达式。

3、有两个括号的较复4、杂表达式。

穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。

我利用一个嵌套函数实现四个数的排列二,源程序及注释//首先穷举的可行性问题。

我把表达式如下分成三类——//1、无括号的简单表达式。

//2、有一个括号的简单表达式。

//3、有两个括号的较复4、杂表达式。

//穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。

我利用一个嵌套函数实现四个数的排列#include <iostream>#include <string>using namespace std;int number=0;string sss[5000];float cal(float a,float b,int p) {switch(p){case 1:return a+b;case 2:return a-b;case 3:return a*b;case 4:return a/b;case 5:return b-a;case 6:return b/a;}}string link(string a,string b,int p) {string st=a;switch(p){case 1:st+=("+"+b);break;case 2:st+=("-"+b);break;case 3:st+=("*"+b);break;case 4:st+=("/"+b);break;case 5:st=b+"-"+st;break;case 6:st=b+"/"+st;break;}st="("+st+")";return st;}void putout1(string c[],int p[]) { string st;st=link(c[1],c[2],p[1]);st=link(st,c[3],p[2]);st=link(st,c[4],p[3]);st=st.erase(0,1);st=st.erase(st.length()-1,1); number++;sss[number]=st;}void putout2(string c[],int p[]) { string st1,st2,st;st1=link(c[1],c[2],p[1]);st2=link(c[3],c[4],p[3]);st=link(st1,st2,p[2]);st=st.erase(0,1);st=st.erase(st.length()-1,1);number++;sss[number]=st;}void suan(float a[],string c[]) {int p[4];int i;float sum,sum1,sum2;for(p[1]=1;p[1]<=6;p[1]++)for(p[2]=1;p[2]<=6;p[2]++)for(p[3]=1;p[3]<=6;p[3]++){sum=cal(a[1],a[2],p[1]);sum=cal(sum,a[3],p[2]);sum=cal(sum,a[4],p[3]);if((sum-24>=0&&sum-24<1e-5)||(sum-24<=0&&sum-24>-1e-5)) putout1(c,p); sum1=cal(a[1],a[2],p[1]);sum2=cal(a[3],a[4],p[3]);sum=cal(sum1,sum2,p[2]);if((sum-24>=0&&sum-24<1e-5)||(sum-24<=0&&sum-24>-1e-5)) putout2(c,p); }}void disorder(float a[],string c[]){float b[5];string d[5];int i,j,k,l;for(i=1;i<=4;i++)for(j=1;j<=4;j++){if(j==i)continue;for(k=1;k<=4;k++){if(k==i||k==j)continue;for(l=1;l<=4;l++){if(l==i||l==j||l==k)continue;b[1]=a[i];b[2]=a[j];b[3]=a[k];b[4]=a[l]; d[1]=c[i];d[2]=c[j];d[3]=c[k];d[4]=c[l]; suan(b,d);}}}}int main(){cout<<"请输入四个数字";float a[5];int i,j;string c[5];for(i=1;i<=4;i++){cin>>a[i];if(a[i]==10)c[i]="10" ;else c[i]=int(a[i])+'0';}disorder(a,c);int v=1,u=0;for(i=1;i<=number;i++){v=1;for(j=1;j<i;j++)if(sss[i]==sss[j])v=0;if(v==1){cout<<sss[i]<<endl;u=1;}}if(u==0)cout<<"无解"<<endl;system("pause");return 0;}三,运行结果显示四,调试和运行程序过程中产生的问题及采取的措施:。

数据结构24点游戏源代码

数据结构24点游戏源代码

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>#define OPSETSIZE 7#define STACK_INIF_SIZE 50#define STACKINCREMENT 10int number[2][4];enum{eNumber = 0, //操作数eOperator = 1 //算子};int oper[7]={43,45,42,47,40,41,35};char OPSET[OPSETSIZE]={'+' , '-' , '*' , '/' ,'(' , ')' , '#'};typedef struct sqlist{int bol;//bol 是0 时,num-ch是一个数字;bol 是1 时num_ch 运算符int num_ch;struct sqlist *next;}sqlist;//线性表typedef struct sqstack{int *base;int *top;int stacksize;}sqstack;//栈的定义unsigned char Prior[7][7] = {// 课本表3.1 算符间的优先关系'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=',' ','>','>','>','>',' ','>','>','<','<','<','<','<',' ','='};int init_sq(sqlist *l){//初始化链表l=(sqlist*)malloc(sizeof(sqlist));if(l==NULL){exit(-2);}l->next=NULL;return 1;}int insert_sq(sqlist **p,int e,int bl){//链表插入操作sqlist *q;q=(sqlist*)malloc(sizeof(sqlist));q->num_ch=e;q->bol=bl;q->next=NULL;(*p)->next=q;(*p)=(*p)->next;return 1;}int check(sqlist l)//保证输入的数字是给出的四个数字{int right=1,find=0,i;sqlist *q=&l;q=q->next ;for (;q->next!=NULL;q=q->next){if(q->bol==1){if(q->num_ch <=39||q->num_ch>57||q->num_ch==44||q->num_ch==46){ right=0;printf("%c不是有效的运算符!\n");}}else {find=0;for(i=0;i<4;i++){if(number[1][i]==0&&number[0][i]==q->num_ch ){number[1][i]=1;find=1;break;}}if(find==0){printf("%d 不在给出的四个数字中!\n",q->num_ch );right=0;}}}//end forfor (i=0;i<4;i++){if(number[1][i]==0){printf("%d没有用上!\n",number[0][i]);right=0;}}return right;}int chang(char *s,sqlist *l){//将用户的输入转化为单链表int t=0;unsigned int i=0;int bl,ch;int a1,a2,a;sqlist *p=l;for (;i<strlen(s);i++){if(s[i]>47&&s[i]<58&&t==0){a1=(int)s[i]-48;t++;}else if(s[i]>47&&s[i]<58&&t==1){a2=(int)s[i]-48;a=a1*10+a2;t++;}else if(s[i]<48&&s[i]>39&&s[i]!=44&&s[i]!=46){if(t==1){bl=0;insert_sq(&p,a1,bl);t=0;}else if(t==2){bl=0;insert_sq(&p,a,bl);t=0;}bl=1;ch=(int)s[i];insert_sq(&p,ch,bl);t=0;}else {printf("%c不是有效的运算符!\n",s[i]);}} //end fori=strlen(s)-1;if(s[i]>47&&s[i]<58){if(s[i-1]>47&&s[i-1]<58){bl=0;insert_sq(&p,a,bl);}else {bl=0;insert_sq(&p,a1,bl);}}bl=1;a=35;insert_sq(&p,a,bl);return (check(*l));}int Operate(int a,int theta, int b){//计算switch(theta) {case 43: return a+b;case 45: return a-b;case 42: return a*b;case 47:{if(b==0){return -2000;}if (a%b==0){return a/b;}else {//printf("不能为小数\n");return -10000;}}default : return 0;}}int ReturnOpOrd(char op,char* TestOp)// precede()函数调用求优先级{int i;for(i=0; i< OPSETSIZE; i++){if (op == TestOp[i]) return i;}return 0;}char precede(char Aop, char Bop){return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];}int initstack(sqstack *s){(s)->base = (int*)malloc(STACK_INIF_SIZE*sizeof(int));if((s)->base==NULL) exit(-2);(s)->top=(s)->base;(s)->stacksize = STACK_INIF_SIZE;return 1;}int gettop(sqstack *s){ //取得栈顶元素int e;if(s->top==s->base){printf("栈空,无法取得栈顶元素!\n");return 0;}e=*(s->top-1);return e;}int push(sqstack *s,int e){ //压栈if(s->top-s->base>=s->stacksize){s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int));if(!s->base) exit(-2);s->stacksize+= STACKINCREMENT;}*(s->top++)=e;return 1;}int pop(sqstack *s,int *e){ //出栈if(s->top==s->base){printf("栈空,出栈错误!\n");return 0;}*e=*(--s->top);return 1;}int EvaluateExpression(char* MyExpression) { // 算法3.4----计算表达式的值// 算术表达式求值的算符优先算法。

24点纸牌游戏源代码

24点纸牌游戏源代码

#include <stdio.h>#include <windows.h>#pragma comment ( lib, "Winmm.lib")// 0,1,2,3分别代表+,-,*,/float OperVisual(float num1,float num2,int oper);//双目运算int Show(float num1,float num2,float num3,float num4,int i);//交换率运算并显示void main(){int i1,i2,i3,i4,i=0;unsigned int s1,s2;float num[4];//分别代表输入的4个数puts("Please enter the number 4:");scanf("%f%f%f%f",&num[0],&num[1],&num[2],&num[3]);s1=timeGetTime();for(i1=0;i1<4;i1++){for(i2=0;i2<4;i2++){for(i3=0;i3<4;i3++){for(i4=0;i4<4;i4++){if(i1!=i2&&i1!=i3&&i1!=i4&&i2!=i3&&i2!=i4&&i3!=i4)i=Show(num[i1],num[i2],num[i3],num[i4],i);}}}}if(!i) printf("No answer !");s2=timeGetTime();printf("\ntime consuming:%dms\n",s2-s1);getchar();getchar();}int Show(float num1,float num2,float num3,float num4,int i){int oper1,oper2,oper3;//分别代表3个操作符char OperShow[4]={'+','-','*','/'};//0,1,2,3float end1,end2,end3;for(oper1=0;oper1<4;oper1++){//第一个运算符end1=OperVisual(num1,num2,oper1);//将第一个数进行4次运算for(oper2=0;oper2<4;oper2++){//第二个运算符end2=OperVisual(end1,num3,oper2);//将前两个数的结果和第三个数进行4次运算for (oper3=0;oper3<4;oper3++){//第三个运算符end3=OperVisual(end2,num4,oper3);//将前三个数的结果和第三个数进行4次运算if(end3==24){if(oper1<=1&&oper2>=2)//如果第一个运算符为+或-第二个运算符为*或/printf("(%.f%c%.f)%c%.f%c%.f=24\n",num1,OperShow[oper1],num2,OperShow[oper2],nu m3,OperShow[oper3],num4),i++;else if(oper1<=1&&oper2<=1&&oper3>=2)printf("(%.f%c%.f%c%.f)%c%.f=24\n",num1,OperShow[oper1],num2,OperShow[oper2],nu m3,OperShow[oper3],num4),i++;else if(oper1>=2&&oper2<=1&&oper3>=2)printf("(%.f%c%.f%c%.f)%c%.f=24\n",num1,OperShow[oper1],num2,OperShow[oper2],nu m3,OperShow[oper3],num4),i++;elseprintf("%.f%c%.f%c%.f%c%.f=24\n",num1,OperShow[oper1],num2,OperShow[oper2],num3,Op erShow[oper3],num4),i++;}}}}return i;}float OperVisual(float num1,float num2,int oper){float result;switch(oper){case 0:result=num1+num2;break;case 1:result=num1-num2;break;case 2:result=num1*num2;break;case 3:result=num1/num2;break;}return result;}。

c++24点游戏

c++24点游戏

c++24点游戏正文第一篇:c++24点游戏 c++24点游戏 #include iostream#include stringusing namespace std; //定义Stack类const maxsize=2022 enum Error_code { success, overflow, underflow };templateclass Stack {public:Stack();bool empty() const;bool full() const;int size() const;void clear();Error_code top(T &item) const;Error_code pop();Error_code push(const T &item);private:int count;T entry[maxsize];};templateStack::Stack() {count=0;}templatebool Stack::empty () const { return count==0;}templatebool Stack::full () const { return count==maxsize;}templateint Stack::size() const {return count;}templatevoid Stack::clear() {count=0;}templateError_code Stack::top (T &item) const { if (empty()) return underflow;item= entry[count-1];return success;}templateError_code Stack::pop () {if (empty()) return underflow;count--;return success;}templateError_code Stack::push (const T &item) {if (full()) return overflow;entry[count++]=item;return success;} Stack sign;Stack num;int set; // 判断程序中的异常,以便适时退出?//void process(char c) //计算两个数的 + - * / 运算// { int k=0;double a,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);}elsenum.push(a/b);break;}}else {set=1;num.push(-1);}}void get_command(string &str) {coutstr;}double do_command(const string &str) {string s=;double outcome=-1;char c;for (int i=0;str[i]!='\0';i++){if (set!=0) break; //例外则停止运行while (1) { //分离数据与运算符if (str[i]='0' || str[i]=='.') {s+=str[i];i++;}else {if(s!=) {if (num.push(atof(s.c_str ()))==overflow)set=3;s=;break;}}char ch= 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);else break;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);else break;}sign.pop();break;case '=':while (sign.top(c)==success) { if (c!='(') process(c);else break;}break;default: set=2;break;}}if (num.size()==1 && sign.size()==0)num.top(outcome);else set=1;if (set==0) coutout; cout>jj;cout13 || a[i]!=int(a[i])) 在输出方面,运算结果等于 24就输出,利用调用的参数判断输出形式,有5种:(a+b)*(c+d),a*(b*(c+d)) ,(a*(b+c))*d ,a*((b+c)*d) ,((a+b)*c)*d。

24点游戏

24点游戏
itoa(x,buffer,10);
result[i]=buffer;
}
if(PointsGame(CardsNumber))
{
cout<<"Success"<<endl;
}
else
{
cout<<"Fail"<<endl;
}
return 0;
}
result[i]='('+expa+'+'+expb+')';
number[i]=a+b;
if (PointsGame(n-1))
{
return true;
}
result[i]='('+expa+'-'+expb+')';//将结果存储在i中
return true;
}
result[i]='('+expb+'*'+expa+')';
number[i]=b*a;
if(PointsGame(n-1))
{
return true;
}
if (b!=0)
{
result[i]='('+expa+'/'+expb+')';
number[i]=a-b;
if (PointsGame(n-1))
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

环对四个数字进行赋值,并对循环加以控制,使每个数字只用一次,然后再
通过三层循环对三个位置的运算符赋值。每一次循环都会产生一个数组,别
调用下面的CalcOneExpress函数求算式的值!结果可能算出24点,或者算不
出24点 (如图2,图3)。
以下两段代码是对针对第一种形式的算式求24点。过程为:对四个数字
参考文献 3 潭浩强.C 语言程序设计(第三版). 清华大学出版社,2005
4 潭浩强.C 语言程序设计题解与上机指导(第三版). 清华大学出版社,2005
5 张 曼,朱小谷,吕士俊.数据结构习题与解答 . 北京希望电子出版社.2005
审查意见
指导教师签字: 教研室主任签字:
年月日
1
1.需求分析
24点游戏主要有两个功能: (1)用户记算24点 程序随机产生四个1-13的数,分别代表4张牌, 提示用户输入算式。如 果用户认为程序给出的一组数字不能算出24点(如1,1,2,2),则输入‘?’, 然后程序对四个数字进行计算,如果真的不能算出24点,则输出用户正确的 信息,否则给出一个正确的算式,并显示用户错误的信息。 (2).程序计算24点 用户输入四个1-13的数,代表4张牌,程序需要通过一定的规则添加括 号和运算符来使算式的值等于24,如果用户给出的四个数字不能算出24点, 则输出错误信息!
5
(2)main()函数及用户界面 void main(){ gameinformation(); //输出作者信息 menu(); //输出功能菜单,游戏开始 } 用户界面如 图1 所示。
(3)由程序计算24点的算法分析:
用户输入四个1-13的数,代表4张牌,程序算24点。这要考虑到各种情
况。首先是加入括号,有以下5种可能的形式:
2.概要设计
○1 抽象数据结构定义:
ADT{ 数据对象:D={a|a为大于0小于14的整数} push(sqstack *s,int e) //压栈 gettop(sqstack *s) //取得栈顶元素 pop(sqstack *s,int *e) //出栈 randomm() //产生四个随机数 EvaluateExpression(char* MyExpression) //课本算法3.4---计算表达式的值 init_sq(sqlist *l) //初始化链表 insert_sq(sqlist **p,int e,int bl) //链表插入操作 chang(char *s,sqlist *l) //将用户的输入转化为单链表 check(sqlist l) //保证输入的数字是给出的四个数字 Operate(int a,int theta, int b) //计算 precede(char Aop, char Bop) //求运算符优先级 ReturnOpOrd(char op,char* TestOp) //返回运算符优先级
dRes = CalcOneExpress(expression); //对每一个算式求值,直到算出24点 if(Equal24(dRes)) //判定表达式的值是否为24 { printf("可以这样运算:%d%c%d%c%d%c%d\n",expression[0][0],oper[ii], expression[2][0],oper[jj],expression[4][0],oper[kk],expression[6] [0]);
课程设计
课程设计名称: 数据结构课程设计
专业班级:
学生姓名:

号:
指导教师:
课程设计时间:
计算机科学与技术专业课程设计任务书
学生姓名 题目
课题性质 指导教师
其它
专业班级 24 点游戏 课题来源 同组姓名
学号
自拟课题
一副牌共 54 张,除去大小 King,还剩 52 张,从中任意取四张加入括号和 主要内容 加减乘除运算符,组成表达式,并使表达式的值等于 24。(注:1. 每张牌只能
int expression[8][2],ii,jj,kk; int i,j,k,l,dRes; for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
if(j==i) continue; for(k=0;k<4;k++) {
if(k==i||k==j) continue; for(l=0;l<4;l++) {
return 1; } } } } } } } return 0; }
8
代码2. //课本算法3.4---计算 算式的值 int CalcOneExpress(int expression[][2]) {
// 算术表达式求值的算符优先算法。 // 设OPTR和&&OPND分别为运算符栈和运算数栈,OP为运算符集合。 int index=0,result,c,theta,a,b; sqstack OPTR; // 运算符栈,字符元素 sqstack OPND; // 运算数栈,实数元素 initstack(&OPTR); push(&OPTR, 35); initstack (&OPND); c=expression[index][0]; while (c!= 35 || gettop(&OPTR)!=35) {
push(&OPTR, c); index++; c=expression[index][0];
9
break; case '=': // 脱括号并接收下一字符
pop(&OPTR, &c); index++; c=expression[index][0]; break; case '>': // 退栈并将运算结果入栈 pop(&OPTR, &theta); pop(&OPND, &b); pop(&OPND, &a); push(&OPND, Operate(a, theta, b)); break; default: printf("没有这个运算符\n"); return 0; } // switch }//else } // while result=gettop(&OPND); return result; } // end CalcOneExpress
□1 . a b
c
d
□2 . (a b) c d
同 a b (c d) 和 a (b c) d
□3 . (a b c) d
□4 . (a b) (c d)
□5 . ( (a b) c) d
同 (a (b c)) d
然后根据上述 5 种情况加入运算符。
对于每种不同的算式形式,先在固定的位置加入括号。程序通过4层循
用一次; 2.有些数字组合不能是表达式的值为 24)
任务要求
1.程序产生四个随机的数字(在 1-13 之间),由用户计算 24 点 2.用户输入四个数字(在 1-13 之间),由程序计算 24 点
1 张凤琴,张青凤.数据结构学习指导与习题详解,清华大学出版社,2007
2 严蔚敏,吴伟民.数据结构(C 语言版). 清华大学出版社,2008
if(expression[index][1]!=1) {
push(&OPND, c); index++; c=expression[index][0]; } // 不是运算符则进栈 else { switch ( precede((char)gettop(&OPTR), (char)c) ) { case '<': // 栈顶元素优先权低
○2 模块划分
3
Main()
游戏介绍 人算24点 程序算24点
用户输入 算式
用户认为无法 算出24点
程序验证,输出正确或 错误信息,用户继续玩
程序验证,若能算出24 点,则输出正确算式
计算24点并输出算 式
无法算出24点,输 出错误信息
3 运行环境
硬件环境:PC机 软件环境:Windows XP
Microsoft Visual C++ 6.0
和三个运算符赋值(CalcArray1(int iNumInput[2][4]))----计算算式的
值(CalcOneExpress(int expression[][2]))---验证是否等于24---输出
结果:
代码1.
// a * b * c * d 7 个字符
6
int CalcArray1(int iNumInput[2][4]) {
4 Visual C++ 6.0 编程语言:C语言
5 详细设计
(1)全局变量和栈,链表的定义 int number[2][4]; enum{ eNumber = 0,//操作数 eOperator = 1//算子 };
4
int oper[7]={43,45,42,47,40,41,35};
expression[0][1]=eNumber; expression[2][1]=eNumber; expression[4][1]=eNumber; expression[6][1]=eNumber; for (ii=0;ii<4;ii++) {
for (jj=0;jj<4;jj++) {
for (kk=0;kk<4;kk++)
课本 表3.1 算符间的优先关系: unsigned char Prior[7][7] = {
'>','>','<','<','<','>','>', '>','>','<','<','<','>','>', '>','>','>','>','<','>','>', '>','>','>','>','<','>','>', '<','<','<','<','<','=',' ', '>','>','>','>',' ','>','>', '<','<','<','<','<',' ','=' };
相关文档
最新文档