纪念一下,目前写过的最长的程序,比上次作业题airport还长(๑╹◡╹)ノ"""
现在写完了,回想一下也不难,比起难度还是繁琐多一点。
不过做程序员就是要细心啊,再繁琐也不能出错。
所以做完这个感觉自己离成为程序员又近了一步,撒花✿✿ヽ(°▽°)ノ✿
下面进入正题。
题目
写一个程序,功能如下:
输入下列一个指令,实现所描述的功能:
[ ? ] 读入一个多项式,这个多项式包含一个含x的单项式和一个常数项,常数项可以为0。
[ + ] 对栈中最上面的两个多项式做加法,并把结果再压入栈中。
[ - ] 对栈中最上面两个元素做减法,并把结果再压入栈中。
[ * ] 取出栈顶多项式,再输入一个多项式,做乘法,结果压入栈中。
[ = ] 展示栈顶元素。
[ q ] 退出程序。
运行示例:
①功能索引,我选择 [ ? ] —— 读入一个多项式。
②我在这里先输入了 x^2+3 。
③ 再选择[ ? ] ,读入了 2x^2 。
④ 选择[ + ], 让刚读入的两个多项式做加法,把结果压入栈。
⑤ 选择[ * ],取出栈顶多项式,与我现在输入的 7x^3 做乘法,把结果压入栈。
代码&思路
一.从大方向上看,多项式的存储用链表。栈中元素类型是链表头指针。
多项式是由一个个单项式组成的,对于同一个未知数而言,单项式特征值只有倍数和指数。
所以链表结点定义如下:
struct xiang{
double beishu;
int degree;
struct xiang * next;
};
二. 实现这个程序所示的功能,我用到了如下函数:
①打印索引,无需赘述。
void print_introductions();
void print_introduction_1();
②创建一个多项式。
struct xiang* creat_a_term();
③打印多项式。
void show_the_term(struct xiang *head);
④做运算的函数,返回值是储存计算结果多项式的链表的头指针。
struct xiang* add_two_terms(struct xiang *head1, struct xiang *head2);
struct xiang* minus_two_terms(struct xiang *head1, struct xiang *head2);
struct xiang* multiply_two_terms(struct xiang *head1, struct xiang *head2);
⑤用于化简多项式的函数,把指数相同的项合并。
void simplify(struct xiang *head);
三.函数具体讲解,以及我遇到的问题。
①创建一个多项式。
(因为题目中输入的多项式最多只有两项,所以这是个只有两个结点的链表)
注意不要忘记把后一个结点的next指针设置成NULL!
我一开始忘记了,结果后面调用show_the_term函数的时候程序会异常退出。找了好久才找到orz…
struct xiang * creat_a_term(){
struct xiang *head=(struct xiang*)malloc(sizeof(struct xiang));
printf("coefficient?");
scanf("%lf",&head->beishu);
printf("exponent?");
scanf("%d",&head->degree);
head->next=(struct xiang*)malloc(sizeof(struct xiang));
printf("coefficient?");
scanf("%lf",&head->next->beishu);
if(head->next->beishu==0)
{
head->next->degree=0;
head->next->next=NULL; /**这个地方易出错**/
return head;
}
else{
printf("exponent?");
scanf("%d",&head->next->degree);
if((head->next->degree)!=0)
{
printf("Bad exponent: Polynomial terminates without its last term.\n")