工程实践《一元多项式的加减乘和求导》源代码

// 测试.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <stdlib.h>
//以下是函数声明******************************************************************************
struct JG *creat(void);                             //创建结构体链表
void jiemian_1();                                   //界面
void jiemian_2();        //界面—2
void displayJG(struct JG *head);                    //输出一元多项式最终的计算结果 参数是链表的头指针
void paixu(struct JG *head);                        //递增排序函数(按指数从小到大的顺序):入口参数:链表的头指针,此为链表中的排序函数
struct JG *hebin(struct JG *head);                  //合并指数相同节点的系数
void chuli(struct JG *head);        //如果进行减法运算的话,把第二个多项式每一项的系数变成其相反数
struct JG *ADD(struct JG *head_1,struct JG *head_2);//进行相加运算
void jia_jian(int x);        //判断相加还是相减的函数
void xiangcheng();        //进行相乘的运算
void xiancheng();        //整个程序的线程
void save(struct JG *head,int cs); //保存一元多项式
void qiudao(); //求导函数
//**********************************************************************************************
#define LEN sizeof(struct JG)
///程序所用的结构体
struct JG
{
float xishu;//储存系数
int zhishu;//储存指数
struct JG *next;
};
///程序的主函数
int main()
{
jiemian_1();//界面一
xiancheng();//程序的执行线程
jiemian_2();//界面二
return 0;
}
///程序的线程//
void xiancheng()
{
int i=9;
while(1)//程序线程
{
printf("\n请输入要执行的操作,只能输入一个数字,谢谢!\n");//操作提示
printf("请输入您的选择: ");


scanf("%d",&i);
getchar();


switch(i)
{
case 1:jia_jian(1),printf(" \n****结果已保存于“结果保存.txt”中!****\n");break;
case 2:jia_jian(2),printf(" \n****结果已保存于“结果保存.txt”中!****\n");break;
case 3:xiangcheng(),printf(" \n****结果已保存于“结果保存.txt”中!****\n");break;
case 4:qiudao(),printf(" \n****结果已保存于“结果保存.txt”中!****\n");break;
case 0:break;
default:printf("********请按照提示操作,谢谢!*******\n");break;
}
if(i==0)
break;
}
}
///创建结构体链表//
struct JG *creat(void)
{
struct JG *head;
struct JG *p1,*p2;
int n=0;
p1=p2=(struct JG *)malloc(LEN);
printf("请输入第1项的系数和指数:输入0结束!谢谢!\n");
scanf("%f %d",&p1->xishu,&p1->zhishu);
head=NULL;
while(p1->xishu != 0)
{
n++;
if(n == 1)head = p1;
else p2->next = p1;
p2=p1;
p1=(struct JG *)malloc(LEN);
printf("请输入第%d项的系数和指数:输入0结束!谢谢!\n",n+1);
scanf("%f %d",&p1->xishu,&p1->zhishu);
}
p2->next=NULL;
return (head);
}
///程序的欢迎界面//
void jiemian_1()
{
printf("\t/\n");
printf("\t//           欢迎使用,一元多项式计算器            //\n");
printf("\t//     1:多项式相加             2:多项式相减       //\n");
printf("\t//     3:多项式相乘             4:多项式求导       //\n");
printf("\t//***************** 0:退出程序 ********************//\n");
printf("\t/\n");
}
///程序的结束界面//
void jiemian_2()
{
printf("\n");
printf("\t**********************谢谢使用***********************\n");
printf("\t**************       强子 5201314      **************\n");
}
///输出多项式的
void displayJG(struct JG *head)//输出一元多项式最终的计算结果 参数是链表的头指针
{
struct JG *p1,*p2;
p2 = head;
//判断第一个多项式
if(p2->zhishu == 1)
printf("%.2fX",p2->xishu);
else if(p2->zhishu >0)
printf("%.2fX^%d",p2->xishu ,p2->zhishu);
else if(p2->zhishu <0)
printf("%.2fX^(%d)",p2->xishu ,p2->zhishu);
else 
printf("%.2f",p2->xishu);
p1=p2->next;
while(p1 != NULL)//循环判断 输出后面的多项式
{
p2 = p1;
if(p2->xishu >0)
{
if(p2->zhishu == 1)
printf("+%.2fX",p2->xishu); 
else if(p2->zhishu < 0)
printf("+%.2fX^(%d)",p2->xishu ,p2->zhishu);
else if(p2->zhishu >0)
printf("+%.2fX^%d",p2->xishu,p2->zhishu);
else 
printf("+%.2f",p2->xishu);
}
else
{
if(p2->zhishu == 1)
printf("%.2fX",p2->xishu);
else if(p2->zhishu >0)
printf("%.2fX^%d",p2->xishu ,p2->zhishu);
else if(p2->zhishu <0)
printf("%.2fX^(%d)",p2->xishu ,p2->zhishu);
else 
printf("%.2f",p2->xishu);
}
p1 = p2->next;
}
printf("\n");
}
///对多项式进行排序
void paixu(struct JG *head)//递增排序函数(按指数从小到大的顺序):入口参数:链表的头指针,此为链表中的排序函数
{
struct JG *p1,*p2;
int temp;
float temp_1;
for(p1=head;p1!=NULL;p1=p1->next)
{
for(p2=p1->next;p2!=NULL;p2=p2->next)
{
if(p1->zhishu>p2->zhishu)
{
temp=p1->zhishu;  //交换指数,
p1->zhishu=p2->zhishu;
p2->zhishu=temp;


temp_1=p1->xishu;  //交换系数
p1->xishu=p2->xishu;
p2->xishu=temp_1;
}
}
}
}
///合并多项式//
struct JG *hebin(struct JG *head)//合并指数相同节点的系数
{
struct JG *p1,*p2;
p1=head;
p2=p1->next;
while(p2)
{
if(p1->zhishu==p2->zhishu)
{
p1->xishu +=p2->xishu;
p1->next=p2->next;
}
else
p1=p1->next;
p2=p2->next;
}
//以下的程序是用来删除系数为零的项的;
p1=head;
p2=NULL;
while(head->xishu==0)//删除首节点系数为零的节点
{
head=p1->next;
p1=p1->next;
if(p1==NULL)
break;//到链表尾 退出
}
if(p1!=NULL)
p2=p1->next;
while(p2)
{
if(p2->xishu==0)
{
p1->next=p2->next;
p2=p2->next;
}
else 
{
p1=p1->next;
p2=p2->next;
}
}
return (head);
}
///对多项式进行处理
void chuli(struct JG *head)//如果进行减法运算的话,把第二个多项式每一项的系数变成其相反数
{
while(head)
{
head->xishu=-head->xishu;
head=head->next;
}
}
///链接多项式//
struct JG *ADD(struct JG *head_1,struct JG *head_2)
{
struct JG *p;
if(head_1==NULL)
return head_2;
else
{
p=head_1;
for(;p->next !=NULL;p=p->next );
p->next=head_2;
return head_1;
}
}
///判断多项式加减//
void jia_jian(int x)//多项式相加减的流程 参数控制加法还是减法。
{
struct JG *xiang_1,*xiang_2,*p;
printf("请输入第一个一元多项式,只输入系数和指数,用空格隔开!\n");
xiang_1 = creat();
save(xiang_1,x);
printf("请输入第二个一元多项式,只输入系数和指数,用空格隔开!\n");
xiang_2 = creat();
save(xiang_2,x);
if(xiang_2==NULL)
p=xiang_1;
else
{
//判断相加减。
if(x==1)
p=ADD(xiang_1,xiang_2);
else
{
chuli(xiang_2);
p=ADD(xiang_1,xiang_2);
}
}
//对结果进行排序
paixu(p);
//合并指数相同的项
p=hebin(p);
//对结果进行分析
if(p!=NULL)
{
printf("结果:\n");
displayJG(p);
}
else
{
printf("结果为零!\n");
}
save(p,x);
}
///相乘的函数//
void xiangcheng()
{
struct JG *xiang_1,*xiang_2;
struct JG *p1,*p2,*p3,*p4;
struct JG *xiang_3;//储存相乘的结果
printf("请输入第一个一元多项式,只输入系数和指数,用空格隔开!\n");
xiang_1 = creat();
save(xiang_1,3);
printf("请输入第二个一元多项式,只输入系数和指数,用空格隔开!\n");
xiang_2 = creat();
save(xiang_2,3);
if(xiang_1==NULL)
printf("结果为零!\n");
else if(xiang_2==NULL)
printf("结果为零!\n");
else
{
//下面程序是多项式相乘的代码
for(p1=xiang_1;p1!=NULL;p1=p1->next)
{
for(p2=xiang_2;p2!=NULL;p2=p2->next)
{
p3=(struct JG *)malloc(LEN);
p3->xishu=p1->xishu *p2->xishu;
p3->zhishu=p1->zhishu +p2->zhishu;
if((p1==xiang_1)&&(p2==xiang_2))
{
xiang_3=p4=p3;
p4->next=NULL;
}
else
{
p4->next=p3;
p4=p3;
p4->next=NULL;
}
}
}
//对结果进行排序
paixu(xiang_3);
//合并指数相同的项
xiang_3=hebin(xiang_3);
//对结果进行分析
if(xiang_3!=NULL)
{
printf("结果:\n");
displayJG(xiang_3);
}
else
{
printf("结果为零!\n");
}
}
save(xiang_3,3);
}
///保存
void save(struct JG *head,int cs)
{
FILE* fp;
static int i=2;
i++;
if(cs==5)
return;
fp=fopen("结果保存.txt","a");
if(i%3==0)//以下是提示使用程序的次数
{
fprintf(fp,"第%d次使用该程序!",i/3);
switch(cs)
{
case 1:fputs("多项式相加:\n",fp);break;
case 2:fputs("多项式相减:\n",fp);break;
case 4:fputs("多项式求导:\n",fp);break;
default :fputs("多项式相乘:\n",fp);break;
}
}//结束
if(cs==4)
{
switch(i%3)
{
case 0:fputs("求导的多项式:",fp);break;
case 1:fputs("求导的多项式:",fp);break;
default:
if(head==NULL)
fputs("结果为零!\n",fp);
else
fputs("结果:",fp);
}
}
else
{
switch(i%3)
{
case 0:fputs("第一个多项式:",fp);break;
case 1:fputs("第二个多项式:",fp);break;
default:
if(head==NULL)
fputs("结果为零!\n",fp);
else
fputs("结果:",fp);
}
}
while(head)//保存一元多项式
{
if(head->xishu>0)
fprintf(fp,"+%.2f",head->xishu);
else
fprintf(fp,"%.2f",head->xishu);
if(head->zhishu>0)
fprintf(fp,"X^%d",head->zhishu );
else if(head->zhishu <0)
fprintf(fp,"X^(%d)",head->zhishu );
head=head->next;
}
fprintf(fp,"\n");
if(i%3==2)
fprintf(fp,"\n");
}
///求导///
void qiudao()
{
struct JG *xiang,*p1,*p2;
printf("请输入要求导的多项式,只输入系数和指数,用空格隔开!\n");
xiang=creat();// 创建一元多项式链表
save(xiang,4);//保存原多项式
save(xiang,5);//占位
//以下进行求导运算
p1=xiang;
p2=p1->next;
while(p2)//首先删除多项式中的常数项
{
if(xiang->zhishu ==0)
{
xiang=p1->next;
p1=xiang;
p2=p1->next;
}
else if(p2->zhishu ==0)
{
p1->next=p2->next;
p2=p2->next;
}
else
{
p1=p1->next;
p2=p1->next;
}
}
p1=xiang;
while(p1)//求导
{
p1->xishu =p1->xishu*p1->zhishu;
p1->zhishu =p1->zhishu -1;
p1=p1->next;
}
paixu(xiang);
xiang=hebin(xiang);
displayJG(xiang);
save(xiang,4);
}
C

C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值