计算机技术基础(c语言)课程设计 巧算二十四点牌
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机技术基础课程设计
C语言
设计报告
题目:巧算二十四点牌
计算一个后缀表达式的值比计算中缀表达式的值要简洁得多,这是由于后缀表达式中既无括号,又不管运算符的优先级,具体做法如下:使用一个栈,从左到右扫描表达式,每遇到一个操作数就送入栈1中保护,每遇到一个运算符号就从栈1中取出栈顶的两个操作数进行计算,然后将计算结果推入栈1中,如果继续扫描直到表达式最后一个运算符处理完毕,这是送入栈顶的值就是该后缀表达式的值。
一、选题背景:
“速算24“扑克游戏是个流行的数字运算游戏。
它的规则是由系统发出4张扑克牌,用户利用扑克牌的数字及运算符号“+”,“-”,“*”,“/”组成一个计算表达式。
扑克有四个花色,每个花色有13张牌,所以定义一个字符型二维数组表示扑克牌,牌的面值用字符表示,花色通过它的行下标体现,四行代表四个花色。
二、设计思想:
系统首先显示四张扑克牌,扑克牌的显示要在图形方式下实现,然后用户输入计算表达式,也就是一个字符串,这个表达式按照我们平常书写表达式的习惯书写,运算符号在运算数的中间,称为中缀表达式,为便于区分数字,每个整数数字设一个结尾符号‘.’,表达式输入完毕按回车键开始处理,将该计算表达式转换为等价的后缀表达式。
所谓等价的含义是指表达式的计算顺序和结果完全相同。
在后缀表达式中不再引入括号,运算符在两个运算对象的后面,再利用后缀表达式求值。
例如牌数为2、3、8、6,输入运算表达式3.*(8.-2.)+6.,程序先将其转换为后缀表达式3.8.2.-*6.+,然后计算出表达式值,如果不加区分字符’.‘,后缀表达式为382-*6+,是不能确定运算数的。
中缀表达式转换为后缀表达式的关键问题是去括号,确定计算顺序。
如果把一个中缀表达式中所有的计算顺序
都按计算规则用嵌套括号的形式表示出来,这一过程就要清楚的多。
例如前缀表达式3.*(8.-2.)+6,改写为((3.*(8.-2.))+6.),这时可以看出,只要将每对括号中的运算符号移到相应括号的后面,再删去所有括号,便得到与之等价的后缀表达式3.8.2.-*6.+。
为了将中缀表达式转换成等价的后缀表达式,需要从左到右扫描中缀表达式,并使用栈2来存放表达式中的开括号“(”和暂时不能确定计算次序的运算符号。
三、程序流程图:
四、程序清单:
#define N 20
#define COL 100
#define ROW 40
#include "stdio.h"
#include "time.h"
#include "graphics.h"
#include "alloc.h"
#include "stdlib.h"
#include "string.h"
#include "ctype.h"
char p[4][13]={
{'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}, {'A','2','3','4','5','6','7','8','9','0','J','Q','K'}}; typedef struct node
{
int data;
struct node *link;
}STACK1;
typedef struct node2
{
char data;
struct node2 *link;
}STACK2;
void init(void);
void close(void);
void play(void);
void rand1(int j);
void change(char *e,char *a);
int computer(char *s);
STACK1 *initstack1(STACK1 *top);
STACK1 *push(STACK1 *top,int x);
STACK1 *pop(STACK1 *top);
int topx(STACK1 *top);
STACK1 *ptop(STACK1 *top,int *x);
int empty(STACK1 *top);
STACK2 *initstack2(STACK2 *top);
STACK2 *push2(STACK2 *top,char x);
STACK2 *pop2(STACK2 *top);
char topx2(STACK2 *top);
STACK2 *ptop2(STACK2 *top,char *x);
int empty2(STACK2 *top);
int text1(char *s);
main()
{
char s[N],s1[N],ch;
int i,result;
int gdriver,gmode;
clrscr();
init();
while(1)
{
setbkcolor(BLACK);
cleardevice();
play();/*图形初始化*/
gotoxy(1,15);
printf("-------------------------------Not-----------------------------\n");
printf(" Please enter express accroding to above four number\n");
printf(" Format as follows:2.*(3.+4.+5.)\n");
printf("-----------------------------------------------------------------\n");
scanf("%s%c",s1,&ch);
change(s1,s);/*将中缀表达式转换为后缀表达式*/
result=computer(s);/*计算表达式值*/
if(result==24)
text1("very good");
else
text1("wrong!!!");
printf("Continue (y/n)?\n");
scanf("%c",&ch);
if(ch=='n'||ch=='N')
break;
}
close();
return;
}
{
int kind,num;
char str[3],n;
randomize();
while(1)
{
kind=random(4);
num=random(13);
if(p[kind][num]!=-1)
{
n=p[kind][num];
p[kind][num]=-1;
break;
}
}
switch(kind)
{
case 0:setcolor(RED);sprintf(str,"%c",3);break;
case 1:setcolor(BLACK);sprintf(str,"%c",3);break;
case 2:setcolor(RED);sprintf(str,"%c",4);break;
case 3:setcolor(BLACK);sprintf(str,"%c",5);break;
}
settextstyle(0,0,2);
outtextxy(COL+j*100-30,ROW+100-46,str);
outtextxy(COL+j*100+16,ROW+100+32,str);
if(n!='0')
{
settextstyle(0,0,3);
sprintf(str,"%c",n);
outtextxy(COL+j*100-5,ROW+100-5,str);
}
else
{
sprintf(str,"%d",10);
outtextxy(COL+j*100-6,ROW+100-5,str);
}
}
void play(void)
{
int j;
for(j=0;j<4;j++)
{
bar(COL+j*100-35,ROW+100-50,COL+j*100+35,ROW+1*100+50);
setcolor(BLUE);
rectangle(COL+j*100-32,ROW+100-48,COL+j*100+32,ROW+100+48);
rand1(j);
delay(10000);
}
void init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc"); cleardevice();
}
void close(void)
{
closegraph();
}
void change(char *e,char *a)
{
STACK2 *top=NULL;
int i,j;char w;
i=0;
j=0;
while(e[i]!='\0')
{
if(isdigit(e[i]))
{
do{
a[j]=e[i];
i++;
j++;
}while(e[i]!='.');
a[j]='.';
j++;
}
if(e[i]=='(')
top=push2(top,e[i]);
if(e[i]==')')
{
top=ptop2(top,&w);
while(w!='(')
{
a[j]=w;
j++;
top=ptop2(top,&w);
}
}
if(e[i]=='+'||e[i]=='-')
{
if(!empty2(top))
{
w=topx2(top);
while(w!='(')
a[j]=w;
j++;
top=pop2(top);
if(empty2(top))
break;
else
w=topx2(top);
}
}
top=push2(top,e[i]);
}
if(e[i]=='*'||e[i]=='/')
{
if(!empty2(top))
{
w=topx2(top);
while(w=='*'||w=='/')
{
a[j]=w;
j++;
top=pop2(top);
if(empty2(top))
break;
else
w=topx2(top);
}
}
top=push2(top,e[i]);
}
i++;
}
while(!empty2(top))
top=ptop2(top,&a[j++]);
a[j]='\0';
}
int computer(char *s)
{
STACK1 *top=NULL;
int i,k,num1,num2,result;
i=0;
while(s[i]!='\0')
{
if(isdigit(s[i]))
{
k=0;
do{
k=10*k+s[i]-'0';
}while(s[i]!='.');
top=push(top,k);
}
if(s[i]=='+')
{
top=ptop(top,&num2);
top=ptop(top,&num1);
result=num2+num1;
top=push(top,result);
}
if(s[i]=='-')
{
top=ptop(top,&num2);
top=ptop(top,&num1);
result=num1-num2;
top=push(top,result);
}
if(s[i]=='*')
{
top=ptop(top,&num2);
top=ptop(top,&num1);
result=num2*num1;
top=push(top,result);
}
if(s[i]=='/')
{
top=ptop(top,&num2);
top=ptop(top,&num1);
result=num1/num2;
top=push(top,result);
}
i++;
}
top=ptop(top,&result);
return result;
}
STACK1 *initstack1(STACK1 *top) {
top=NULL;
return top;
}
STACK1 *push(STACK1 *top,int x) {
STACK1 *p;
p=(STACK1 *)malloc(sizeof(STACK1)); if(p==NULL)
{
exit(0);
}
p->data=x;
p->link=top;
top=p;
return top;
}
STACK1 *pop(STACK1 *top)
{
STACK1 *q;
q=top;
top=top->link;
free(q);
return top;
}
int topx(STACK1 *top)
{
if(top==NULL)
{
printf("Stack is null\n");
return 0;
}
return top->data;
}
STACK1 *ptop(STACK1 *top,int *x)
{
*x=topx(top);
top=pop(top);
return top;
}
int empty(STACK1 *top)
{
if(top==NULL)
return 1;
else
return 0;
}
STACK2 *initstack2(STACK2 *top)
{
top=NULL;
return top;
}
STACK2 *push2(STACK2 *top,char x) {
STACK2 *p;
p=(STACK2 *)malloc(sizeof(STACK2)); if(p==NULL)
printf("memory is overflow\n!!");
exit(0);
}
p->data=x;
p->link=top;
top=p;
return top;
}
STACK2 *pop2(STACK2 *top)
{
STACK2 *q;
q=top;
top=top->link;
free(q);
return top;
}
char topx2(STACK2 *top)
{
if(top==NULL)
{
printf("Stack is null\n");
return'';
}
return top->data;
}
STACK2 *ptop2(STACK2 *top,char *x) {
*x=topx2(top);
top=pop2(top);
return top;
}
int empty2(STACK2 *top)
{
if(top==NULL)
return 1;
else
return 0;
}
int text1(char *s)
{
setbkcolor(BLUE);
cleardevice();
setcolor(12);
settextstyle(1,0,8);
outtextxy(120,120,s); setusercharsize(2,1,4,1);
setcolor(15);
settextstyle(3,0,5);
outtextxy(220,220,s);
getch();
return ;
}
五、主要解决问题的方法及技术关键
本程序主要解决的问题是利用数字和运算符号,系统运算后得出计算结果。
所使用的方法是从键盘输入中缀表达式,然后将中缀表达式转换为后缀表达式,利用后缀表达式求值。
六、设计结果说明。
通过本程序既可以掌握C程序的字符串处理,数学运算,又可以掌握堆栈的概念,堆栈的运算以及应用——算术表达式的编译方法。
程序得出的结果如果等于24,则显示“very good!!!”,否则显示“wrong!!!”接着询问是否继续,按字符n后程序结果,否则系统重复上述步骤。