俺是一个c语言初入学习者,本程序是学校要求的程序设计课,跟大家分享,请多指教。(程序写的较快,思维简单,请多包涵)
程序设计要求
(1) 计算机随机给出 4 个 1-13 的数值(以扑克牌为例,模拟扑克牌的点数);
(2) 用户根据这四个数,输入能算出 24 的表达式(只能用加、减、乘、除及括号
组成的四则运算);
(3) 计算机检验用户给出的表达式正确与否(包括是否用计算机所给出的四张牌);
(4) 计算机根据该表达式计算出值,判断用户的表达式是否正确。
实现方式
1、由于要求要用数据结构的知识,在计算四则运算时,用到栈的操作。
这里我用一个数组存储操作数,一个栈存储操作符,先将操作数 则放入操作数数组,在存入操作符的时候,注意操作符栈顶元素,如果放入操作符优先级高,则将栈顶放入操作数栈,如果读入右括号则将在左括号之前的操作符出栈,最后将操作符栈出栈,放到操作数数组中,完成中缀表达式变成后缀表达式。然后再对后缀表达式求值
//************************************中缀表达式变成后缀表达式******//
while (str[s] != '\0')
{
if (str[s] > '0'&&str[s] <= '=')//如果是操作数 则放入操作数栈 1~13
M1[i++]=str[s++];
else if (str[s] == '(' || str[s] == '+' || str[s] == '-' || str[s] == '*' || str[s] == '/' || str[s] == ')')
{
if ( str[s] == '*' || str[s] == '/')//看栈顶的优先级
{
if (!IsEmpty(M2))
{
while (Top(M2) == '*'|| Top(M2) == '/')
{
M1[i++]=Top(M2); //如果放入操作符优先级高,则将栈顶放入操作数栈
Pop(M2);
if (IsEmpty(M2))
break;
}
}
Push(str[s], M2);
s++;
}
else if ( str[s] == '-' || str[s] == '+')//看栈顶的优先级
{
if (!IsEmpty(M2))
while (Top(M2) == '*'|| Top(M2) == '/')
{
M1[i++] = Top(M2); //如果放入操作符优先级高,则将栈顶放入操作数栈
Pop(M2);
if (IsEmpty(M2))
break;
}
Push(str[s], M2);
s++;
}
else if(str[s] == '(')
Push(str[s++], M2);
else if (str[s] == ')') //如果读入右括号则将在左括号之前的操作符出栈
{
while (Top(M2) != '(')
{
M1[i++] = Top(M2);
Pop(M2);
}
s++;
}
}
}
2、随机数产生
用rand()这个函数,虽然时一个伪随机数的产生函数,但是多次调用后,可以实现随机。
rand() % 13 + 1 我们从这里规定产生的随机数为最小是1,最大为13
int i, j;
int **a = (int **)malloc(M * sizeof(int *));
for (i = 0; i < M; i++)
a[i] = (int *)malloc(N * sizeof(int));
srand((unsigned)time(NULL));
for (i = 0; i < M; ++i) {
Random_four1(a[i], N);
for (j = 0; j < N; ++j);
//printf("%3d ", a[i][j]);
//printf("\n");
}
return a[0];
3、界面控制台
1、改变控制台背景颜色
system(“color E0”); 设置背景为黄色
2、控制键盘光标 选择选项
4、运用穷举法的方法进行列举各种表达式,判断产生的四位随机数可否完成24点。
已知bug,无法接收超过两位数(乱输入一堆数字会卡斯哈哈哈)