1、 学 号: Xxxxx 《数据结构基础》课程汇报 题 目 学生成绩管理系统 学 院 XXX 专 业 XXX 班 级 XXX 姓 名 XXX 指导老师 XXX 年 11 月 27 日 目 录 目 录 2 1. 任务和目标 3 2. 题目描述 3 3. 设计目标 3 4. 需求分析 3 5. 问题分析及算法设计 4 5.1问题分析 4 5.2算法设计 4 6. 系统设计方案 4 6.1 系统功效 4 6.2程序设计及运行结果 5
2、 (1)主函数模块设计 5 (2)“屏幕”—显示函数模块设计 6 (3) 结构体定义 6 (5) 信息输入模块 7 (6) 显示模块及结果 8 (7) 查找模块及结果 9 (8) 删除模块 11 (9) 插入函数模块 11 (10) 排序函数模块 13 (11) 修改模块 14 7 总结 15 8 参考文件 16 9附录 16 代码 16 《数据结构基础》课程汇报成绩评定表 29 1. 任务和目标 《数据结构基础》大作业要求学生对所选题目进行问题分析、数据结构比较选择、数据结构存放方法和算法分析和编程实现。本课程关键目标是强
3、化和巩固常见数据结构使用方法,培养综合利用所学知识,分析和处理实际问题能力。经过大作业完成,促进学生将数据结构理论方法和实际应用相结合,让学生能比较全方面而辩证地分析和处理问题,逐步树立正确算法设计思想,熟练掌握常见数据结构具体实现方法和分析方法,和软件开发基础技术和工作过程,培养严谨认真科学态度和务实工作作风。 2. 题目描述 学生成绩管理:实现功效:输入、输出、插入、删除、查找、显示、保留、排序、修改、退出等。 用户使用该系统关键在于实现对学生信息编写、修改、保留等操作。 3. 设计目标 (1) 基础掌握程序设计基础思绪、方法和技能; (2) 达成能掌握数据结构基础知识并
4、加以应用; (3) 能够利用所学基础知识和技能,处理简单程序设计问 (4) 强化和巩固常见数据结构使用方法,培养综合利用所学知识,分析和处理实际问题能力 4. 需求分析 作为基础程序设计,显示界面要含有美观性,所以在程序设计时要考虑程序输出时格式,所以我在编写程序时,从显示界面到各个部分全部经过了具体计划和编排,比如在下一个程序功效实施时,对前面显示东西用system("Cls")进行清除操作,这么操作以后在屏幕上显示就不会杂乱了。 要设计学生信息管理系统要完成学生信息建立、显示、查找、插入、删除、保留、排序、修改、退出等基础功效,程序设计基础建立在已学过数据结构、C语言等知识层面
5、上,可自己增加程序难度。我要设计程序关键应用到C编程方法学[1]和数据结构[2]关键知识。基础要求需实现程序编译、链接、调试、运行。关键处理问题是程序编写,操作平台为VC++6.0 5. 问题分析及算法设计 5.1问题分析 这个程序要设计整体思想就是模块化编程,因为程序集多个功效于一体,然后依据用户输入要求实施对应子模块,以此达成功效实现。所以主函数就能够用switch结构实现,然后分别按功效编写模块函数了。 5.2算法设计 经过问题分析,程序大致结构已经确定,然后就要考虑该使用那些算法了。因为程序要存放一连串学生信息,且包含多个数据项,所以能够用数组、结构体、次序表、单链表等实
6、现,但要实现查找、排序、删除等多种功效,单链表就显得更适宜些,同时也能锻炼我们对链表使用技巧,所以经过思量,决定用单链表来实现编程。 6. 系统设计方案 6.1 系统功效 首先要确定学生信息应包含:学号,姓名,科目,成绩业等。其次,学生信息管理系统应提供功效包含: (1) 系统以菜单方法显示 (2) 要有学生信息录入功效 (3) 学生信息浏览功效 (4) 学生信息用文件保留 (5) 按学号查询、按姓名查询 (6) 能够按学号、科目成绩等排序 (7) 学生信息删除修改 (8) 学生信息修改 (9) 退出 结合实际情况及本身能力,确定了以上要编写并实现功效。 6.2程序
7、设计及运行结果 (1)主函数模块设计 之前已确定主函数能够用switch结构实现,只要将系统功效经分析排版后写入主函数中每个case即可,所以主函数能够下编写[3] //主函数 int main(void) { menu(); //调用显示函数 while(1) { printf("\t\t请选择对应功效:"); scanf("%d",&a); switch(a) { case 0: //退出系统 case 1:
8、 //学生信息输入 case 2: //信息显示 case 3: //查找信息 case 4: //删除学生信息 case 5 : //插入学生信息(尾插法) case 6: //学生信息排序 case 7 : //修改信息
9、 case 8 : //保留成绩至文件 default: //输入其它情况,循环重新输入 break; }} system("pause"); return 0; } 如此编写,能够使主函数既简单易懂,又不杂乱,能让读者一目了然,有了主函数,以后就能够往主函数中加子模块了。 (2)“屏幕”—显示函数模块设计 显示器幕,也就是要给用户提供功效选择主界面,需明了,整齐,要达成用户感觉到系统操作很其实简单效果,所以编译排版以后界面效果见下图 能够从上图看出,只要
10、用户按自己需求进行操作,就能够实现对应功效了。程序设计该函数为void menu()。 (3) 结构体定义 “结构体名”用作结构体类型标志,它又称“结构体标识”。申明一个结构体类型通常形式为: Struct 结构体名 {组员表列}; 大括弧内是该结构体中各个组员,由它们组成一个结构体。对各组员全部应进行类型申明,即 类型名 组员名 我在结构体中定义了两个字符数组及三个整形变量,用于存放学号、姓名、三个科目标成绩,并在结构体中定义了一个指针,为单链表所需,用于指向下一结点。 typedef struct student //建立学生类 { c
11、har num[20]; //学号 char name[20]; //姓名 int math; //数分 int English; //英语 int Data; //数据结构 struct student *next; //指针 }student; student *head=NULL; //头指针 (5)
12、 信息输入模块
对应函数为void create(),可用链表建立学生信息,所以先要建立一个头结点
p1=(student *)malloc(sizeof(student));//建立头结点
然后让指针指向下一个结点,依次依据用户输入学生个数循环建立链表(学生信息)
所以关键循环为while
while(number
13、p2->English,&p2->Data); //输入学生信息 if(p2->num==0) { printf("信息输入成功!\n"); break; } length++; //链表长度 p1->next=p2; p2->next=NULL; //结点相继后移 p1=p1->next; number++; //统计已输入学生个数 } printf("信息输入成功!\n"); //返回成功
14、 功效选择是用户依据选择模块—屏幕上提醒做出操作,能够看到,在进行下一操作之前,系统会进行清屏,然后显示此次操作结果。 (6) 显示模块及结果 void display(),这个模块并不是每个操作结果输出函数,它会输出最终结果,在进行了输入学生信息操作后,进行这个功效,系统就会输出全部结果,见下图。能够看出,系统已把上次操作清屏,然后依据输入2 功效进行了显示操作。输出是按循环输出,用指针指向链表各项数据,依次输出。关键代码为 while(p!=NULL) { printf("\t\t%-13s%-11s%-9d%-9d%d\n",p->num,p->name,p
15、>math,p->English,p->Data); p=p->next; } (7) 查找模块及结果 在程序设计时,并没有采取单一按学号或按姓名查找方法,而是既能够按学号查找,亦可按姓名查找,所以编写了void search1()和void search2()这两个查找函数,当输入学号或姓名不在统计时,系统会显示“查无此人”,关键代码以下,链表不空时循环查找,然后用字符串比较函数[4]判定查找是否成功。 while(p!=NULL) { if(strcmp(p->num,xh)==0) //查找成功,显示查找信息 { ………
16、…………………….//显示查找到信息 } } if(p==NULL) //链表遍历完成,返回查找信息 printf("查无此人\n"); (8) 删除模块 void Delete() 为删除模块函数,按输入学号删除信息,首先会依据用户输入学号查找该学号对应信息,假如统计中没有,则系统返回查无此人,假如查找成功,则会删除该学生全部信息,代码同查找一样,在while循环中用了字符串比较函数,若查找成功,则删除,不然返回查无此人。 (9) 插入函数模块 void insert() 为插入函数,关键用了尾插
17、法插入学生信息,关键代码以下 void insert() {………………… q=(student *)malloc(sizeof(student)); //建立新结点 ………………….. //输入学生信息 while(p!=NULL) //循环 { if(strcmp(p->num,q->num)==0) //判定链表中是否已经有该学号 { printf("该学号已经存在,无法插入!\n"); return; } //若链表中
18、已经有该学号,则返回
p=p->next;}
p=head;
for(i=0;i
19、难在不仅要对整形数比大小,还要对学号这个字符串比大小,在编译时,老是犯错,也想了好些天,但在同学及老师帮助下还是把问题处理了,而关键在于对字符串比较函数应用 if(strcmp(p->num,p->next->num)>0) ,这么编写问题就迎刃而解了。 排序模块关键有按学号排序、按各科目成绩排序。按学号排序时,用排序方法为结点交换排序方法,关键代码为 while( head->next != tail ) //头指针不等于尾指针时 { prep = head; p = head->next; while( p->next != tail
20、 ) { 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 =
21、 p->next; // 节点后移 prep = prep->next; } tail = p; } //完成排序 而按科目成绩排序时,采取全部是插入法排序,按成绩递减序列排序,关键算法以下 void paixusf(student *&L) //将学生单链表按数分成绩递减排序 student *p,*pre,*q; p=L->next->next; //p指向L第2个数据结点 L->next->next=NUL
22、L; //结构只含一个数据结点有序表 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; //扫描原单链表余下结点 } }
23、 运行结果为 (11) 修改模块 修改时候,首先是依据用户输入学号查找该学生,若查找成功,则将用户输入信息临时保留,然后替换原先信息[5] while(p!=NULL) { if(strcmp(p->num,xg)==0) //查找成功,并显示被修改者信息 { ………………………….. //显示要被修给学生信息 printf("请输入你要修改学生学号、姓名、数分、英语、数据结构:\n"); scanf("%s %s %d %d %d",num1,name1,&math1,&English1,&
24、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) //
25、查找失败,无修改者信息 { printf("找不到要修改学号!\n"); } 运行结果比较 修改前 修改后 7 总结 在此次课程设计期间,我碰到了部分难点,开始时候,代码中有很多错误,尤其是有部分调试方面错误让我束手无策,随即编程中又碰到了部分未知错误,只能一句一句去编译调试,碰到部分算法上难题,就得去翻阅其它资料,书本看了一遍又一遍,算法推演了一遍又一遍,但付出总有收获,经过几天坚持不懈,程序编写成功,然后经过不停地优化排版,最终程序完美出炉,也达成了我心目中目标。 经过这段时间课程设计,不仅使我对线性表链式储存有了更深认识和了
26、解,也使我愈加明白线性表链式储存在信息技术中关键性和地位。很多错误让我明白了一个道理---毅力和信心对成功是很关键。同时,对于编程者而言,思绪清楚是相当关键。在合适时候和同学一起交流探讨是一个十分好学习机会。请教老师也很关键,因为毕竟我们是新手,对于一些问题极难搞清楚。而且,一些错误对于我们来说有时候想半天全部弄不来,但老师几下下就搞好了,这么就愈加有效地节省了时间。同时,这次课程设计还让我学会了怎样系统、正规做一份课程设计汇报,明白了做事情只有认真,才能真正做得愈加好! 8 参考文件 [1] 王舜燕/李民主编. C编程方法学.—武汉:武汉理工大学出版社,.9. [2] 严蔚敏/吴伟
27、民. 数据结构.—北京:清华大学出版社,.
[3] (美)Dawn Griffiths 著/程亦超 译. 嗨翻C语言.—北京:人民邮电出版社,.9
[4]
[5] 赵端阳/左伍衡编著. 算法分析和设计.—北京:清华大学出版社,.3
9附录
代码
#include
28、char num[20]; //学号 char name[20]; //姓名 int math; //数分 int English; //英语 int Data; //数据结构 struct student *next; //指针 }student; student *head=NULL; //头指针 int
29、length; //链表长度 void create() //建立链表,学生信息建立函数 { student *p1,*p2; length=0; int numb; //存放用户输入学生个数 int number=0; //存放已输入学生个数 p1=(student *)malloc(sizeof(student));//建立头结点 p1->num;
30、
if(head==NULL)
head=p1; //头结点地址赋于头指针
printf("\t\t请先输入学生个数:");//保留要输入学生个数,用于后面循环输入信息
scanf("%d",&numb);
Sleep(666);
system("Cls"); //清屏
printf("输入学号、姓名、数分、英语、数据结构:\n");
while(number 31、lloc(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;
num 32、ber++; //统计已输入学生个数
}
printf("信息输入成功!\n"); //返回成功
system("pause");
system("Cls");
return;
}
void display() //显示函数,显示用户输入学生信息
{
student *p=head->next;
printf("全部学生信息以下:\n");
printf("\t\t_________________________________________ 33、\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");
34、
system("Cls");
return; }
void search1() //按学号查找
{
char xh[20]; //保留用户输入学号,用于后续比较查找
student *p=head->next;
printf("请输入学号");
scanf("%s",xh);
while(p!=NULL)
{
if(strcmp(p->num,xh)==0) //查找成功,显示查找信息
{
printf("\ 35、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->n 36、ext;
}
if(p==NULL) //链表遍历完成,返回查找信息
printf("查无此人\n");
system("pause");
system("Cls");
}
void search2() //按学号查找
{
char mz[20]; //保留用户输入名字,用于后续比较查找
student *p=head->next;
printf("请输入名字");
scanf("%s" 37、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);
38、 printf("\t\t__________________________________________________\n");
return;
}
p=p->next;
}
if(p==NULL) //链表遍历完成,返回查找信息
printf("查无此人\n");
system("pause");
system("Cls");
}
void insert() //尾插法插入学生信息
{
int i; s 39、tudent *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");
s 40、ystem("pause");
system("Cls");
return;
} //若链表中已经有该学号,则返回
p=p->next;}
p=head;
for(i=0;i 41、"pause");
system("Cls");
return;
}
void Delete() //按输入学号删除信息
{
char b[20]; //用于保留用户输入要删除学生学号,用于比较
student *p,*q; q=head,p=head->next;
printf("请输入要删除学生学号:\n"); scanf("%s",b);
while(p!=NULL)
{
if(strcmp(p->num,b)==0) //判定相同则删 42、除
{
q->next=p->next; //删除指定结点
free(p); //结点释放
length--;
printf("删除成功!\n");
return; //删除成功后返回
}
p=p->next; //指针后移
q=q->next;
}
if(p==NULL) //遍历完成,未找到信息
{
printf("找不到要删除学号!\n");
//ret 43、urn;
}
system("pause");
system("Cls");
}
void menu() //显示函数----屏幕
{
printf("\t\t________________________________\n");
printf("\t\t| 学生信息管理系统 |\n");
printf("\t\t| 1、 信息输入 |\n");
printf("\t\t| 2、 显示信息 |\n");
printf( 44、"\t\t| 3、 查找学生信息 |\n");
printf("\t\t| 4、 删除指定学生信息 |\n");
printf("\t\t| 5、 插入学生信息 |\n");
printf("\t\t| 6、 排序 |\n");
printf("\t\t| 7、 修改 |\n");\
printf("\t\t| 8、 保留 |\n");
printf("\t\t| 0、 退出系统 45、 |\n");
printf("\t\t|______________________________|\n");
return; }
void paixuxh(student *head) //利用结点交换方法对学号进行排序
{
student *p,*prep,*temp,*tail; //定义所需结点
tail=NULL;
while( head->next != tail )
{
prep = head;
p = head->next;
while( p->next != tail )
46、 {
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; //完成交换
}
47、 // 节点后移
p = p->next;
prep = prep->next;
}
tail = p;
} // 第一个while
printf("\t\t排序成功\n");
}
void paixusf(student *&L) //将学生单链表按数分成绩递减排序strcmp(
{
student *p,*pre,*q;
p=L->next->next; //p指向L第2个数据结点
L- 48、>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; //扫描原 49、单链表余下结点
}
}
void paixuyy(student *&L) //将学生单链表按英语成绩递减排序
{
student *p,*pre,*q;
p=L->next->next;
L->next->next=NULL;
while (p!=NULL)
{ q=p->next;
pre=L;
while (pre->next!=NULL && pre->next->English>p->English)
pre=pre->next;
p->next=pre->next;
pre->next=p 50、
p=q;
}
}
void paixusj(student *&L) //将学生单链表按数据结组成绩递减排序
{
student *p,*pre,*q;
p=L->next->next;
L->next->next=NULL;
while (p!=NULL)
{ q=p->next;
pre=L;
while (pre->next!=NULL && pre->next->Data>p->Data)
pre=pre->next;
p->next=pre->next;
pre->next=
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818