1、数据结构课程设计报告课程设计成绩总评成绩指导老师签名 数据结构课程设计报告学院(系): 班 级: 学生姓名: 学号: 指导教师: 时间:从 2013 年12 月30 日到2013年1 月4 日一、课程设计概述:本次数据结构课程设计共完成两道题:一元稀疏矩阵多项式计算器、成绩分析问题。使用语言:C 编译环境:Visual 6.0 c+。二、课程设计题目一实验内容一元稀疏多项式计算器问题描述设计一个一元稀疏多项式简单计算器。基本要求一元稀疏多项式简单计算器的基本功能是:(1)输入并建立多项式;(2)输出多项式,输出形式为整数序列:n,c1,e1, c2,e2, cn,en,其中n是多项式的项数,c
2、i,ei,分别是第i项的系数和指数,序列按指数降序排序;(3)多项式a和b相加,建立多项式a+b;(4)多项式a和b相减,建立多项式a-b;(5)计算多项式在x处的值。(6)计算器的仿真界面。(选做)测试数据(1) (2x+5x8-3.1x11)+(7-5x8+11x9) = (-3.1x11+11x9+2x+7)(2) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2-x2+7.8x15)=(-7.8x15-1.2x9-x+12x-3)(3) (1+x+x2+x3+x4+x5)+(-x3-x4)=(x5+x2+x+1)(4) (x+x3)+(-x-x3)=0(5) (x+x
3、2+x3)+0=( x3+ x2+ x)实现提示用带表头结点的单链表存储多项式,多项式的项数存放在头结点中。 概要设计 void swap(dnode *p,dnode *q) /交换p,q指针所指的指数和系数 void sort(dnode *h) /用冒泡法对链表每一项进行排序 dnode *con(dnode *a,dnode *b) /稀疏多项式的计算 void disp(dnode *h) /输出结果存储结构typedef struct node /结构体类型 float c; int e; /c、e分别为多项式的系数和指数 struct node *next;dnode;流程图冒泡
4、排序流程图输入10个数组给a0到a9j由0变到8共进行9次循环进行9-j次比较真aiai+1假ai与ai+1互换保持不变输出a0到a9程序主体流程详细设计#include #include #include #define NULL 0typedef struct node float c; int e; /c、e分别为多项式的系数和指数 struct node *next;dnode;dnode *creat() /用链表存放多项式 dnode *h,*p; int e,i,n; /n为多项式的项数 float c; h=(dnode*)malloc(sizeof(dnode); /分配头结
5、点 h-next=NULL; do /当n小于1,则重新输入 scanf( %d,&n); while(n1); for(i=1;ic=c; p-e=e; p-next=h-next; h-next=p; /用头插法建立链表 return h;void swap(dnode *p,dnode *q) /交换p,q指针所指的指数和系数 float temp; int temp1; temp1=p-e;p-e=q-e;q-e=temp1; temp=p-c;p-c=q-c;q-c=temp;void sort(dnode *h) /用冒泡法对链表每一项进行排序 dnode *pi,*p1,*p,*
6、q; p=h-next; while(p-next!=NULL) p=p-next; pi=p; while(pi!=h-next) p1=h-next; for(p=h-next;p!=pi;p=p-next) q=p-next; if(p-eq-e) swap(p,q); p1=p; pi=p1; dnode *con(dnode *a,dnode *b) /稀疏多项式的计算 int select; float x; dnode *p1,*p2,*p,*t; /t为结果链表的表头 t=(dnode *)malloc(sizeof(dnode); t-next=NULL; printf(1.
7、a+btt2.a-bn); printf(请选择要进行的运算:); scanf(%d,&select); p1=a-next; p2=b-next; while(p1&p2) if(p1-e=p2-e) /指数相同 if(select=1) x=p1-c+p2-c; else x=p1-c-p2-c; if(x!=0) p=(dnode *)malloc(sizeof(dnode); p-e=p1-e; p-c=x; p-next=t-next; t-next=p; p1=p1-next; p2=p2-next; else if(p1-ep2-e) /p1的指数大于p2的指数 p=(dnode
8、 *)malloc(sizeof(dnode); p-e=p2-e; if(select=1) p-c=p2-c; else p-c=(-1)*p2-c; p-next=t-next; t-next=p; p2=p2-next; else /p2的指数大于p1的指数 p=(dnode *)malloc(sizeof(dnode); p-e=p1-e; p-c=p1-c; p-next=t-next; t-next=p; p1=p1-next; while(p1!=NULL) /p2为空,p1不为空时 p=(dnode *)malloc(sizeof(dnode); p=p1; p1=p1-ne
9、xt; p-next=t-next; t-next=p; while(p2!=NULL) /p1为空,p2不为空时 p=(dnode *)malloc(sizeof(dnode); p-e=p2-e; if(select=2) p-c=(-1)*p2-c; else p-c=p2-c; p2=p2-next; p-next=t-next; t-next=p; return t;void disp(dnode *h) /输出结果 dnode *p; p=h-next; if(p=NULL) printf(0n); exit(0); while(p!=NULL) printf( %3.1f,%d)
10、,p-c,p-e); p=p-next; printf(n);void main() dnode *a,*b,*c; printf(请输入多项式a的项数n: ); a=creat(); sort(a); printf(请输入多项式b的项数n: ); b=creat(); sort(b); printf(n*nn); c=con(a,b); disp(c); getch();调试分析 本程序的主要操作在于对链表的操作,结构体的应用以及排序的应用,只要细心多加调试,是比较容易实现所要求的功能的。 运行结果及分析多项式的输入多项式的运算程序无异常。题目二 实验内容成绩分析问题问题描述 录入、保存一个
11、班级学生多门课程的成绩,并对成绩进行分析。基本要求 1.通过键盘输入各学生的多门课程的成绩,建立相应的文件input.dat 2.对文件input.dat中的数据进行处理,要求具有如下功能: a.按各门课程成绩排序,并生成相应的文件输出 b.计算每人的平均成绩,按平均成绩排序,并生成文件 c.求出各门课程的平均成绩、最高分、最低分、不及格人数、 6069分人数、7079分人数、8089分人数、90分以上人数 d.根据姓名或学号查询某人的各门课成绩,重名也要能处理 3.界面美观测试数据测试数据如下表所示。 成绩表学号姓名数学英语计算机001王放787790002张强896788003李浩5666
12、78004黄鹂兵898685005李浩678876006陈利风455467007尚晓787670概要设计 snode* sort_ave(snode* head) /平均分选择排序 snode* sort_math(snode* head) /数学成绩选择排序 snode* sort_english(snode* head) /英语成绩选择排序 snode* sort_computer(snode* head) /计算机成绩选择排序 void output_save(snode *p) /保存为文件void research(snode *head) /查询各科的最高分、最低分以及平均分并求得
13、各科分别在在90+、8089、7079、6069和60-的人数void nameFind(snode *head,char name) /按姓名查找void exchange_to_list(snode* head) /信息查询主要功能表int CreateFile() /创建文件int SaveStudent(snode* head) /写入及保存文件snode* ReadStudentInfo() /读取文件信息void print_student(snode* head) /输出学生信息snode* IsStudentExist(snode *head,char num) /判断学生信息
14、是否存在snode* student_information_insert(snode * head) /学生信息输入 存储结构struct studentinfo /数据记录类型 char num10; /学号 char name10; /姓名 int Math; /数学成绩 int English; / 英语成绩 int Computer; /计算机成绩 float Ave; /平均成绩;typedef struct Node1 /链表 struct studentinfo student; struct Node1* next;snode;流程图功能表流程图层次结构及调用关系图详细设计#
15、include#include#include#includevoid print_student(head);struct studentinfo /数据类型 char num10; /学号 char name10; /姓名 int Math; /数学成绩 int English; / 英语成绩 int Computer; /计算机成绩 float Ave; /平均成绩;typedef struct Node1 struct studentinfo student; struct Node1* next;snode;snode* sort_ave(snode* head) /平均分选择排序
16、snode *p,*q,*tail,*s; tail=NULL; while(head-next!=tail) p=head; q=p-next; if(p-student.Avestudent.Ave) p-next=q-next; q-next=p; head=q; p=head; q=head-next; while(q-next!=tail) if(p-next-student.Avenext-student.Ave) s=q-next; p-next=q-next; q-next=q-next-next; p-next-next=q; q=s; p=p-next; q=q-next;
17、 tail=q; return (head); snode* sort_math(snode* head) /数学成绩选择排序 snode *p,*q,*tail,*s; tail=NULL; while(head-next!=tail) p=head; q=p-next; if(p-student.Mathstudent.Math) p-next=q-next; q-next=p; head=q; p=head; q=head-next; while(q-next!=tail) if(p-next-student.Mathnext-student.Math) s=q-next; p-next
18、=q-next; q-next=q-next-next; p-next-next=q; q=s; p=p-next; q=q-next; tail=q; return (head); snode* sort_english(snode* head) /英语成绩选择排序 snode *p,*q,*tail,*s; tail=NULL; while(head-next!=tail) p=head; q=p-next; if(p-student.Englishstudent.English) p-next=q-next; q-next=p; head=q; p=head; q=head-next;
19、while(q-next!=tail) if(p-next-student.Englishnext-student.English) s=q-next; p-next=q-next; q-next=q-next-next; p-next-next=q; q=s; p=p-next; q=q-next; tail=q; return (head); snode* sort_computer(snode* head) /计算机成绩选择排序 snode *p,*q,*tail,*s; tail=NULL; while(head-next!=tail) p=head; q=p-next; if(p-s
20、tudent.Computerstudent.Computer) p-next=q-next; q-next=p; head=q; p=head; q=head-next; while(q-next!=tail) if(p-next-student.Computernext-student.Computer) s=q-next; p-next=q-next; q-next=q-next-next; p-next-next=q; q=s; p=p-next; q=q-next; tail=q; return (head); void output_save(snode *p) /保存为文件 FI
21、LE*fp; char filename20; int n=0; memset(filename,0,20); printf(请输入你要将数据保存的文件名:); scanf(%s,filename); getchar(); if(fp=fopen(filename,wb)=NULL) printf(can not open the file!n); exit(0); while(p!=NULL) fprintf(fp,%s %14s %4d %8d %10d %10.1fn,p-student.num,p-student.name,p-student.Math,p-student.Englis
22、h,p-student.Computer,p-student.Ave); p=p-next; printf(保存成功); fclose(fp);void research(snode *head) /查询各科的最高分、最低分以及平均分并求得各科 snode * p1; /分别在在90+、8089、7079、6069和60-的人数 snode* p2 = head; int sum3=0; int min3=100,100,100; int max3=0; float ave3=0; int num35=0; int i,n=0,m=0; p1=NULL; p1=head; if(head=NU
23、LL)printf(the list is null!n); while(p2!=NULL) /找到本链表的末尾 p2 = p2-next; n+; while(1) printf( n); printf( | 1查数学课程 |n); printf( | 2查英语课程 |n); printf( | 3查计算机课程 |n); printf( | 0返回上级菜单 |n); printf( n); printf(请选择:); scanf(%d,&i); p1=head; if(i=1) while(i=1&mstudent.Math; if(p1-student.Mathmax0) max0=p1-
24、student.Math; if(p1-student.Mathstudent.Math; if(p1-student.Mathstudent.Math=60&p1-student.Mathstudent.Math=70&p1-student.Mathstudent.Math=80&p1-student.Mathstudent.Math=90) num04+; p1=p1-next; m+; m=0; ave0=(float)sum0/n; printf(数学课程的最高分为:); printf( %dn,max0); printf(数学课程的最低分为:); printf( %dn,min0); printf(数学课程的平均分为:); printf( %.1fn,ave0); printf(数学课程90分以上的人数为:); printf( %dn,num
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1