美文网首页
2018-09-05 c语言帮同学写一元n次多项式工程实践

2018-09-05 c语言帮同学写一元n次多项式工程实践

作者: 魔人健太郎 | 来源:发表于2020-02-14 17:41 被阅读0次

前言:室友考试检查挂了,上次是网上找的代码,这次补考我帮他准备好代码


今天周四,周日前完成。


要求实现:一元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. 系数为1,读取有问题或不打印的情况
  2. 系数为0,需要free掉
  3. 次数为0,需要不显示x
  4. 次数为1,需要不显示^1
  5. 测试项数次数为-,-1的情况

处理完后的字符串,系数不可能为0,首先判断是否为1或-1。
对于符号的处理,最后还要加一项判断,如果对于除第一项以外的任意项系数为负数,则要看他前一项包含的运算符是什么,是正,则变为负,并把该项系数改为正,是负,则变正,并把该项系数改为负,最后输出时就不用考虑系数带符号情况.

写到老后面发现我把op存做后一个操作符真是智障到住了的操作


同学下学期才能重修了,保留这次作业

相关文章

网友评论

      本文标题:2018-09-05 c语言帮同学写一元n次多项式工程实践

      本文链接:https://www.haomeiwen.com/subject/aywtgftx.html