一元多项式加减乘求导微分简单运算

这篇博客介绍了如何进行一元多项式的加减乘及求导微分操作,提供了主要的代码实现,并展示了实际运行效果。读者可以通过提供的项目下载链接进一步了解和使用这些代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要代码

/****************************************************
  @title: 数据结构实验
  @name:<试验> 一元多项式简单计算器
  @object:
      [实验目的]
           单链表的存储结构及其基本操作的实现 
      [实验提示]
          1. 在linklist.h中实现单链表的基本操作 
          2.在Polynomial.h中实现了一元多项式的基本操作
          3.在Polynomial.h中编写代码,进行测试
          4.在MutualPlat.h中编写一交互式的运行平台
  @include:
      ds.h [*]
          单链表的实现 
  @author: wangheng
  @date: 3 / 4 / 2017
  ***************************************************/
#define  Number  2.0

#include <stdio.h>
#include <stdlib.h>
#include "MutualPlat.h"

int main()
{
    printf("是否进行运算(Y/N): ");
    char command;
    polynomial P1;
    polynomial P2;
    read(command);
    while(command == 'Y')
    {
        run();           //运行程序
        printf("是否进行运算(Y/N): ");
        readM(command);
    }
    return 0;

}
/*
   Name: LinkList.h
   Author: WangHeng
   Data: 3 / 4 / 2017 ;
   Description: 1)建立一个交互式的平台,实现创建和运行运算的功能
                2)调用一元多项式的头文件Polynomial.h,进行调用

*/

#ifndef MUTUALPLAT_H_INCLUDED
#define MUTUALPLAT_H_INCLUDED

//////////////////////////////////////////
//应用的头文件
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

#include "ds.h"
#include "Polynomial.h" 
///////////////////////////////////////////

//输入函数:调用一元多项式的CreatPolyn()函数进行输入
void input (polynomial& P)
{
//1)输入第一个一元多项式各项
    printf("\n输入一个一元多项式的各项系数和指数[当输入的系数和指数为:(0 0) 时,输入结束]\n");
    CreatPolyn(P);
    //打印输出一元多项式P1
    PrintPolyn(P);
    //输出一元多项式的项数
    printf("一元多项式的项数: %d\n",PolynLength(P));
}

//运算方法清单
void CaculateMenu()
{
    printf("选择你想进行的运算方法:[A](add),[S](substract),[M](multiply),\n[D](Derivative),[C](Calculus)---");

}

//输入运算命令
Status GetCommand(char& way)
{
    printf("\n运算方法为:");
    readM(way);
    printf("\n");
    return OK;
}
//交互式运行平台
void run( )
{
    char way;
    polynomial P1;
    polynomial P2;
    //3)选择运算方法
    CaculateMenu();
    GetCommand(way);
    switch(way)
    {
    case 'A' :          //两个一元多项式的和
    case 'a':
        input(P1);          //输入一元多项式的各项
        input(P2);
        AddPolyn(P1,P2);
        //打印输出和
        printf("打印输出和:\n");
        PrintPolyn(P1);
        break;
    case  'S' :       //两个一元多项式的差
    case 's':
        input(P1);          //输入一元多项式的各项
        input(P2);

        SubtractPolyn(P1,P2);
        //打印输出差
        printf("打印输出差:\n");
        PrintPolyn(P1);
        break;
    case  'M' :        //两个一元多项式的积
    case 'm':
        input(P1);          //输入一元多项式的各项
        input(P2);

        MultiplyPolyn(P1,P2);   
        
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <windows.h> typedef struct polynomial { //数据结构 float coef; //系数coefficient int expo; //指数exponent struct polynomial * next; } Poly; void menu() { //用户菜单选择界面 printf("\n" "\t*****************************************************************\n" "\n" "\t******************** 请选择操作 ********************\n" "\n" "\t******** 1.给上个x变量赋值,显示计算结果 ********\n" "\n" "\t******** 2.一元多项式相加 ********\n" "\n" "\t******** 3.一元多项式相减 ********\n" "\n" "\t******** 4.一元多项式 ********\n" "\n" "\n" "\t******** 0.退出计算器 ********\n" "\n" "\t*****************************************************************\n" "\n" "\t 您需要执行的是:"); } void insert(Poly *head, Poly *input) { //将一个结点按 指数从大到小顺序 插入到一个链表中 Poly *pre, *now;//记录一个结点和它的下一个结点 int signal = 0;//标记是否结束插入的循环 pre = head;//先令pre为头链表 if (pre->next == NULL) {//如果只有头链表 pre->next = input;//就把input插到头结点的下一个 } else { //非空链表 now = pre->next;//令now为pre的下一个 while (signal == 0) { if (input->expo < now->expo) { //如果要插入的链表的指数小于now的,那么 if (now->next == NULL) {//如果now的之后没有结点,就把input插到now后面,也就是链表最后 now->next = input; signal = 1;//令结束标志成立,从而这次结束退出循环,插入完成 } else { //如果now后有结点,就把pre和now结点各往后移动一个,然后开始一个新的比较 pre = now; now = pre->next; } } else if (input->expo > now->expo) { //如果要插入的链表的指数大于now的,那么将input插入到pre和now之间 input->next = now; pre->next = input; signal = 1;//令结束标志成立,从而这次结束退出循环,插入完成 } else { //如-果要插入的链表的指数等于now的,那么将input的系数和now的合并 now->coef = now->coef + input->coef;//合并系数 signal = 1;//令结束标志成立,从而这次结束退出循环,插入完成 free(input);//合并后就可以删除input内存,释放空间 if (now->coef == 0) {//如果系数正负相加抵消,就删除now结点 pre->next = now->next; free(now); } } } } } Poly *creat(char ch) { //建立多项式 Poly *head, *input;//建立头结点和一个输入结点 float x;//暂时存放系数 int y;//暂时存放指数 int n = 1;//存放多项式次数 head = (Poly *)malloc(sizeof(Poly));//分配头结点内存 head->next = NULL;//初始化next //友好化输入提示 给系数和指数赋值 printf("\n%c(x)的第%d项式系数:", ch, n); scanf("%f", &x);//给系数赋值 while (x != 0) {//如果系数不为0(系数为0即代表结束),就不停地增加新结点并赋值后合并入链表 //友好化输入提示 给系数和指数赋值 printf("%c(x)的第%d项式指数:", ch, n++); scanf("%d", &y);//给指数赋值 printf("\n"); input = (Poly *)malloc(sizeof(Poly)); input->coef = x; input->expo = y; input->next = NULL; insert(head, input); //友好化输入提示 给系数和指数赋值 printf("%c(x)的第%d项式系数:", ch, n); scanf("%f", &x);//给系数赋值 } return head;//返回链表的头结点 } Poly *add(Poly *head, Poly *pre) { //多项式相加 Poly *input; int flag = 0; //下面这段原理是将第二个链表中的结点一个个合并到第一个链表中,即为相加 while (flag == 0) { if (pre->next == NULL) flag = 1; else { pre = pre->next; input = (Poly *)malloc(sizeof(Poly)); input->coef = pre->coef; input->expo = pre->expo; input->next = NULL; insert(head, input); } } return head;//返回第一个链表(合并后的链表)的头结点 } Poly *minus(Poly *head, Poly *pre) { //多项式相减 Poly *input; int flag = 0; //这里和相加类似,只是把每个系数取相反数 while (flag == 0) { if (pre->next == NULL) flag = 1; else { pre = pre->next; input = (Poly *)malloc(sizeof(Poly)); input->coef = 0 - pre->coef; input->expo = pre->expo; input->next = NULL; insert(head, input); } } return head; } /** *head1 *head2 两个要相一元多项式链表 return 返回一个相结果的一元多项式(积) */ Poly *multiply(Poly *head1, Poly *head2) { //多项式 Poly *input, *product, *pre; int flag = 0;//flag为是否结束 相步骤循环 的判断条件 product = (Poly *)malloc(sizeof(Poly));//分配一元多项式 空间 product->next = NULL; head1 = head1->next;//现将第一个链表定位到它的第一个值部分 pre = head2; //相原理为:先取第一个链表第一个,然后将第二个链表中的每个和它相,将积合并入product链表中 //然后再取第一个链表第二个,重复前面步骤,直至全部结束. while (flag == 0) { if (head1 == NULL) {//如果第一个链表元素取尽,结束 flag = 1; continue; } if (pre->next == NULL) {//如果第二个链表元素取尽,第一个链表取下一个,再重一遍 pre = head2; head1 = head1->next; continue; } pre = pre->next; input = (Poly *)malloc(sizeof(Poly));//分配新结点存储相结果,并用于合并入积链表 input->coef = pre->coef*head1->coef;//多项式系数为两系数相 input->expo = pre->expo + head1->expo;//多项式指数为两指数相加 input->next = NULL;//初始化next insert(product, input);//合并入积链表 } return product;//返回积 } double calcu(Poly *head, double x) { Poly *s; //多项式 double sum = 0, n; int i; s = head->next;//头结点下一个 while (1) { n = 1; for (i = 0; i < s->expo; i++)//指数运算 n = n * x; sum += n * s->coef;//叠加 if (s->next == NULL) { return sum; } else s = s->next; } } void print(Poly *fun) {//用来输出一元多项式 Poly *printing; //创立用于遍历链表的结点 int flag = 0;//判定是否继续print的标记 float ex0 = 0;//计算常数 printing = fun->next; if (fun->next == NULL) {//如果是空链表,就输出0 printf("0\n"); return; } while (flag == 0) { if (printing->coef > 0 && printing->expo != 0 && fun->next != printing)//fun->next != printing用来判断是否为第一个结点 printf("+"); if (printing->expo != 0) { if (printing->coef == 1);//如果系数是1,就不输出系数 else if (printing->coef == -1) printf("-");//如果系数-1,系数就只输出负号 else printf("%.3f", printing->coef);//如果不是以上情况,就正常输出系数的值 if (printing->expo > 0) printf("x^%d", printing->expo);//如果指数>0,输出x^ 然后加上指数的值 else printf("x^%d ", printing->expo);//如果指数<0,输出x^ 然后加上指数的值,再加个空格 } else if (printing->expo == 0) //如果指数为0,常数增加 ex0 += printing->coef; if (printing->next == NULL) { if (ex0 != 0) { printf("+%.3f", ex0);//最后输出常数 } flag = 1; } else printing = printing->next; } printf("\n"); } int main() { Poly *f, *g;//创立了两个结构体指针 int sign = -1;//记录选了菜单的第几个 int start = 0;//记录是否之前进行过计算 char flag = 'N';//判断是否继续操作 int flagg = 0;//判断是否继续操作 system("color f0"); while (sign != 0) {//不是选了退出的话 menu();//显示开始菜单页面 scanf("%d", &sign);//记录菜单选择 switch (sign) {//进入选项的对应功能 case 0: break;//0就退出 case 1: { double val = 0; if (start != 0) { printf("\n请输入上个结果x的值:"); scanf("%lf", &val); val = calcu(f, val); printf("\n赋值后上个式子结果是:%lf\n", val); } else { system("cls"); printf("\n 错误!没有之前运算结果!请先进行一次运算!\n"); Sleep(1500); } break; } case 2: { system("cls"); printf("PS:输入格式:系数 指数;当输入系数为0时结束!\n"); printf("PS:输入格式:系数 指数;当输入系数为0时结束!\n\n"); printf("开始多项式相加:\n"); if (flagg == 1) { printf("上个结果f(x)="); print(f); } if (flagg == 0) { f = creat('f'); printf("f(x)="); print(f); } g = creat('g'); printf("g(x)="); print(g); printf("--------------------\n\n"); printf("两个多项式相加结果为:\n\n"); printf(" F(x)=f(x)+g(x)="); f = add(f, g); print(f); printf("\n--------------------\n"); sign = -1; start = 1; getchar(); printf("\n是否以结果为一个多项式继续操作?(Y/N):"); scanf("%c", &flag); if (flag == ('Y' | 'y')) { flagg = 1;//标记为继续操作 } else if (flag == ('N' | 'n')) { flagg = 0;//标记为继续操作 } printf("\n已记录您的选择,将在下次操作时生效"); break; } case 3: { system("cls"); printf("PS:输入格式:系数 指数;当输入系数为0时结束!\n"); printf("PS:输入格式:系数 指数;当输入系数为0时结束!\n\n"); printf("开始多项式相减:\n"); if (flagg == 1) { printf("上个结果f(x)="); print(f); } if (flagg == 0) { f = creat('f'); printf("f(x)="); print(f); } g = creat('g'); printf("g(x)="); print(g); printf("--------------------\n\n"); printf("两个多项式相减结果为:\n\n"); printf(" F(x)=f(x)-g(x)="); f = minus(f, g); print(f); printf("\n--------------------\n"); sign = -1; start = 1; getchar(); printf("\n是否以结果为一个多项式继续操作?(Y/N):"); scanf("%c", &flag); if (flag == ('Y' | 'y')) { flagg = 1;//标记为继续操作 } else if (flag == ('N' | 'n')) { flagg = 0;//标记为继续操作 } printf("\n已记录您的选择,将在下次操作时生效"); break; } case 4: { system("cls"); printf("PS:输入格式:系数 指数;当输入系数为0时结束!\n"); printf("PS:输入格式:系数 指数;当输入系数为0时结束!\n\n"); printf("开始多项式:\n"); if (flagg == 1) { printf("上个结果f(x)="); print(f); } if (flagg == 0) { f = creat('f'); printf("f(x)="); print(f); } g = creat('g'); printf("g(x)="); print(g); printf("--------------------\n\n"); printf("两个多项式结果为:\n\n"); printf(" F(x)=f(x)*g(x)="); f = multiply(f, g); print(f); printf("\n--------------------\n"); sign = -1; start = 1; getchar(); printf("\n是否以结果为一个多项式继续操作?(Y/N):"); scanf("%c", &flag); if (flag == ('Y' | 'y')) { flagg = 1;//标记为继续操作 } else if (flag == ('N' | 'n')) { flagg = 0;//标记为继续操作 } printf("\n已记录您的选择,将在下次操作时生效"); break; } default: { printf("无效指令:请重新选择操作!\n"); system("cls"); break; } } } printf("\n\t***********************\n"); printf("\t* 即将退出!谢谢使用! *\n"); printf("\t***********************\n"); printf("3s后退出\n"); Sleep(1000); printf("2s后退出\n"); Sleep(1000); printf("1s后退出\n"); Sleep(1000); return 1; }给这段代码补充一个一元多项式求导的函数
最新发布
06-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值