数据结构课程设计

时间:2024.4.7

一、课程题目:一元稀疏多项式计算器

二、需求分析

1、一元稀疏多项式简单计算器的功能是:

1.1 输入并建立多项式;

1.2 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,………cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;

1.3多项式a和b相加,建立多项式a+b;

1.4 多项式a和b相减,建立多项式a-b。2、设计思路:

2、设计思路:

2.1 定义线性表的动态分配顺序存储结构;

2.2 建立多项式存储结构,定义指针*next

2.3利用链表实现队列的构造。每次输入一项的系数和指数,可以输出构造的一元多项式

2.4演示程序以用户和计算机的对话方式执行,即在计算机终站上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运行命令;    根据相应的输入数据(滤去输入中的非法字符)和运算结果显示在其后。

3、程序执行的命令包括:

1)输入多项式a;2)输入多项式b;3)求a+b;4)求a-b;5)求a*b;6)求a的导数;7)求b的导数;8)退出程序。

4、测试数据:
1、(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7);

2、(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15)

=(-7.8x^15-1.2x^9+12x^-3-x);

3、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5);

4、(x+x^3)+(-x-x^3)=0;

5、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200);

6、(x+x^2+x^3)+0=x+x^2+x^3.

 7、互换上述测试数据中的前后两个多项式

三、概要设计

为了实现上述功能需用带表头结点的单链表存储多项式。为此需要两个抽象的数据类型:线性表和多项式。

1.有序表的抽象数据类型定义为:

ADT List{

数据对象:D={ai|ai∈Elemset,i=1,2,?,n,n≥0} 数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,?,n} 基本操作:

PolyNode *p,*q,*r,*head; 操作结果:构造一个空的线性表。。 Listinsert(&L,i,e)

初始条件:线性表L存在,0≤i≤L的元素个数。 操作结果:在L中第i个位置之后插入新的结点e。

}ADT List

2、多数据类型定义为:

ADT Polynomial {

数据对象:D={ai,bi|ai为不为0的实数,bi为整数,i=2,?,n}

数据关系:R1={ai,bi}

基本操作:

 PrintPolyn(Polyn p)

操作结果:输出多项式p。

 DestroyPolyn(Polyn p)

操作结果:销毁多项式p。

Polyn CreatePolyn(Polyn head,int m)

操作结果:创建一个m项的多项式。

Polyn AddPolyn(Polyn pa,Polyn pb)

初始条件:多项式链表pa,pb存在。

操作结果:创建一新多项式链表p,其结点为pa,pb相加。

Polyn SubtractPolyn(Polyn pa,Polyn pb)

初始条件:多项式链表pa,pb存在。

操作结果:创建一新多项式链表p,其结点为怕pa,pb相减。

ValuePolyn(Polyn head,int x) 

操作结果:输入x值,计算并返回多项式的值

 }ADT Polynomial

四、  详细设计

1、元素类型、结点类型和指针类型

typedef int Status;

typedef struct{

  int coef;

  int expn;

}Term;

typedef Term ElemType;

typedef struct LNode{

     ElemType data;   //数据域

     struct LNode *next;  //指针域

}LNode,* LinkList;

2、 主函数和其他函数

void main()

{

    int   m,n,a,x;

    int flag;

    Polynomial pa,pb,pc;

printf("                            欢迎使用多项式操作程序\n");

   

  //输出菜单

 printf("\n                 1: 创建多项式a               \n");

 printf("\n                 2: 创建多项式b               \n");

 printf("\n                 3: 输出多项式a               \n");

 printf("\n                 4: 输出多项式b               \n");

 printf("\n                 5: 输出a+b                   \n");

 printf("\n                 6: 输出a-b                    \n");

 printf("\n                 7: 输出a的导数                \n");

 printf("\n                 8: 输出b的导数                \n");

 printf("\n                 9: 代入x的值计算a             \n");

 printf("\n                 10: 代入x的值计算b             \n");

 printf("\n                 11: 输出a*b                    \n");

 printf("\n                 12:退出程序                  \n");

 while(a)

   {

        printf("\n请选择操作:");

        scanf(" %d",&flag);       

    switch(flag)

    {

        case 1 :

       {

           printf("请输入a的项数:");

                scanf("%d",&m);

                CreatePolyn(pa,m);

           break;

       }

       case 2 :

       {

           printf("请输入b的项数:");

                scanf("%d",&n);

                CreatePolyn(pb,n);

           break;

       }

        case 3 :

           {

               printf("\n       多项式a=");

               PrintPolyn(pa);

               break;

           }

           case 4 :

           {

               printf("\n       多项式b=");

               PrintPolyn(pb);

               break;

           }

            case 5 :

           {

              AddPolyn(pa,pb,pc);

                    printf("\n       a+b=");

              PrintPolyn(pc);

               break;

           }

            case 6 :

           {

              SubtractPolyn(pa,pb,pc);

                    printf("\n       a-b=");

              PrintPolyn(pc);

              break;

           }

            case 7 :

           {

             Polynomial_derivatePolyn(pa,pc);

             printf("\n       多项式a的导函数为:a'=");

              PrintPolyn(pc);

              break;

           }

            case 8 :

           {

               Polynomial_derivatePolyn(pb,pc);

               printf("\n       多项式b的导函数为:b'=");

              PrintPolyn(pc);

               break;

           }

            case 9 :

           {

               printf("输入x的值:x=");

              scanf("%d",&x);

              printf("\n       x=%d时,a=%.3f\n",x,ValuePolyn(pa,x));

              break;

           }

            case 10 :

           {

              printf("输入x的值:x=");

               scanf("%d",&x);

               printf("\n       x=%d时,b=%.3f\n",x,ValuePolyn(pb,x));

               break;

           }

       

          

            case 11 :

           {

               MultiplyPolyn(pa,pb,pc);

                    printf("\n      a*b=");

              PrintPolyn(pc);

              break;

           }

        case'12':

           {

              printf("\n       感谢使用此程序!\n");

              DestroyPolyn(pa);

              DestroyPolyn(pb);

               a=0;

              break;

           }

            default:

           printf("\n       您的选择错误,请重新选择!\n");

    }

   }

}

3、建立一个头指针为head、项数为m的一元多项式, 建立新结点以接收数据, 调用Insert函数插入结点

Status CreatePolyn(Polynomial &head,int m){  //建立一个头指针为head、项数为m的一元多项式

        int i;

        LNode *p;

        p=head=(Polynomial)malloc(sizeof(struct LNode));

        head->next=NULL;

        for(i=0;i<m;i++){

            p=(Polynomial)malloc(sizeof(struct LNode));   //建立新结点以接收数据

        printf("请输入第%d项的系数与指数:",i+1);

        scanf("%d %d",&p->data.coef,&p->data.expn); 

        Insert(p,head);           //调用Insert函数插入结点

 }

return OK;

}//CreatePolyn

4、求解并建立多项式a+b

Status AddPolyn(Polynomial pa,Polynomial pb,Polynomial &pc){               //求解并建立多项式a+b,返回其头指针

    LNode *qa=pa->next;

    LNode *qb=pb->next;

    LNode *headc,*hc,*qc;

    hc=(Polynomial)malloc(sizeof(struct LNode)); //建立头结点

    hc->next=NULL;

    headc=hc;

    while(qa||qb)

    {

        qc=(Polynomial)malloc(sizeof(struct LNode));

        switch(compare(qa,qb)){

        case 1:

           {

                qc->data.coef=qa->data.coef;

                qc->data.expn=qa->data.expn;

                qa=qa->next;

                break;

           }

        case 0:

           {

                qc->data.coef=qa->data.coef+qb->data.coef;

                qc->data.expn=qa->data.expn;

                qa=qa->next;

                qb=qb->next;

                break;

           }

        case -1:

           {

                qc->data.coef=qb->data.coef;

                qc->data.expn=qb->data.expn;

                qb=qb->next;

                break;

           }

       }

        if(qc->data.coef!=0)

       {

            qc->next=hc->next;

            hc->next=qc;

            hc=qc;

       }

       else free(qc);                   //当相加系数为0时,释放该结点

    }

     pc=headc;

     return OK;

}

5、求解并建立多项式a-b

Status SubtractPolyn(Polynomial pa,Polynomial pb,Polynomial &pc){         //求解并建立多项式a-b,返回其头指针

       LNode *h=pb;

       LNode *p=pb->next;

       LNode *pd,*pf;

       while(p)

    {                                           //将pb的系数取反

        p->data.coef*=-1;

        p=p->next;

    }

    AddPolyn(pa,h,pf);

    pd=pf;

    for(p=h->next;p;p=p->next)                   //恢复pb的系数

        p->data.coef*=-1;

    pc=pd;

    return OK;

}

float ValuePolyn(Polynomial head,int x){        //输入x值,计算并返回多项式的值

       LNode *p;

       int i,t;

       float sum=0;

       for(p=head->next;p;p=p->next)

    {

        t=1;

        for(i=p->data.expn;i!=0;)

       {

            if(i<0){t/=x;i++;}              //指数小于0,进行除法

            else{t*=x;i--;}                 //指数大于0,进行乘法

       }

        sum+=p->data.coef*t;

    }

    return sum;

}

6、求解并建立导函数多项式

Status Polynomial_derivatePolyn(Polynomial P,Polynomial &pc)

//求导

{

       LNode *p,*pf,*ph;//用于遍历结点

       p=P->next;

       ph=(Polynomial)malloc(sizeof(struct LNode));

       ph->next=NULL;

       //pre=P;

       while (p!=NULL)

       {

           pf=(Polynomial)malloc(sizeof(struct LNode));

           if(p->data.expn==0)

           {

              p=p->next;

              //free(p);

              //p=pre->next;

           }

           else

           {

              pf->data.coef=p->data.coef*p->data.expn;

              pf->data.expn=p->data.expn-1;

              Insert(pf,ph);

              p=p->next;

              

           }

       }

       pc=ph;

    return OK;

}

7、求解并建立多项式a*b

Status MultiplyPolyn(Polynomial pa,Polynomial pb,Polynomial &pc){  //求解并建立多项式a*b,返回其头指针

       LNode *hf,*pf;

       LNode *qa=pa->next;

       LNode *qb=pb->next;

       hf=(Polynomial)malloc(sizeof(struct LNode));//建立头结点

       hf->next=NULL;

       for(;qa;qa=qa->next)

    {

        for(qb=pb->next;qb;qb=qb->next)

       {

            pf=(Polynomial)malloc(sizeof(struct LNode));

            pf->data.coef=qa->data.coef*qb->data.coef;

            pf->data.expn=qa->data.expn+qb->data.expn;

            Insert(pf,hf);                    //调用Insert函数以合并指数相同的项

       }

    }

    pc=hf;

    return OK;

}

8、函数的调用关系图

四、    调试分析

5.1 运行该程序的操作平台: 

 5.1.1 硬件要求:

       此程序需在一台PC机上运行,要用INTER或AMD的CPU,其他没多大要求。   5.1.2 软件要求:

       本程序能在Visual C++ 6.0下运行。

5.2 错误分析:

 1、 函数名拼写错误

2、 括号匹配错误

3、 变量类型名定义错误

4、 分号没有在英文环境下输出,导致运行出错

5、 参数表出现语法错误,函数调用的一组参数之间没有以逗号隔开,并以一个右括号结束

六、  用户手册

1、本程序的执行文件为:Cpp1.exe。

2、进入演示程序后即显示文本方式的用户界面。

3、根据提示数字执行操作。如输入数字“1”

4、执行相应命令后显示操作结果。

七、  测试结果

1、最初的界面

2、选择操作“1”、“2”“3”、“4”,输入数字得到的结果,即创建多项式a和b

3、a+b

4、a-b

5、a*b

6、求导

7、带入x值求a,b

八、 心得体会

通过这次课程设计,我觉得我们对于《数据结构》的学习不仅包括理论部分的学习,还要勤动手,多实践。真正将这个程序做出来很不容易,但只要只要用心去做,总会有收获,特别是当我遇到问题时,通过向同学请教,最后终于找到方法时,并理解代码的含义时,心中是无比喜悦的。编写程序中遇到问题再所难免,应耐心探究其中的原因,从出现问题的地方起,并联系前后程序,仔细推敲,逐个排查.直到最终搞清为止。



更多相关推荐:
数据结构课程设计总结

课程设计说明书课程名:《数据结构课程设计》题目:一元多项式运算系统20##年1月一、课程认识数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。数据结构是介于数…

数据结构课程设计心得体会

程序设计心得体会做了一个星期的程序设计终于做完了,在这次程序设计课中,真是让我获益匪浅,我突然发现写程序还挺有意思的。由于上学期的C语言跟这学期的数据结构都算不上真正的懂,对于书上的稍微难点的知识就是是而非的,…

《数据结构课程设计报告》

安徽省巢湖学院计算机与信息工程学院课程设计报告课程名称课题名称用三元组实现稀疏矩阵的转置相加相乘专业计算机科学与技术班级学号AA姓名AAA联系方式136XXXXXXXX指导教师武彬20年月日目录1数据结构课程设...

数据结构课程设计总结

课程设计总结一周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情的方法和技巧。在设计过程中,和同学们相互探讨,相互学习,相互监督。…

数据结构课程设计报告(含代码)

西安郵電學院数据结构课程设计报告题目校园导航系统院系名称计算机学院专业名称计算机科学与技术班级学生姓名学号8位指导教师设计起止时间20xx年12月11日20xx年12月15日一设计目的1通过本次课程设计巩固数据...

数据结构课程设计报告

CENTRALSOUTHUNIVERSITY数据结构课程设计报告题目学生姓名指导教师学院专业班级完成时间交通旅游图的最短路径问题摘要数据结构主要是一门研究非数值计算的程序设计问题中的计算机操作对象以及它们之间的...

数据结构课程设计总结 (1)

《程序设计与数据结构》综合课程设计论文题目:程序设计与数据结构综合课程设计专业:计算机科学与技术班级:N计科12-1F姓名:学号:指导老师:一、课程认识数据结构课程主要是研究非数值计算的程序设计问题中所出现的计…

数据结构课程设计

数据结构课程设计说明肖波xiaobo一时间说明本学期到下学期五一之前完成即可期间如果提前完成随时可以发邮件给老师联系验收教三楼803房间Tel622830591007二课程设计验收说明验收时提交源程序报告电子版...

数据结构课程设计

数据结构课程设计课程设计时间1014周周三下午及晚上一课程设计的目的数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科数据结构是介于数学计算机软件和计算机硬件之...

山东大学数据结构课程设计报告

数据结构课程设计报告构件标识系统学院软件学院专业软件工程年级姓名学号一系统开发平台11题目构件标识12开发工具VC6013语言C13操作系统WindowsXP或Windows7系统二系统规划21任务陈述图是由非...

数据结构课程设计指导书

数据结构课程设计指导书主编软件工程教研室适用专业计算机科学与技术上海应用技术学院20xx年06月目录第一章第二章课程设计教学大纲2课程设计任务与要求31第一章课程设计教学大纲2第二章课程设计任务与要求一数据结构...

数据结构课程设计论文

课程设计论文任务书信息学院计算机专业一课程设计论文题目基础软件设计二课程设计论文工作自20xx年12月28日起至20xx年1月8日止三课程设计论文地点5205四课程设计论文内容要求1本课程设计的目的1使学生进一...

数据结构课程设计总结(48篇)