数据结构基础学生成绩管理系统c语言.docx

上传人:b****1 文档编号:14335756 上传时间:2023-06-22 格式:DOCX 页数:37 大小:137.92KB
下载 相关 举报
数据结构基础学生成绩管理系统c语言.docx_第1页
第1页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第2页
第2页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第3页
第3页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第4页
第4页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第5页
第5页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第6页
第6页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第7页
第7页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第8页
第8页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第9页
第9页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第10页
第10页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第11页
第11页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第12页
第12页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第13页
第13页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第14页
第14页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第15页
第15页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第16页
第16页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第17页
第17页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第18页
第18页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第19页
第19页 / 共37页
数据结构基础学生成绩管理系统c语言.docx_第20页
第20页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构基础学生成绩管理系统c语言.docx

《数据结构基础学生成绩管理系统c语言.docx》由会员分享,可在线阅读,更多相关《数据结构基础学生成绩管理系统c语言.docx(37页珍藏版)》请在冰点文库上搜索。

数据结构基础学生成绩管理系统c语言.docx

数据结构基础学生成绩管理系统c语言

学号:

Xxxxx

 

《数据结构基础》课程报告

 

题目

学生成绩管理系统

学院

XXX

专业

XXX

班级

XXX

姓名

XXX

指导教师

XXX

 

2016

11

27

 

 

1.任务与目的

《数据结构基础》大作业要求学生对所选题目进行问题的分析、数据结构的比较选取、数据结构的存储方法以及算法的分析和编程实现。

本课程的主要目的是强化和巩固常用的数据结构使用方法,培养综合运用所学知识,分析和解决实际问题的能力。

通过大作业的完成,促使学生将数据结构的理论方法与实际应用相结合,让学生能比较全面而辩证地分析和处理问题,逐步树立正确的算法设计思想,熟练掌握常用数据结构的具体实现方法和分析方法,以及软件开发的基本技术和工作过程,培养严谨认真的科学态度和务实的工作作风。

2.题目描述

学生成绩管理:

实现功能:

输入、输出、插入、删除、查找、显示、保存、排序、修改、退出等。

用户使用该系统主要在于实现对学生信息的编写、修改、保存等操作。

3.设计目的

(1)基本掌握程序设计的基本思路、方法和技能;

(2)达到能掌握数据结构的基本知识并加以应用;

(3)能够利用所学的基本知识和技能,解决简单的程序设计问

(4)强化和巩固常用的数据结构使用方法,培养综合运用所学知识,分析和解决实际问题的能力

4.需求分析

作为基本的程序设计,显示界面要具有美观性,所以在程序设计时要考虑程序输出时的格式,所以我在编写程序时,从显示界面到各个部分都经过了详细的规划和编排,比如在下一个程序功能执行时,对前面显示的东西用system("Cls")进行清除操作,这样操作之后在屏幕上显示就不会杂乱了。

要设计的学生信息管理系统要完成学生信息的建立、显示、查找、插入、删除、保存、排序、修改、退出等基本功能,程序设计基础建立在已学过的数据结构、C语言等知识层面上,可自己增加程序的难度。

我要设计的程序主要应用到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

{

p2=(student*)malloc(sizeof(student));//建立结点

scanf("%s%s%d%d%d",p2->num,p2->name,&p2->math,&p2->English,&p2->Data);//输入学生信息

if(p2->num==0)

{

printf("信息输入成功!

\n");

break;

}

length++;//链表的长度

p1->next=p2;

p2->next=NULL;//结点相继后移

p1=p1->next;

number++;//记录已输入的学生个数

}

printf("信息输入成功!

\n");//返回成功

功能的选择是用户根据选择模块—屏幕上的提示做出的操作,可以看到,在进行下一操作之前,系统会进行清屏,然后显示本次的操作结果。

(6)显示模块及结果

voiddisplay(),这个模块并不是每个操作结果的输出函数,它会输出最终的结果,在进行了输入学生信息操作后,进行这个功能,系统就会输出全部的结果,见下图。

可以看出,系统已把上次的操作清屏,然后根据输入的2功能进行了显示操作。

输出是按循环输出的,用指针指向链表的各项数据,依次输出。

主要代码为

 

while(p!

=NULL)

{

printf("\t\t%-13s%-11s%-9d%-9d%d\n",p->num,p->name,p->math,p->English,p->Data);p=p->next;

}

(7)查找模块及结果

在程序设计时,并没有采用单一的按学号或按姓名查找的方式,而是既可以按学号查找,亦可按姓名查找,所以编写了voidsearch1()和voidsearch2()这两个查找函数,当输入的学号或姓名不在记录时,系统会显示“查无此人”,主要代码如下,链表不空时循环查找,然后用字符串比较函数[4]判断查找是否成功。

while(p!

=NULL)

{

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)//判断链表中是否已有该学号

{

printf("该学号已经存在,无法插入!

\n");

return;

}//若链表中已有该学号,则返回

p=p->next;}

p=head;

for(i=0;i

p=p->next;

q->next=p->next;

p->next=q;

length++;//插入后链表长度增加

printf("插入成功!

\n");//返回成功

插入函数的难点在于新结点建立、信息输入、将信息插入链表等步骤的链接,还有结点的移动等核心算法。

(10)排序函数模块

排序模块是我遇到的最大难题,难在不仅要对整形数比大小,还要对学号这个字符串比大小,在编译时,老是出错,也想了好些天,但在同学及老师的帮助下还是把问题解决了,而关键在于对字符串比较函数的应用if(strcmp(p->num,p->next->num)>0),这样编写问题就迎刃而解了。

排序模块主要有按学号排序、按各科目成绩排序。

按学号排序时,用的排序方法为结点交换的排序方法,主要代码为

while(head->next!

=tail)//头指针不等于尾指针时

{

prep=head;

p=head->next;

while(p->next!

=tail)

{

if(strcmp(p->num,p->next->num)>0)//利用字符串比较函数对学号比较大小

{

temp=p->next;//临时保存p的后继结点的值

prep->next=p->next;

p->next=p->next->next;

prep->next->next=p;

p=temp;//完成交换

}

p=p->next;//节点后移

prep=prep->next;

}

tail=p;

}//完成排序

而按科目成绩排序时,采用的都是插入法排序,按成绩递减序列排序,核心算法如下

voidpaixusf(student*&L)//将学生单链表按数分成绩递减排序

student*p,*pre,*q;

p=L->next->next;//p指向L的第2个数据结点

L->next->next=NULL;//构造只含一个数据结点的有序表

while(p!

=NULL)

{q=p->next;//q保存*p结点后继结点的指针

pre=L;//从有序表开头进行比较,pre指向插入*p的前驱结点

while(pre->next!

=NULL&&pre->next->math>p->math)

pre=pre->next;//在有序表中找插入*p的前驱结点*pre

p->next=pre->next;//将*pre之后插入*p

pre->next=p;

p=q;//扫描原单链表余下的结点

}

}

运行结果为

(11)修改模块

修改的时候,首先是根据用户输入的学号查找该学生,若查找成功,则将用户输入的信息临时保存,然后替换原先的信息[5]

while(p!

=NULL)

{

if(strcmp(p->num,xg)==0)//查找成功,并显示被修改者的信息

{

…………………………..//显示要被修给的学生信息

printf("请输入你要修改的学生的学号、姓名、数分、英语、数据结构:

\n");

scanf("%s%s%d%d%d",num1,name1,&math1,&English1,&Data1);

strcpy(p->num,num1);//字符串复制函数修改学号,名字

strcpy(p->name,name1);

p->math=math1;p->English=English1;p->Data=Data1;//修改成绩

printf("修改成功\n");

t=0;//修改成功,赋值为0

}

p=p->next;//指针移动

}

if(t==1)//查找失败,无修改者信息

{

printf("找不到要修改的学号!

\n");

}

运行结果比较

修改前

修改后

7总结

在本次课程设计期间,我遇到了一些难点,开始的时候,代码中有许多的错误,特别是有一些调试方面的错误让我束手无策,随后的编程中又遇到了一些未知错误,只能一句一句去编译调试,遇到一些算法上的难题,就得去翻阅其它资料,书本看了一遍又一遍,算法推演了一遍又一遍,但付出总有收获的,经过几天的坚持不懈,程序编写成功,然后经过不断地优化排版,最终程序完美出炉,也达到了我心目中的目标。

通过这段时间的课程设计,不仅使我对线性表的链式储存有了更深的认识和理解,也使我更加明白线性表的链式储存在信息技术中的重要性和地位。

许多的错误让我明白了一个道理---毅力和信心对成功是非常重要的。

同时,对于编程者而言,思路清晰是相当重要的。

在适当的时候和同学一起交流探讨是一个十分好的学习机会。

请教老师也很重要,因为毕竟我们是新手,对于某些问题很难弄清楚。

而且,某些错误对于我们来说有时候想半天都弄不来,但老师几下下就搞好了,这样就更加有效地节约了时间。

同时,这次课程设计还让我学会了如何系统、正规的做一份课程设计报告,明白了做事情只有认真,才能真正做得更好!

8参考文献

[1]王舜燕/李民主编.C编程方法学.—武汉:

武汉理工大学出版社,2013.9.

[2]严蔚敏/吴伟民.数据结构.—北京:

清华大学出版社,2007.

[3](美)DawnGriffiths著/程亦超译.嗨翻C语言.—北京:

人民邮电出版社,2013.9

[4]

[5]赵端阳/左伍衡编著.算法分析与设计.—北京:

清华大学出版社,2012.3

9附录

代码

#include

#include

#include

#include

#include

#defineSTUDENT2

typedefstructstudent//建立学生类

{

charnum[20];//学号

charname[20];//姓名

intmath;//数分

intEnglish;//英语

intData;//数据结构

structstudent*next;//指针

}student;

student*head=NULL;//头指针

intlength;//链表的长度

voidcreate()//建立链表,学生信息建立函数

{

student*p1,*p2;

length=0;

intnumb;//存储用户输入的学生个数

intnumber=0;//存储已输入的学生个数

p1=(student*)malloc(sizeof(student));//建立头结点

p1->num;

if(head==NULL)

head=p1;//头结点地址赋于头指针

printf("\t\t请先输入学生的个数:

");//保存要输入的学生个数,用于后面循环输入信息

scanf("%d",&numb);

Sleep(666);

system("Cls");//清屏

printf("输入学号、姓名、数分、英语、数据结构:

\n");

while(number

{

p2=(student*)malloc(sizeof(student));//建立结点

scanf("%s%s%d%d%d",p2->num,p2->name,&p2->math,&p2->English,&p2->Data);//输入学生信息

if(p2->num==0)

{

printf("信息输入成功!

\n");

break;

}

length++;//链表的长度

p1->next=p2;

p2->next=NULL;//结点相继后移

p1=p1->next;

number++;//记录已输入的学生个数

}

printf("信息输入成功!

\n");//返回成功

system("pause");

system("Cls");

return;

}

voiddisplay()//显示函数,显示用户输入的学生信息

{

student*p=head->next;

printf("所有的学生信息如下:

\n");

printf("\t\t__________________________________________________\n");

printf("\t\t学号姓名数分 英语数据结构\n");

while(p!

=NULL)

{

printf("\t\t%-13s%-11s%-9d%-9d%d\n",p->num,p->name,p->math,p->English,p->Data);p=p->next;

}

printf("\t\t__________________________________________________\n");

system("pause");

system("Cls");

return;}

 

voidsearch1()//按学号查找

{

charxh[20];//保存用户输入的学号,用于后续比较查找

student*p=head->next;

printf("请输入学号");

scanf("%s",xh);

while(p!

=NULL)

{

if(strcmp(p->num,xh)==0)//查找成功,显示查找信息

{

printf("\t\t__________________________________________________\n");

printf("\t\t学号姓名数分 英语数据结构\n");

printf("\t\t%-13s%-11s%-9d%-9d%d\n",p->num,p->name,p->math,p->English,p->Data);

printf("\t\t__________________________________________________\n");

return;

}

p=p->next;

}

if(p==NULL)//链表遍历完成,返回查找信息

printf("查无此人\n");

system("pause");

system("Cls");

}

voidsearch2()//按学号查找

{

charmz[20];//保存用户输入的名字,用于后续比较查找

student*p=head->next;

printf("请输入名字");

scanf("%s",mz);

while(p!

=NULL)

{

if(strcmp(p->name,mz)==0)//查找成功,显示查找信息

{

printf("\t\t__________________________________________________\n");

printf("\t\t学号姓名数分 英语数据结构\n");

printf("\t\t%-13s%-11s%-9d%-9d%d\n",p->num,p->name,p->math,p->English,p->Data);

printf("\t\t__________________________________________________\n");

return;

}

p=p->next;

}

if(p==NULL)//链表遍历完成,返回查找信息

printf("查无此人\n");

system("pause");

system("Cls");

}

 

voidinsert()//尾插法插入学生信息

{

inti;student*p,*q;p=head;

printf("请输入你要插入的学生的学号、姓名、数分、英语、数据结构:

\n");

q=(student*)malloc(sizeof(student));//建立新的结点

scanf("%s%s%d%d%d",q->num,q->name,&q->math,&q->English,&q->Data);

while(p!

=NULL)

{

if(strcmp(p->num,q->num)==0)//判断链表中是否已有该学号

{

printf("该学号已经存在,无法插入!

\n");

system("pause");

system("Cls");

return;

}//若链表中已有该学号,则返回

p=p->next;}

p=head;

for(i=0;i

p=p->ne

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

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2