计算机技术基础(c语言)课程设计 巧算二十四点牌
车辆购置税计算器-
计算机技术基础课程设计
C
语言
设计报告
题目:
巧算二十四点牌
计算一个后缀表达式的值比计算中缀表达式的值要简洁得多,这是由于后
缀表
达式中既无括号,又不管运算符的优先级,具体做法如下:使用一个栈,
从左到右扫描表
达式,每遇到一个操作数就送入栈
1
中保护,每遇到一个运算<
/p>
符号就从栈
1
中取出栈顶的两个操作数进
行计算,然后将计算结果推入栈
1
中,
如果继续扫描直到表达式最后一个运算符处理完毕,这是送入栈顶的值就是该
后缀表达式
的值。
一、选题背景:
< br>“
速算
24
“扑克游戏是个流行
的数字运算游戏。它的规则是由系统发出
4
张扑克牌,用户利用
扑克牌的数字及运算符号“
+
”
,
p>
“
-
”
,
“
*
”
,
“
/
”组成一个计
算表达式
。扑克有四个花色,每个花色有
13
张牌,所以定义一个字符型
二维数
组表示扑克牌,牌的面值用字符表示,花色通过它的行下标体现,四行代表四
p>
个花色。
二、
设计思想:
系统首先显示四张扑克牌
,扑克牌的显示要在图形方式下实现,然后用户
输入计算表达式,也就是一个字符串,这
个表达式按照我们平常书写表达式的
习惯书写,运算符号在运算数的中间,称为中缀表达
式,为便于区分数字,每
个整数数字设一个结尾符号‘
.
’
,表达式输入完毕按回车键开始处理,将该计算
表达式转换为等价的后缀表达式。所谓等价的含义是指表达式的计算顺序和结
果完全
相同。在后缀表达式中不再引入括号,运算符在两个运算对象的后面,
再利用后缀表达式
求值。
例如牌数为
2
、
3
、
8
、
6
,
输入运算表达式
3.*(8.
-2.)+6.
,
程序先将其转换为后缀表达式
3.8.2.-*6.+
,然后计算出表达式值,如果不加区分
字符’
.
‘,后缀表达式为
3
82-*6+
,是不能确定运算数的。中缀表达式转换为后
<
/p>
缀表达式的关键问题是去括号,确定计算顺序。如果把一个中缀表达式中所有
的计算顺序
都按计算规则用嵌套括号的形式表示出
来,这一过程就要清楚的多。例如
前缀表达式
3.*(8.-2
.)+6
,
改写为
((3.*(8.-
2.))+6.)
,
这时可以看出
,<
/p>
只要将每对括号
中的运算符号移到相应括号的后面,再删去所有括
号,便得到与之等价的后缀
表达式
3.8.2.-*6.+
p>
。为了将中缀表达式转换成等价的后缀表达式,需要从左到右
扫描中
缀表达式,并使用栈
2
来存放表达式中的开括号“
(
”和暂时不能确定计
算次序的运算符号。
1
三、程序流程图:
开始
调用<
/p>
play
进行图
形初始化
输入表达式字符串
s1
调用
change
< br>函数将中缀表
达式变后缀<
/p>
s
表达式
调用
computer
函数计算表达式
的值,返回结果
result
。
假
真
Result
==24
输
调
用
text
出
”very goog
!
!
!
”
调
用
p>
text
出
”
wr
ong!!!
”
输
2
真
是否继续
假
结束
四、程序清单
:
#define N 20
#define COL 100
#define ROW
40
#include
#include
#include
#include
#include
#include
#include
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);
3
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(
printf(
printf(
printf(
scanf(
change(s1,s);/*
将中缀表达式转换为后缀表达式
*/
res
ult=computer(s);/*
计算表达式值
*/
if(result==24)
text1(
else
text1(
printf(
scanf(
if(ch=='n'||ch=='N')
break;
}
close();
return;
}
void
rand1(int j)
4
{
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,
case
1:setcolor(BLACK);sprintf(str,
case
2:setcolor(RED);sprintf(str,
case
3:setcolor(BLACK);sprintf(str,
}
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,
outtextxy(COL+j*100-5,ROW+100-5,str);
}
else
{
sprintf(str,
outtextxy(COL+j*100-6,ROW+100-5,str);
}
}
void play(void)
{
int j;
for(j=0;j<4;j++)
{
bar(COL+j*100-3
5,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);
}
5