C语言多项式求导程序结果异常修正与单次执行终止实现咨询
解决多项式导数程序的两个问题
首先,我们来看原程序的核心功能:它接收多项式的「系数-幂次」对,输出其导数对应的「系数-幂次」对。针对你提到的两个问题,我会在尽量保留原代码结构的基础上给出针对性修改方案。
修改后的完整代码
#include<stdio.h> /*input: 3 4 -5 2 6 1 -2 0 output:12 3 -10 1 6 0*/ /*input: 6 0 output:0 0*/ /*input: 0 0 output:0 0*/ int main(){ int a,b; int flag=0; char line[1024]; // 读取一行输入,按下回车即停止执行 if (fgets(line, sizeof(line), stdin) == NULL) { printf("0 0"); return 0; } int pos = 0; int read_len; // 解析当前行内的所有系数-幂次对 while (sscanf(line + pos, "%d %d%n", &a, &b, &read_len) == 2) { pos += read_len; // 仅处理导数项系数非零的情况,避免无效的0项输出 if (b != 0 && a * b != 0) { if(flag==0)printf("%d",a*b); else printf(" %d",a*b); printf(" %d",b-1); flag=1; } } // 若没有任何有效导数项,输出标准的0多项式表示 if(flag==0)printf("0 0"); return 0; }
关键改动说明
1. 实现「按下一次回车后停止执行」
原程序用while(scanf(...) != EOF)会持续等待输入直到遇到系统结束符(比如Ctrl+D或Ctrl+Z),我们通过以下逻辑修改:
- 用
fgets读取整行输入,用户按下回车后就会停止读取操作; - 搭配
sscanf的%n格式符,记录每次读取的字符长度,通过pos += read_len移动解析位置,逐对处理行内的所有数字对,确保一次输入完成后程序就停止。
2. 修复「输入‘6 0’或‘0 0’时无法输出预期‘0 0’」的问题
原程序的潜在问题是会输出无效的0系数项(比如输入0 5时会输出0 4,数学上这类0项没有意义),我们新增了a*b != 0的判断:
- 对于
6 0:b=0不进入处理分支,flag保持为0,最终触发if(flag==0)输出0 0; - 对于
0 0:同样不会进入处理分支,最终也输出0 0,完全符合预期; - 对于包含有效项的输入(比如
3 4 -5 2),只会输出非零的导数项,避免冗余内容。
如果你的需求是:即使原输入包含常数项,导数结果也要额外输出0 0(比如输入3 4 6 0时要输出12 3 0 0),可以去掉b != 0的判断,改为在处理常数项时手动输出0 0,但通常多项式表示中会省略这类多余的0项。
内容的提问来源于stack exchange,提问作者ansley77777723
相关产品推荐
相关产品推荐

