数据结构基础 学生成绩管理系统 c语言Word下载.docx
- 文档编号:20359686
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:33
- 大小:138.11KB
数据结构基础 学生成绩管理系统 c语言Word下载.docx
《数据结构基础 学生成绩管理系统 c语言Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构基础 学生成绩管理系统 c语言Word下载.docx(33页珍藏版)》请在冰豆网上搜索。
我要设计的程序主要应用到C编程方法学[1]和数据结构[2]的主要知识。
基本要求需实现程序的编译、链接、调试、运行。
主要解决的问题是程序的编写,操作平台为VC++6.0
5.问题分析及算法设计
5.1问题分析
这个程序要设计的整体思想就是模块化编程,因为程序集多个功能于一体,然后根据用户输入的要求执行相应的子模块,以此达到功能的实现。
所以主函数就可以用switch结构实现,然后分别按功能编写模块函数了。
5.2算法设计
经过问题分析,程序的大体结构已经确定,然后就要考虑该使用那些算法了。
因为程序要存储一连串的学生信息,且包含多个数据项,所以可以用数组、结构体、顺序表、单链表等实现,但要实现查找、排序、删除等各种功能,单链表就显得更适宜些,同时也能锻炼我们对链表的使用技巧,所以经过思量,决定用单链表来实现编程。
6.系统设计方案
6.1系统功能
首先要确定学生信息应包括:
学号,姓名,科目,成绩业等。
其次,学生信息管理系统应提供的功能包括:
(1)系统以菜单方式显示
(2)要有学生信息录入功能
(3)学生信息浏览功能
(4)学生信息用文件保存
(5)按学号查询、按姓名查询
(6)可以按学号、科目成绩等排序
(7)学生信息的删除修改
(8)学生信息的修改
(9)退出
结合实际情况及自身能力,确定了以上要编写并实现的功能。
6.2程序设计及运行结果
(1)主函数模块设计
之前已确定主函数可以用switch结构实现,只要将系统功能经分析排版后写入主函数中的每个case即可,所以主函数可如下编写[3]
//主函数
intmain(void){
menu();
//调用显示函数
while
(1)
{
printf("
\t\t请选择相应的功能:
"
);
scanf("
%d"
&
a);
switch(a)
{
case0:
//退出系统
case1:
//学生信息输入
case2:
//信息显示
case3:
//查找信息
case4:
//删除学生信息
case5:
//插入学生信息(尾插法)
case6:
//学生信息排序
case7:
//修改信息
case8:
//保存成绩至文件
default:
//输入其它情况,循环重新输入
break;
}}
system("
pause"
return0;
}
如此编写,可以使主函数既简单易懂,又不杂乱,能让读者一目了然,有了主函数,之后就可以往主函数中加子模块了。
(2)“屏幕”—显示函数模块设计
显示屏幕,也就是要给用户提供功能选择的主界面,需明了,整齐,要达到用户感觉到系统操作很其实简单的效果,所以编译排版之后的界面效果见下图
可以从上图看出,只要用户按自己需求进行操作,就可以实现相应功能了。
程序设计的该函数为voidmenu()。
(3)结构体定义
“结构体名”用作结构体类型的标志,它又称“结构体标记”。
声明一个结构体类型的一般形式为:
Struct结构体名
{成员表列};
大括弧内是该结构体中的各个成员,由它们组成一个结构体。
对各成员都应进行类型声明,即
类型名成员名
我在结构体中定义了两个字符数组及三个整形变量,用于存储学号、姓名、三个科目的成绩,并在结构体中定义了一个指针,为单链表所需,用于指向下一结点。
typedefstructstudent//建立学生类
{
charnum[20];
//学号
charname[20];
//姓名
intmath;
//数分
intEnglish;
//英语
intData;
//数据结构
structstudent*next;
//指针
}student;
student*head=NULL;
//头指针
(5)信息输入模块
对应函数为voidcreate(),可用链表建立学生信息,所以先要建立一个头结点
p1=(student*)malloc(sizeof(student));
//建立头结点
然后让指针指向下一个结点,依次根据用户输入的学生个数循环建立链表(学生信息)
所以主要循环为while
while(number<
numb)//循环输入学生信息
p2=(student*)malloc(sizeof(student));
//建立结点
scanf("
%s%s%d%d%d"
p2->
num,p2->
name,&
p2->
math,&
English,&
Data);
//输入学生信息
if(p2->
num==0)
printf("
信息输入成功!
\n"
}
length++;
//链表的长度
p1->
next=p2;
p2->
next=NULL;
//结点相继后移
p1=p1->
next;
number++;
//记录已输入的学生个数
}
printf("
//返回成功
功能的选择是用户根据选择模块—屏幕上的提示做出的操作,可以看到,在进行下一操作之前,系统会进行清屏,然后显示本次的操作结果。
(6)显示模块及结果
voiddisplay(),这个模块并不是每个操作结果的输出函数,它会输出最终的结果,在进行了输入学生信息操作后,进行这个功能,系统就会输出全部的结果,见下图。
可以看出,系统已把上次的操作清屏,然后根据输入的2功能进行了显示操作。
输出是按循环输出的,用指针指向链表的各项数据,依次输出。
主要代码为
while(p!
=NULL)
\t\t%-13s%-11s%-9d%-9d%d\n"
p->
num,p->
name,p->
math,p->
English,p->
p=p->
(7)查找模块及结果
在程序设计时,并没有采用单一的按学号或按姓名查找的方式,而是既可以按学号查找,亦可按姓名查找,所以编写了voidsearch1()和voidsearch2()这两个查找函数,当输入的学号或姓名不在记录时,系统会显示“查无此人”,主要代码如下,链表不空时循环查找,然后用字符串比较函数[4]判断查找是否成功。
if(strcmp(p->
num,xh)==0)//查找成功,显示查找信息
…………………………….//显示查找到的信息
if(p==NULL)//链表遍历完成,返回查找信息
printf("
查无此人\n"
(8)删除模块
voidDelete()为删除模块函数,按输入的学号删除信息,首先会根据用户输入的学号查找该学号对应的信息,如果记录中没有,则系统返回查无此人,如果查找成功,则会删除该学生的所有信息,代码同查找一样,在while循环中用了字符串比较函数,若查找成功,则删除,否则返回查无此人。
(9)插入函数模块
voidinsert()为插入函数,主要用了尾插法插入学生信息,主要代码如下
voidinsert()
{…………………
q=(student*)malloc(sizeof(student));
//建立新的结点
…………………..//输入学生信息
while(p!
=NULL)//循环
if(strcmp(p->
num,q->
num)==0)//判断链表中是否已有该学号
该学号已经存在,无法插入!
return;
}//若链表中已有该学号,则返回
p=p->
p=head;
for(i=0;
i<
length;
i++)//循环尾插法插入
q->
next=p->
p->
next=q;
length++;
//插入后链表长度增加
插入成功!
//返回成功
插入函数的难点在于新结点建立、信息输入、将信息插入链表等步骤的链接,还有结点的移动等核心算法。
(10)排序函数模块
排序模块是我遇到的最大难题,难在不仅要对整形数比大小,还要对学号这个字符串比大小,在编译时,老是出错,也想了好些天,但在同学及老师的帮助下还是把问题解决了,而关键在于对字符串比较函数的应用if(strcmp(p->
next->
num)>
0),这样编写问题就迎刃而解了。
排序模块主要有按学号排序、按各科目成绩排序。
按学号排序时,用的排序方法为结点交换的排序方法,主要代码为
while(head->
next!
=tail)//头指针不等于尾指针时
prep=head;
p=head->
while(p->
=tail)
0)//利用字符串比较函数对学号比较大小
{
temp=p->
//临时保存p的后继结点的值
prep->
next=p->
prep->
next=p;
p=temp;
//完成交换
p=p->
//节点后移
prep=prep->
tail=p;
}//完成排序
而按科目成绩排序时,采用的都是插入法排序,按成绩递减序列排序,核心算法如下
voidpaixusf(student*&
L)//将学生单链表按数分成绩递减排序
student*p,*pre,*q;
p=L->
//p指向L的第2个数据结点
L->
//构造只含一个数据结点的有序表
while(p!
{q=p->
//q保存*p结点后继结点的指针
pre=L;
//从有序表开头进行比较,pre指向插入*p的前驱结点
while(pre->
next!
=NULL&
&
pre->
math>
p->
math)
pre=pre->
//在有序表中找插入*p的前驱结点*pre
p->
next=pre->
//将*pre之后插入*p
pre->
next=p;
p=q;
//扫描原单链表余下的结点
运行结果为
(11)修改模块
修改的时候,首先是根据用户输入的学号查找该学生,若查找成功,则将用户输入的信息临时保存,然后替换原先的信息[5]
num,xg)==0)//查找成功,并显示被修改者的信息
…………………………..//显示要被修给的学生信息
请输入你要修改的学生的学号、姓名、数分、英语、数据结构:
scanf("
num1,name1,&
math1,&
English1,&
Data1);
strcpy(p->
num,num1);
//字符串复制函数修改学号,名字
name,name1);
p->
math=math1;
English=English1;
Data=Data1;
//修改成绩
修改成功\n"
t=0;
//修改成功,赋值为0
//指针移动
if(t==1)//查找失败,无修改者信息
找不到要修改的学号!
运行结果比较
修改前
修改后
7总结
在本次课程设计期间,我遇到了一些难点,开始的时候,代码中有许多的错误,特别是有一些调试方面的错误让我束手无策,随后的编程中又遇到了一些未知错误,只能一句一句去编译调试,遇到一些算法上的难题,就得去翻阅其它资料,书本看了一遍又一遍,算法推演了一遍又一遍,但付出总有收获的,经过几天的坚持不懈,程序编写成功,然后经过不断地优化排版,最终程序完美出炉,也达到了我心目中的目标。
通过这段时间的课程设计,不仅使我对线性表的链式储存有了更深的认识和理解,也使我更加明白线性表的链式储存在信息技术中的重要性和地位。
许多的错误让我明白了一个道理---毅力和信心对成功是非常重要的。
同时,对于编程者而言,思路清晰是相当重要的。
在适当的时候和同学一起交流探讨是一个十分好的学习机会。
请教老师也很重要,因为毕竟我们是新手,对于某些问题很难弄清楚。
而且,某些错误对于我们来说有时候想半天都弄不来,但老师几下下就搞好了,这样就更加有效地节约了时间。
同时,这次课程设计还让我学会了如何系统、正规的做一份课程设计报告,明白了做事情只有认真,才能真正做得更好!
8参考文献
[1]王舜燕/李民主编.C编程方法学.—武汉:
武汉理工大学出版社,2013.9.
[2]严蔚敏/吴伟民.数据结构.—北京:
清华大学出版社,2007.
[3](美)DawnGriffiths著/程亦超译.嗨翻C语言.—北京:
人民邮电出版社,2013.9
[4]
[5]赵端阳/左伍衡编著.算法分析与设计.—北京:
清华大学出版社,2012.3
9附录
代码
#include<
iostream>
stdio.h>
stdlib.h>
string.h>
windows.h>
#defineSTUDENT2
intlength;
voidcreate()//建立链表,学生信息建立函数
student*p1,*p2;
length=0;
intnumb;
//存储用户输入的学生个数
intnumber=0;
//存储已输入的学生个数
p1=(student*)malloc(sizeof(student));
p1->
num;
if(head==NULL)
head=p1;
//头结点地址赋于头指针
\t\t请先输入学生的个数:
//保存要输入的学生个数,用于后面循环输入信息
numb);
Sleep(666);
//清屏
输入学号、姓名、数分、英语、数据结构:
return;
voiddisplay()//显示函数,显示用户输入的学生信息
student*p=head->
所有的学生信息如下:
\t\t__________________________________________________\n"
\t\t学号姓名数分 英语数据结构\n"
voidsearch1()//按学号查找
charxh[20];
//保存用户输入的学号,用于后续比较查找
请输入学号"
%s"
xh);
if(p==NULL)//链表遍历完成,返回查找信息
voidsearch2()//按学号查找
charmz[20];
//保存用户输入的名字,用于后续比较查找
请输入名字"
mz);
name,mz)==0)//查找成功,显示查找信息
voidinsert()//尾插法插入学生信息
inti;
student*p,*q;
请输入你要插入的学生的学号、姓名、数分、英语、数据结构:
q=(student*)malloc(sizeof(student));
q->
q->
system("
i++)//循环
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构基础 学生成绩管理系统 c语言 数据结构 基础 学生 成绩管理系统 语言