前言:室友考试检查挂了,上次是网上找的代码,这次补考我帮他准备好代码
今天周四,周日前完成。
要求实现:一元n次多项式的加减乘,输出结果存文件,相当于log。需要用链表。
思路:
用户输入 2x^5 + 3x^7 * 2x^0 - x^3
输出 -x^3 + 2x^5 + 6x^7
使用双向链表来读入一个式子中的每一项,前一项连接后一项。每一个项里包含系数,次数,项数,三个属性。
因为优先级,必须先做乘法运算。乘法运算系数直接相乘,指数直接相加。两项相运算,结果覆盖第一项,free掉后一项,链表整体缩短。
做完所有乘法运算,遍历链表,按次数进行排序,遍历检查若有相同次数的,即可进行加或减运算,依然是上述算法,覆盖前一项,链表缩短。
最后输出结果。并将输入和输出的字符串保存至文件
分析上述方法,可能遇到的问题和需要的方法:不要考虑过多的输入错误的情况了,用户必须严格按照格式输入,使用较大的字符数组装整个字符串,遍历
存储结构成员,运算符号直到NIL。寻找乘法符号,进行运算,这里注意把第二项的运算符号成员赋值到新输出的项。算完所有乘法排序,算加减法。
实际操作发现,细节上还有很多问题,处理字符串输入很麻烦,用了很不美观的方法完成了切片操作。能成功读入存到链表就好了。
//对输入字符串的处理
for (; *str_ptr != '\0'; str_ptr++) {
//循环查找关键字符,然后使用/0进行切片
if (*str_ptr == 'x') {
*str_ptr = '\0';
strcpy_s(tmp_str, num_ptr);
int num = atoi(tmp_str);
insert_coef(num);
term = nil->prev;
}
if (*str_ptr == '^') {
num_ptr = str_ptr + 1;
}
if (*str_ptr == '+' ||
*str_ptr == '-' ||
*str_ptr == '*') {
*(str_ptr - 1) = '\0';
strcpy_s(tmp_str, num_ptr);
term->freq = atoi(tmp_str);
term->op = *str_ptr;
num_ptr = str_ptr + 2;
}
}
//末尾项的处理
strcpy_s(tmp_str, num_ptr);
term->freq = atoi(tmp_str);
term->op = ' ';
输出结果测试后,发现还要处理输出
- 系数为1,读取有问题或不打印的情况
- 系数为0,需要free掉
- 次数为0,需要不显示x
- 次数为1,需要不显示^1
- 测试项数次数为-,-1的情况
处理完后的字符串,系数不可能为0,首先判断是否为1或-1。
对于符号的处理,最后还要加一项判断,如果对于除第一项以外的任意项系数为负数,则要看他前一项包含的运算符是什么,是正,则变为负,并把该项系数改为正,是负,则变正,并把该项系数改为负,最后输出时就不用考虑系数带符号情况.
写到老后面发现我把op存做后一个操作符真是智障到住了的操作
同学下学期才能重修了,保留这次作业
网友评论