数据结构课程设计数据结构的实现Word文件下载.docx
《数据结构课程设计数据结构的实现Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计数据结构的实现Word文件下载.docx(23页珍藏版)》请在冰点文库上搜索。
4.成绩信息录入功能:
(成绩信息用文件保存,可以一次完成若干条记录的输入。
)
5.应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观!
四、课程设计内容
4.1数据结构设计
4.1.1设计背景
在实际学习生活中,我们需要对获得的信息进行处理和存储,然而处理的元素可以是数据、符号、或者其他的记录,等等这些数据结点都可以用来构成一个线性表。
线性表是由n个相同类型数据元素组成的有限序列。
而有些时候需要把不同类型的数据结点整合在一起,用来描述某些记录。
例如,要记录学生的成绩表需要包括XX、学号以与各科成绩等数据,这其中包含了字符型和整型两种数据类型。
因此,仅用含有一个数组的顺序表没办法具体描述出详细的信息,所以有必要增加顺序表中的成员来达到目的。
✧下面以“学生成绩管理”问题为例建立解决此类问题的数据结构结构体并实现在该数据结构上的基本运算。
4.1.2定义数据结构体
“学生成绩管理”数据结构定义如下:
typedefstructstudent
{
charnumber[10];
charname[20];
floatscore[4];
floatsum;
}STU;
STUstu[N];
这里把这种结构体成为“学生信息”。
其中,数组name[]储存学生XX,数组number[]储存学号,数组score[]储存成绩数据(这里以语文数学英语理综为成绩)。
Sum用于储存总分。
4.1.3存储方式
由于该数据结构结构体中的成员是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。
和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。
在C++的结构体中存储方式是按一种内存对齐的规则来存储的。
对于一个结构体中每次的偏移量是相等的,以结构体所占空间最大的变量类型为一个位访问的单位偏移量,这样对于程序来说加快了访问的速度,当同时也会早造成一些空间的浪费。
一般情况下该结构体的大小可以通过如下方法计算:
(1).分析各个成员长度;
(2).找出最大长度的成员长度M(结构体的长度一定是该成员的整数倍);
(3).并按最大成员长度出现的位置将结构体分为若干部分;
(4).各个部分长度一次相加,求出大于该和的最小M的整数倍即为该部分长度;
(5).将各个部分长度相加之和即为结构体长度
4.1.4数据结构上的基本运算
1.输入函数inputscore()
输入运算实现的是把原始学生数据信息包括学号、XX、各科成绩等输入结构体,并且把信息按照顺序存储结构储存在一片连续的存储单元中。
算法描述如下:
voidinputscore()
inti,j,n;
printf("
请输入学生总数:
\n"
);
scanf("
%d"
&
n);
printf("
提示:
*输入学号时请输入位数为8位的数字*\n"
请输入学生的学号XX语文数学英语理综:
for(i=0;
i<
n;
i++)
%s%s%f%f%f%f"
stu[i].number,stu[i].name,&
stu[i].score[0],&
stu[i].score[1],&
stu[i].score[2],&
stu[i].score[3]);
}
2.插入(添加)函数add()
插入函数实现将某一学生的信息插入到结构体中,即结构体中的成员数组number[],数组name[],score[]元素分别增加1,增加的数值为所添加的新学生的信息。
为了方便,add()函数利用循环功能实现添加多个学生信息,算法描述如下:
voidadd()
inta,i,j;
请输入新增加的学生人数:
a);
n=n+a;
请输入添加的学生的学号XX语文数学英语理综:
for(i=n-a;
i++)
}
3.删除函数delscore()
删除某学生的信息,根据输入的学号,搜索所有学生信息找到该学号的信息并删除,删除的具体操作为结构体整体赋值将后一位学生成绩信息拷贝进入前一位学生信息的存储位置,删除该学生信息后学生总数减一。
voiddelscore()
{
inti,j,flog=0;
charm,a[10];
system("
cls"
请输入要删除的学生学号\n"
%s"
a);
if(strcmp(a,stu[i].number)==0)
{
flog=1;
break;
}
if(flog==0)
printf("
未找到该学生信息\n"
else
是否删除该学生成绩(y/n)\n"
m);
if(m=='
y'
)
{
for(i;
n-1;
stu[i]=stu[i+1];
n=n-1;
删除成绩成功\n"
}
删除成绩失败\n"
4.输出(显示)函数lookscore()
输出所保存的学生信息。
先将信息数据按照某一元素进行排序,这里按照总分从大到小排序并输出所有学生信息。
voidlookscore()
inti,j,k;
STUt;
for(k=i,j=i+1;
j<
j++)
if(stu[j].sum>
stu[k].sum)
k=j;
if(k!
=j)
{
t=stu[k];
stu[k]=stu[i];
stu[i]=t;
}
名次\t学号\t\tXX\t语文\t数学\t英语\t理综\t总分\n"
%d\t%s\t%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n"
i+1,stu[i].number,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].sum);
5.查询函数searchscore()
根据学号查询学生信息并输出。
voidsearchscore()
chara[10];
请输入需查询的学生学号\n"
printf("
break;
未找到该学生信息!
"
4.2实例应用
4.2.1问题描述
已知某班级学生入学成绩如下表,设计“学生成绩管理系统”使其具有以下功能:
(1)
能完成对学生成绩的录入
(2)
能按班级统计学生的成绩,求学生的总分与平均分,排序
(3)
能按班级,学期输出学生的成绩单和不与格科目与学生
(4)
能查询单个学生成绩
(5)
能修改单个学生信息
表1某班学生高考入学成绩表
XX
学号
语文
数学
英语
理综
总分
张丰
31260030
131
127
138
252
648
李民
31260031
115
132
141
231
619
王凯
31260032
122
110
128
273
633
...
陈丽
31260080
108
135
125
254
622
4.2.2程序设计
程序主要包括以下几个模块:
1、成绩录入功能2、成绩输出功能3、成绩查询功能4、添加模块5、删除模块6、修改模块7、保存功能8、退出系统
主程序流程图如下:
图1
4.2.3源代码
#include<
stdio.h>
string.h>
process.h>
conio.h>
#defineN30
#defineM4
floatscore[M];
intn;
voidmenu()
*********欢迎进入学生成绩管理系统*************\n"
菜单\n"
输入成绩-------------------------------------1\n"
查看成绩与成绩排序---------------------------2\n"
查询学生成绩---------------------------------3\n"
修改成绩-------------------------------------4\n"
添加成绩-------------------------------------5\n"
删除成绩-------------------------------------6\n"
保存成绩-------------------------------------7\n"
退出系统-------------------------------------8\n"
**********************************************\n"
请输入您的选择\n"
/***************输入各个同学的学生信息******************************/
inti,j;
/*因二维表上下需对正故有此要求*/
scanf("
%s%s%f%f%f%f"
成功输入\n"
/*****************计算各个同学的总分*****************************/
voidsumgescore()
{
stu[i].sum=0;
for(j=0;
M;
stu[i].sum+=stu[i].score[j];
/************查看学生成绩与根据总分对学生进行排序*********************/
sumgescore();
/*****************通过输入学号查找学生成绩***************************/
/*找到该学生成绩信息后跳出for循环*/
}
/***************修改学生成绩*****************/
voidmodify()
请输入需要修改成绩的学生学号\n"
if(flog==1)
请重新输入该学生的学号XX语文数学英语理综:
修改成功\n"
/*****************添加学生成绩********************/
添加成功\n"
/*******************删除学生成绩*************************/
stu[i]=stu[i+1];
/*结构体整体赋值将后一位学生成绩信息拷贝进入前一位学生信息的存储位置*/
/*删除该学生信息后学生总数减一*/
/******************保存学生成绩************************/
voidsavescore()
FILE*fp;
inti,flag=1;
charm;
puts("
是否保存学生成绩(y/n)"
if((fp=fopen("
score.dat"
"
wb"
))==NULL)
文件打开失败\n"
return;
for(i=0;
if(fwrite(&
stu[i],sizeof(structstudent),1,fp)!
=1)
{
printf("
保存失败\n"
flag=0;
}
if(flag==1)
保存成功!
fclose(fp);
return;
voidmain()
shortintflag=0;
menu();
do
flag=1;
switch(getch())
case'
1'
:
inputs