一元多项式计算器 (c语言数据结构实验)
班级 : ****
学号 : 201907020633
姓名 : ***
实验机号: A3
实验日期 :2020.12.04
报告日期 :2020.12.07
实验题目:一元多项式计算器
一、概述
此次实验实现的功能有:
1.多项式加法
2.多项式减法(poly1-poly 2)
3.多项式乘法
4.多项式求值
5.多项式求导
6.多项式求不定积分
亮点:
对于运行中产生的数据文件如生成的多项式,运行结果,操作次数以及运行时间的存储,存储方式为仿系统日志文件的模式进行记录。方便对生成数据的分析以及对于错误数据的筛查和追溯。每次运行结果都会产生时间戳,保证数据的可靠性。
二、实验方案
1.设计方案
存储方案: 链式存储(方便插入和删除,顺序存储的插入和删除需要移动大量的数据,造成许多不必要的时间消耗)
实验逻辑:
在poly 1.txt和poly 2.txt文件中生成随机数。
当程序开始运行时数据被读入程序,同时被写入log.txt中作以记录。
继而进行下一步操作,如加减法、乘法、求值、求导、求不定积分。
执行完运算操作之后,将运算结果同时输出至屏幕和log.txt文件中。
如果需要继续执行,则将poly 1.txt和ploy 2.txt文件中的数据擦除,并重复上述操作。
2.函数调用关系
3.关键算法实现
- 创建多项式文件
思想:运用文件操作,生成随机数存储入poly 1.txt和poly 2.txt中。
控制生成项数在指定范围内(即,rand()%11),尽量保持运算结果和生成数据方便分析,避免因为数据过大,无法及时发现计算中出现的错误。
void creat()
{
char s1[20]="poly 1.txt", s2[20]="poly 2.txt";
srand((int)time(0));
int n1 = rand()%10+1;
FILE *fp1=fopen(s1,"w");
for (int i=1;i<=n1;i++)
{
if (i==1)
fprintf(fp1,"%d", rand()%11);
else fprintf(fp1," %d", rand()%11);
}
fclose (fp1);
int n2=rand()%10+1;
FILE *fp2=fopen(s2,"w");
for (int i=1;i<=n2;i++)
{
if (i==1)
fprintf(fp2,"%d", rand()%11);
else fprintf(fp2," %d", rand()%11);
}
fclose (fp2);
}
- 从文件中读入数据,生成多项式
思想:运用feof,当文件中数据未被完全读入程序中时,保持运行。
且如果指数相同时,系数相加。
PolyPtr getPoly (char *filename)
{
PolyPtr poly=NULL,p;
FILE *fp=fopen (filename,"r");
if (!fp) return poly;
poly= (PolyPtr)malloc(sizeof(Poly)) ;
poly->coef=0;
poly->expn=0;
poly->next=NULL;
while (!feof(fp))
{
p= (PolyPtr)malloc(