数据结构课程设计报告.docx

上传人:b****5 文档编号:6655287 上传时间:2023-01-08 格式:DOCX 页数:37 大小:216.89KB
下载 相关 举报
数据结构课程设计报告.docx_第1页
第1页 / 共37页
数据结构课程设计报告.docx_第2页
第2页 / 共37页
数据结构课程设计报告.docx_第3页
第3页 / 共37页
数据结构课程设计报告.docx_第4页
第4页 / 共37页
数据结构课程设计报告.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

数据结构课程设计报告.docx

《数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.docx(37页珍藏版)》请在冰豆网上搜索。

数据结构课程设计报告.docx

数据结构课程设计报告

课程设计成绩

总评成绩

指导老师签名

《数据结构》

课程设计报告

学院(系):

班级:

学生姓名:

学号:

指导教师:

 

时间:

从2013年12月30日到2013年1月4日

 

一、课程设计概述:

本次数据结构课程设计共完成两道题:

一元稀疏矩阵多项式计算器、成绩分析问题。

使用语言:

C

编译环境:

Visual6.0c++。

二、课程设计

题目一

[实验内容]

一元稀疏多项式计算器

[问题描述]

设计一个一元稀疏多项式简单计算器。

[基本要求]

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

(1)输入并建立多项式;

(2)输出多项式,输出形式为整数序列:

n,c1,e1,c2,e2,,,,,,,cn,en,其中n是多项式的项数,ci,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+x2+x3)+0=(x3+x2+x)

[实现提示]

用带表头结点的单链表存储多项式,多项式的项数存放在头结点中。

[概要设计]

{

voidswap(dnode*p,dnode*q)//交换p,q指针所指的指数和系数

voidsort(dnode*h)//用冒泡法对链表每一项进行排序

dnode*con(dnode*a,dnode*b)//稀疏多项式的计算

voiddisp(dnode*h)//输出结果

}

[存储结构]

typedefstructnode//结构体类型

{

floatc;

inte;//c、e分别为多项式的系数和指数

structnode*next;

}dnode;

[流程图]

冒泡排序流程图

输入10个数组给a[0]到a[9]

j由0变到8共进行9次循环

 

进行9-j次比较

 

a[i]>a[i+1]

a[i]与a[i+1]互换

保持不变

输出a[0]到a[9]

程序主体流程

 

 

[详细设计]

#include

#include

#include

#defineNULL0

typedefstructnode

{

floatc;

inte;//c、e分别为多项式的系数和指数

structnode*next;

}dnode;

dnode*creat()//用链表存放多项式

{

dnode*h,*p;

inte,i,n;//n为多项式的项数

floatc;

h=(dnode*)malloc(sizeof(dnode));//分配头结点

h->next=NULL;

do//当n小于1,则重新输入

{

scanf("%d",&n);

}while(n<1);

for(i=1;i<=n;i++)

{

printf("请输入第%d项(c%d,e%d):

\n",i,i,i);

scanf("%f%d",&c,&e);

p=(dnode*)malloc(sizeof(dnode));

p->c=c;

p->e=e;

p->next=h->next;

h->next=p;//用头插法建立链表

}

returnh;

}

voidswap(dnode*p,dnode*q)//交换p,q指针所指的指数和系数

{

floattemp;

inttemp1;

temp1=p->e;p->e=q->e;q->e=temp1;

temp=p->c;p->c=q->c;q->c=temp;

}

voidsort(dnode*h)//用冒泡法对链表每一项进行排序

{

dnode*pi,*p1,*p,*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->e>q->e)

{

swap(p,q);

p1=p;

}

}

pi=p1;

}

}

dnode*con(dnode*a,dnode*b)//稀疏多项式的计算

{

intselect;

floatx;

dnode*p1,*p2,*p,*t;//t为结果链表的表头

t=(dnode*)malloc(sizeof(dnode));

t->next=NULL;

printf("1.a+b\t\t2.a-b\n");

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;

elsex=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;

}

elseif(p1->e>p2->e)//p1的指数大于p2的指数

{

p=(dnode*)malloc(sizeof(dnode));

p->e=p2->e;

if(select==1)

p->c=p2->c;

elsep->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->next;

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;

}returnt;

}

voiddisp(dnode*h)//输出结果

{

dnode*p;

p=h->next;

if(p==NULL)

{

printf("0\n");

exit(0);

}

while(p!

=NULL)

{

printf("(%3.1f,%d)",p->c,p->e);

p=p->next;

}

printf("\n");

}

voidmain()

{

dnode*a,*b,*c;

printf("请输入多项式a的项数n:

");

a=creat();

sort(a);

printf("请输入多项式b的项数n:

");

b=creat();

sort(b);

printf("\n******************************\n\n");

c=con(a,b);

disp(c);

getch();

}

[调试分析]

本程序的主要操作在于对链表的操作,结构体的应用以及排序的应用,只要细心多加调试,是比较容易实现所要求的功能的。

[运行结果及分析]

多项式的输入

多项式的运算

程序无异常。

题目二

[实验内容]

成绩分析问题

[问题描述]

录入、保存一个班级学生多门课程的成绩,并对成绩进行分析。

[基本要求]

1.通过键盘输入各学生的多门课程的成绩,建立相应的文件input.dat

2.对文件input.dat中的数据进行处理,要求具有如下功能:

a.按各门课程成绩排序,并生成相应的文件输出

b.计算每人的平均成绩,按平均成绩排序,并生成文件

c.求出各门课程的平均成绩、最高分、最低分、不及格人数、

60-69分人数、70-79分人数、80-89分人数、90分以上人数

d.根据姓名或学号查询某人的各门课成绩,重名也要能处理

3.界面美观

[测试数据]

测试数据如下表所示。

成绩表

学号

姓名

数学

英语

计算机

001

王放

78

77

90

002

张强

89

67

88

003

李浩

56

66

78

004

黄鹂兵

89

86

85

005

李浩

67

88

76

006

陈利风

45

54

67

007

尚晓

78

76

70

[概要设计]

{

snode*sort_ave(snode*head)//平均分选择排序

snode*sort_math(snode*head)//数学成绩选择排序

snode*sort_english(snode*head)//英语成绩选择排序

snode*sort_computer(snode*head)//计算机成绩选择排序

voidoutput_save(snode*p)//保存为文件

voidresearch(snode*head)//查询各科的最高分、最低分以及平均分并求得各科分别在在90+、80~89、70~79、60~69和60-的人数

voidnameFind(snode*head,charname[])//按姓名查找

voidexchange_to_list(snode*head)//信息查询主要功能表

intCreateFile()//创建文件

intSaveStudent(snode*head)//写入及保存文件

snode*ReadStudentInfo()//读取文件信息

voidprint_student(snode*head)//输出学生信息

snode*IsStudentExist(snode*head,charnum[])//判断学生信息是否存在

snode*student_information_insert(snode*head)//学生信息输入

}

[存储结构]

structstudentinfo//数据记录类型

{

charnum[10];//学号

charname[10];//姓名

intMath;//数学成绩

intEnglish;//英语成绩

intComputer;//计算机成绩

floatAve;//平均成绩

};

typedefstructNode1//链表

{

structstudentinfostudent;

structNode1*next;

}snode;

[流程图]

功能表流程图

 

层次结构及调用关系图

 

[详细设计]

#include

#include

#include

#include

voidprint_student(head);

structstudentinfo//数据类型

{

charnum[10];//学号

charname[10];//姓名

intMath;//数学成绩

intEnglish;//英语成绩

intComputer;//计算机成绩

floatAve;//平均成绩

};

typedefstructNode1

{

structstudentinfostudent;

structNode1*next;

}snode;

snode*sort_ave(snode*head)//平均分选择排序

{

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;

}

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=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;

}

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->student.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);

}

voidoutput_save(snode*p)//保存为文件

{

FILE*fp;

charfilename[20];

intn=0;

memset(filename,0,20);

printf("请输入你要将数据保存的文件名:

");

scanf("%s",filename);

getchar();

if((fp=fopen(filename,"wb"))==NULL)

{

printf("cannotopenthefile!

\n");

exit(0);

}

while(p!

=NULL)

{

fprintf(fp,"%s%14s%4d%8d%10d%10.1f\n",p->student.num,p->student.name,p->student.Math,p->student.English,p->student.Computer,p->student.Ave);

p=p->next;

}

printf("保存成功");

fclose(fp);

}

 

voidresearch(snode*head)//查询各科的最高分、最低分以及平均分并求得各科

{

snode*p1;//分别在在90+、80~89、70~79、60~69和60-的人数

snode*p2=head;

intsum[3]={0};

intmin[3]={100,100,100};

intmax[3]={0};

floatave[3]={0};

intnum[3][5]={0};

inti,n=0,m=0;

p1=NULL;

p1=head;

if(head==NULL){printf("thelistisnull!

\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&&m

{

sum[0]=sum[0]+p1->student.Math;

if(p1->student.Math>max[0])

max[0]=p1->student.Math;

if(p1->student.Math

min[0]=p1->student.Math;

if(p1->student.Math<60)

num[0][0]++;

if(p1->student.Math>=60&&p1->student.Math<=69)

num[0][1]++;

if(p1->student.Math>=70&&p1->student.Math<=79)

num[0][2]++;

if(p1->student.Math>=80&&p1->student.Math<=89)

num[0][3]++;

if(p1->student.Math>=90)

num[0][4]++;

p1=p1->next;

m++;

}

m=0;

ave[0]=(float)sum[0]/n;

printf("数学课程的最高分为:

");

printf("%d\n",max[0]);

printf("数学课程的最低分为:

");

printf("%d\n",min[0]);

printf("数学课程的平均分为:

");

printf("%.1f\n",ave[0]);

printf("数学课程90分以上的人数为:

");

printf("%d\n",num[

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 其它语言学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1