标签:
/功能:由随机数决定出题为10个以内的数字,并确定是否出现括号(仅限一对),顺序输出表达式,并用栈的方式进行计算,判断正误。其他功能有待进一步实现。
//头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
//栈的结构体
typedef struct stack
{
double * e;
int zd;
}bds_stack;
//声明函数
void InitStack(bds_stack ** s,int n);
int Push_stack(bds_stack * s,double t);
void Pop_stack(bds_stack * s,double * t);
double Opt_num();
void Cal(int n);
void yxj_table();
//定义全局变量
int yxj[7][7];
bds_stack * dz,* tz;
//主函数
int main()
{
int num;
int c = 0,p,s;
double r,ans,r1,r2,r3;
int * d,* t;
int p1,p2; //存储出现括号的下标
int m,n,f; //分别记录数组d、t的下标
int i,j,k;
yxj_table(); //初始化优先级数组
scanf("%d",&num);
srand(time(NULL)); //随机数种子
for(i = 0;i < num;i++)
{
m = 0;n = 0;f = 0;
while(c == 1||c == 0)
{
c = rand()%10; //数字字符
}
s = rand()%2; //是否出现括号
if(s == 1) //确定字符总数
{
p = c + 1;
}
else
{
p = c - 1;
}
printf("%d %d %d\n",c,p,s);
d = (int * )malloc(sizeof(int)*c);
t = (int * )malloc(sizeof(int)*p);
InitStack(&dz,c);
InitStack(&tz,p);
Push_stack(tz,0); //0为‘#’
for(j = 0;j < c;j++)
{
d[j] = rand()%100; //数字为两位数
}
if(s == 1)
{
p1 = rand()%(p-2)+1;
p2 = rand()%(p-p1-1)+1+p1+1;
p1--; p2--; //下标
t[p1] = 5;
t[p2] = 6;
}
for(j = 0;j < p;j++)
{
if(s == 1)
{
if(j == p1||j == p2)
continue;
}
t[j] = rand()%4+1;
}
j = 0;
if(t[n] == 5)
{
printf("(");
Push_stack(tz,t[n]);
n++;
j++;
}
for(;j < (c+p);) //输出表达式
{
if(f == 0)
{
printf("%d",d[m]);
Push_stack(dz,d[m]);
m++; j++;
if(t[n] == 6)
{
printf(")");
while(yxj[(int)tz->e[tz->zd-1]][t[n]] != 2)
{
if(yxj[(int)tz->e[tz->zd-1]][t[n]] == 1)
{
r = Opt_num();
Push_stack(dz,r);
}
else
{
printf("出错!\n");
return 1;
}
}
Pop_stack(tz,&r);
n++; j++;
}
f = 1;
}
else
{
if(t[n] == 1)
{
printf("+");
Cal(t[n]);
}
if(t[n] == 2)
{
printf("-");
Cal(t[n]);
}
if(t[n] == 3)
{
printf("*");
Cal(t[n]);
}
if(t[n] == 4)
{
printf("/");
Cal(t[n]);
}
n++;j++;
if(t[n] == 5)
{
printf("(");
Push_stack(tz,t[n]);
n++; j++;
}
f = 0;
}
}
printf(" = ?\n");
while((yxj[(int)(tz->e[tz->zd-1])][0]) != 2)
{
r = Opt_num();
Push_stack(dz,r);
}
scanf("%lf",&ans);
if(ceil(fabs(r-ans)) == 0)
{
printf("right!!\n");
}
else
{
printf("false!!\n");
}
}
return 0;
}
//初始化优先级表
void yxj_table()
{
int i,j;
yxj[0][0] = 2;
yxj[0][6] = 3; yxj[5][0] = 3;
for(i = 0,j = 1;j <= 5;j++)
{
yxj[i][j] = 0;
}
yxj[6][0] = 1;
for(i = 1;i <= 4 ;i++)
{
for(j = 0;j <= 2;j++)
{
yxj[i][j] = 1;
}
}
for(i = 5,j = 1;j <= 4;j++)
yxj[i][j] = 0;
for(i = 6,j = 1;j <= 4;j++)
yxj[i][j] = 1;
for(i = 1;i <= 2;i++)
{
for(j = 3;j <= 5;j++)
{
yxj[i][j] = 0;
}
}
for(i = 3;i <= 4;i++)
{
for(j = 3;j <= 4;j++)
{
yxj[i][j] = 1;
}
}
yxj[3][5] = 0; yxj[4][5] = 0;
for(j = 6,i = 1;i <= 4;i++)
{
yxj[i][j] = 1;
}
yxj[5][6] = 2;
yxj[5][5] = 3; yxj[6][5] = 3; yxj[6][6] = 3;
}
//初始化栈
void InitStack(bds_stack ** s,int n)
{
*s = (bds_stack*)malloc(sizeof(bds_stack));
(*s)->e = (double*)malloc(sizeof(double)*n);
(*s)->zd = 0;
}
//入栈
int Push_stack(bds_stack * s,double t)
{
int q;
s->e[s->zd] = t;
q = s->zd;
s->zd++;
return q;
}
//出栈
void Pop_stack(bds_stack * s,double * t)
{
(*t) = s->e[--(s->zd)];
}
//字符出栈计算
double Opt_num()
{
double num1,num2,opt;
Pop_stack(dz,&num2);
Pop_stack(tz,&opt);
Pop_stack(dz,&num1);
if(opt == 1)
{
return num1 + num2;
}
if(opt == 2)
{
return num1 - num2;
}
if(opt == 3)
{
return num1 * num2;
}
if(opt == 4)
{
return num1 / num2;
}
return 0;
}
//优先级比较
void Cal(int n)
{
double r;
int k;
while(yxj[(int)(tz->e[tz->zd-1])][n] != 0)
{
if(yxj[(int)(tz->e[tz->zd-1])][n] == 1)
{
r = Opt_num();
Push_stack(dz,r);
}
else
{
printf("出错!\n");
}
}
Push_stack(tz,(double)n);
}
标签:
原文地址:http://www.cnblogs.com/huloveIT/p/5918292.html