一次自我挑战的尝试(虽然没成功)
于2023/12/7
项目原型
目前结果
我花了很长时间在这个项目上,但是很明显效果不是很好,所以说我承认我现在暂时无法完成这么一个项目。
无法完成,但是也有收获。
我的逻辑是设定两个数组,一个是符号数组,一个是数字数组;
然后通过打印可以得到类似的结果。
但是我无法正确处理负数的逻辑。
在我这种思路下,我甚至无法计算出这个算式的正确值,因为我无法设计一个算法,使得它能够正确处理乘除符号比加减符号更优先。
我也考虑了括号的加入,但我只能在printf之中有用,至于计算正确的结果则十分困难。
基于AI
我问了gpt,但是gpt给出的逻辑明显是错误的。它将符号一个一个处理,或者先处理乘除,但显然这很复杂,因为逻辑不好处理。也许GPT-4能完成这个任务。
额外收获
我知道命令行参数的使用(虽然没有在本代码表现出来,因为本代码的主体逻辑就有问题);
我在CSDN上阅读了一些基于c语言的四则运算相关处理,得知解决符号运算优先的解决办法之一是将操作数和操作符进行考虑的思想。这其中涉及到栈的处理,以我现在的能力还无法达到。
类似项目原文
失败代码
我还是将代码放出。这是吃了算法思想不足的亏。也许继续依照这个逻辑写下去能够写出来,但是现在我是无法做到。
12/8更新
通过查看舍友@罗乙又的算法,我知道了如何在现阶段处理这个算式。
我们先计算乘除法,然后将result值赋为乘除法结果,然后令进行计算的两个数和一个运算符消失(将前一个数计为0,后一个数设为result,中间的运算符计为'+'即可,这样不会影响原运算)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 9
//交换函数
void swap(int* xp, int* yp) {
int temp = *xp;
*xp = *yp;
*yp = temp;
}
// 生成随机整数(1-N)
int GRNumber(void) {
return rand() % N + 1;
};
// 生成随机运算符
char GROperator()
{
char operators[] = { '+', '-', '*', '|' };//"|"代表“÷”;
int index = (rand()) % 4;
return operators[index];
}
// 生成随机四则运算表达式
void GRExpression() {
char o[3];//储存3个运算符的一维数组
int num[4];//储存4个随机数字的一维数组
int pbracket = GRNumber() % 3 + 1;
num[0] = GRNumber();
o[0] = GROperator();
num[1] = GRNumber();
o[1] = GROperator();
num[2] = GRNumber();
o[2] = GROperator();
num[3] = GRNumber();
if (0)//先禁用括号
{
switch (pbracket)
{
case 1:
printf("(%d %c %d) %c %d %c %d = ?\n", num[0], o[0], num[1], o[1], num[2], o[2], num[3]);
break;
case 2:
printf("%d %c (%d %c %d) %c %d = ?\n", num[0], o[0], num[1], o[1], num[2], o[2], num[3]);
break;
case 3:
printf("%d %c %d %c (%d %c %d) = ?\n", num[0], o[0], num[1], o[1], num[2], o[2], num[3]);
break;
}
}
else
{
int testresult = 0;
printf(" %d %c %d %c %d %c %d = ?\n", num[0], o[0], num[1], o[1], num[2], o[2], num[3]);//检测用
// 先处理乘法和除法
for (int i = 0; i < 3; i++) {
if (o[i] == '*' || o[i] == '|')
{
switch (o[i])
{
case '*':
testresult =testresult+num[i]*num[i+1];
break;
case '|':
testresult /= num[i + 1];//如果有除法,统一变成真分数的算法;
break;
}
}
}
for (int i = 0; i < 3; i++) {
if (o[i] == '+' || o[i] == '-') {
switch (o[i]) {
case '+':
testresult += num[i + 1];
break;
case '-':
testresult -= num[i + 1];
break;
}
if (testresult < 0) {
o[i] = '+';
testresult = 0;
break;
}
}
}
printf(" %d %c %d %c %d %c %d = ?\n", num[0], o[0], num[1], o[1], num[2], o[2], num[3]);//正常版本。
}
}
int main()
{
srand(time(NULL));
GRExpression();
return 0;
}