要求学生运用数据结构基本原理、计算机高级程序设计语言和相关工具,分析并求解符号计算领域中的一元多项式运算问题,实现一元多项式的加法、减法、乘法、求值、求导、求积分等运算。
目标:
1.能够采用恰当的逻辑结构表示任意次幂的一元多项式,能基于逻辑结构设计一元多项式运算的算法;
2.能够选择恰当的存储结构,高效地存储稀疏多项式;
3.能够运用程序设计语言实现一元多项式相关运算;
4.能够设计典型测试用例测试算法实现的正确性。
任务:
1.分析一元多项式运算的需求,设计表示一元多项式的逻辑结构,定义相应的抽象数据类型,包括各类一元多项式运算的算法;
2.面向高效存储和处理一元多项式的需要,调研或设计多种存储方案,分析不同方案的优缺点,并形成结论;
3.结合选定的存储结构,实现一元多项式的加、减、乘、求值、求导等运算的算法;
4.设计实验,随机生成10组不同规模(所含项数)的一元多项式,分析一元多项式各项运算的时间消耗与多项式规模之间的关系,并绘制实验结果图表。
实验要求:
功能要求
1)随机生成任意次幂、任意项数的一元多项式,写入文件;
2)从文件读入一元多项式,指定两个多项式并完成各种运算,将运算结果写入文件,以便检查;
3)记录基本操作次数并测量一元多项式各种运算的时间消耗。
预习要求
1)观看实验教学视频,完成预习任务,撰写预习报告;
2)学习相关视频,掌握文件处理技术、随机数使用技术、时间测量等基本技术;
3)分析一元多项式的问题,设计其逻辑结构,定义抽象数据类型以及相关算法,并描绘所有算法的伪代码和流程图;
4)调研或设计多种存储方案,分析不同存储方案在存储密度、算法效率、实现难度以及其它方面的优势和不足,并形成结论,为开展算法实现、实验测试奠定基础;
5)采用高级程序设计语言,实现相关算法,并为评估算法正确性和效率设计恰当的测试数据并开展实验。
分析测试要求
1)随机生成不同长度、不同形态的多个一元多项式;
2)从文件读取随机生成的多组一元多项式对,并指定其完成某一类运算,并将运算过程写入文件,以便检查;
3)从文件读入随机生成的不同规模的多项式对,分别开展运算,测量并记录问题规模和运算的时间效率,并绘制实验结果图表,获得有效结论。
代码实现:里面有文件操作,伪分布随机数生成,时间函数使用,结构体使用等等,全部代码由本人手写,希望各位不要抄袭,仅供参考学习,不要用于非法用途
#include
#include
#include
#include
#include
#define MAX 10 //定义随机数的次数
#define MAX_INDEX 500 //定义最大可以随机的指数
#define MAX_VALUE 20 //定义最大可以随机的系数
#define MAX_Line 1024 //定义缓冲区长度
int data[MAX]; //定义全局存储数组,用来解释10个一元多项式的指数
int Index[MAX_INDEX],Value[MAX_INDEX*MAX_INDEX];
typedef struct node
{
int index; //定义指数
int value; //定义系数
struct node *next; //定义指针
} node,*Linklist;
void Initlist(Linklist *L) //初始化//
{
(*L)=(Linklist)malloc(sizeof(node));
(*L)->index=0;
(*L)->value=0;
(*L)->next=NULL;
}
void Init_File()
{
FILE *fp_clear_add,*fp_clear_subtract,*fp_clear_mult,*fp_clear_Derivative;
fp_clear_add=fopen("加.txt","w");
fp_clear_subtract=fopen("减.txt","w");
fp_clear_mult=fopen("乘.txt","w");
fp_clear_Derivative=fopen("导数.txt","w");
fprintf( fp_clear_add, "当前全为全新数据(运算结果数据有问题是正常现象,说明空间有脏数据,不影响统计,如果负数前有+号不用担心,证明就是负数)\n");
fclose(fp_clear_add);
fprintf( fp_clear_subtract, "当前全为全新数据(运算结果数据有问题是正常现象,说明空间有脏数据,不影响统计,如果负数前有+号不用担心,证明就是负数)\n");
fclose(fp_clear_subtract);
fprintf( fp_clear_mult, "当前全为全新数据(运算结果数据有问题是正常现象,说明空间有脏数据,不影响统计,如果负数前有+号不用担心,证明就是负数)\n");
fclose(fp_clear_mult);
fprintf( fp_clear_Derivative, "当前全为全新数据(运算结果数据有问题是正常现象,说明空间有脏数据,不影响统计,如果负数前有+号不用担心,证明就是负数)\n");
fclose(fp_clear_Derivative);
}
void created(Linklist *L,int index) //创建单循环链表
{
node *s,*r;
r=*L;
int i=1;
//尾插法创建
while(i<=index)
{
s=(Linklist)malloc(sizeof(node));
s->index=Index[i];
s->value=Value[i];
r->next=s;
r=s;
i++;
}
r->next=NULL;
}
void Write_File() //创建txt文件函数
{
FILE *fpWrite; //文件指针用来存储文件
fpWrite=fopen("一元多项式.txt","w");
srand((unsigned)time(NULL)); //调用种子函数使每次的随机数不一样
for(int i=0; inext;
while (p)
{
printf("%dx%d", p->value,p->index);
if(p->next!=NULL)
{
printf("+");
}
p = p->next;
}
printf("\n");
}
void Read_File(int p)
{
FILE *fpRead;
fpRead=fopen("一元多项式.txt","r");
char buf[MAX_Line]; //缓冲区
int len;
if(fpRead==NULL)
{
printf("该txt文件为空,无法读取\n");
return;
}
int sum=0,i=0; //定义需要跳跃的行数
for(i=0; inext;
q=L2->next;
r=*L3;
while(p!=NULL||q!=NULL)
{
//尾插法创建
s=(Linklist)malloc(sizeof(node));
if(p!=NULL)
{
s->value+=p->value;
p=p->next;
}
if(q!=NULL)
{
s->value+=q->value;
q=q->next;
}
s->index=i;
r->next=s;
r=s;
i++;
}
r->next=NULL;
}
void subtract(Linklist L1,Linklist L2,Linklist *L3)
{
int i=1,N,M; //迭代器
Linklist p,q;
node *s,*r;
p=L1->next;
q=L2->next;
r=*L3;
while(p!=NULL||q!=NULL)
{
N=0,M=0;
//尾插法创建
s=(Linklist)malloc(sizeof(node));
if(p!=NULL)
{
N+=p->value;
p=p->next;
}
if(q!=NULL)
{
M+=q->value;
q=q->next;
}
s->index=i;
s->value=N-M; //直接进行相减,默认为多项式L1-多项式L2
r->next=s;
r=s;
i++;
}
r->next=NULL;
}
void mult(Linklist L1,Linklist L2)
{
int N=0,M=0;
Linklist p,q;
p=L1->next;
while(p!=NULL)
{
q=L2->next;
while(q!=NULL) //采用类似于笛卡尔积的形式进行计算
{
N=p->value;
M=p->index;
N*=q->value;
M+=q->index;
Value[M]+=N;
q=q->next;
}
p=p->next;
}
}
void mult_create_L3(Linklist *L3)
{
int Flag=MAX_INDEX*MAX_INDEX;
Linklist s,r;
r=*L3;
for(int i=0;iindex=i;
s->value=Value[i]; //将当前的值进行赋值
r->next=s;
r=s;
}
}
r->next=NULL;
}
void Derivative(Linklist L1) //默认对L1进行求导
{
int N=0,M=0;
Linklist p;
p=L1->next;
while(p!=NULL)
{
N=p->index;
M=p->value;
Value[N-1]+=N*M; //按照公式求导
p=p->next;
}
}
void Derivative_create_L3(Linklist *L3) //这里的赋值过程和上面乘法赋值过程一样
{
int Flag=MAX_INDEX*MAX_INDEX;
Linklist s,r;
r=*L3;
for(int i=0;iindex=i;
s->value=Value[i]; //将当前的值进行赋值
r->next=s;
r=s;
}
}
r->next=NULL;
}
void Write_File_L3(Linklist L3,int num,int flag,double timeover)
{
FILE *fpWrite; //文件指针用来存储文件
if(flag==1)
{
fpWrite=fopen("加.txt","a"); //使用模式a不进行覆盖
fprintf( fpWrite, "当前为第%d次操作,相加后的值为:\n", num);
}else if(flag==2){
fpWrite=fopen("减.txt","a"); //使用模式a不进行覆盖
fprintf( fpWrite, "当前为第%d次操作,相减后的值为:\n", num);
}else if(flag==3){
fpWrite=fopen("乘.txt","a"); //使用模式a不进行覆盖
fprintf( fpWrite, "当前为第%d次操作,相乘后的值为:\n", num);
}else if(flag==4){
fpWrite=fopen("导数.txt","a"); //使用模式a不进行覆盖
fprintf( fpWrite, "当前为第%d次操作,求导后的值为:\n", num);
}
Linklist p; //设置参数来进行迭代
p = L3->next;
while (p)
{
fprintf( fpWrite, "%dx%d", p->value, p->index);
if(p->next!=NULL)
{
fprintf( fpWrite, "+");
}
p = p->next;
}
fprintf( fpWrite, "\n");
fprintf( fpWrite, "\n本次操作耗费的时间%lf\n", timeover);
fclose(fpWrite); //关闭文件存储状态
}
int main()
{
memset(Value,0,sizeof(Value));
memset(Index,0,sizeof(Index));
memset(data,0,sizeof(data)); //初始化所有用到的数组
Linklist L1,L2,L3; //创建需要用到的链表L1,L2,L3,L3主要用做运算时候用,并且进行初始化
clock_t begin,over; //设置时间函数来判断每个方法的性能
double timeover; //记录时间总和
Initlist(&L1);
Initlist(&L2);
Initlist(&L3);
Init_File(); //消除所有a模式的txt文件数据
Write_File(); //将数据写入文件
printf("请输入您当前需要挑选的n次多项式,分别为下面所示:\n");
for(int i=0; i
代码运行的问题可以私聊我账号,切记不要抄袭!!!