吉林大学c语言编程实验学生成绩管理系统.docx
- 文档编号:4369745
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:29
- 大小:242.49KB
吉林大学c语言编程实验学生成绩管理系统.docx
《吉林大学c语言编程实验学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《吉林大学c语言编程实验学生成绩管理系统.docx(29页珍藏版)》请在冰豆网上搜索。
吉林大学c语言编程实验学生成绩管理系统
学生成绩管理系统
一.系统功能结构图
二.数据结构的设计及用法说明
数据结构设计:
本程序利用c语言结构体及链表等数据结构完成对学生成绩的动态管理。
将一个学生当作一个结点,这个结点的类型为结构体,结构体中的域表示学生的属性,每个结点除了存放属性外,还存放结点之间的关系,即存放指向后继结点的指针。
所以定义表结点结构如下:
#defineN4
typedefstructs1
{charno[11];
charname[15];
charsex[7];
charage[3];
intscore[N];
floatsum;
floataverage;
intorder;
structs1*next;
}STUDENT;
三.程序流程图(见附录II)
四.模块功能
Main()主函数
主函数是程序的入口,采用模块化设计。
首先声明必要的变量,然后进行链表的初始化,完成程序入口。
init()初始化
单链表需要一个头指针指向表的第一个结点,对单链表的访问使从头指针开始的,初始化单链表为空。
空用NULL表示,该值在头文件stdio.h中定义为常数0.
_menu主菜单
程序引用putch()输出图形符号的ASCII码值来实现边框。
利用window函数制作显示窗口,该窗口比边框略小一些,正好包含于边框之中。
通过key()实现对光标键的捕捉,光条的移动通过ups()和dns()实现。
同时检测ENTER键,若捕捉到此键,则执行相应的函数模块。
create()创建单链表
进入主菜单中的“Enterlist”选项,进入创建链表函数,即输入学生信息,按照提示信息输入学号,姓名,性别,课程成绩,每输入一个数按一下回车,当输入学号字符为@时结束输入,返回主函数,单链表创建完毕,输入界面如图:
数据完整性的验证由两个函数create()和inputs()完成。
设置头指针为空,申请内存空间,如果申请不到,则内存空间满,无法保存数据,则返回主函数,否则输入数据,并进行相应的校监,成绩就在create()中边输入边验证,以保证输入和法数据。
当成绩输入后,系统自动计算生成总分和平均分,并将名次数据先置1,待排序后再赋予新值。
数据输入后,将其后继结点指针指向前头的结点,新头指针指向新插入的结点,这样新插入的结点总在前头。
数据输入结束后返回链表的头指针,返回_menu()函数,进行其他操作。
delete()删除结点
删除指定学号的学生记录。
首先输入要删除结点的学号,输入后根据学号顺序查找结点,如果没找到,则输出没找到信息;否则,显示找到的结点信息,按任意键后显示已删除信息。
注意删除结点时的操作,如果该结点是首结点,则要修改头指针,否则,将该结点的前趋指针的后继指向其后继结点,然后释放该结点。
print()显示单链表
本函数实现显示链表数据功能。
由于链表只能采取顺序访问的方法,所以定义一个指向结点的临时变量p,初值为单链表的头指针,输出指针所指的记录的数据后,将指针后移一个记录,直到p指针值为空值,则所有记录输出完毕。
search()查找结点
按照姓名查找结点,从头结点开始顺序查找,成功显示记录信息,失败,显示没找到。
姓名是字符串,比较功能利用字符串比较函数strcmp()实现。
save()保存记录到文件
将学生信息保存到指定文件中。
按照文件读写要求,先定义一个指向文件的指针,输入要保存的磁盘文件名,如果输入的是绝对路径,则文件保存到指定位置;如果只给文件名,则文件保存在TurboC默认的路径下,
load()从文件中读取记录
按照文件读写要求,先定义一个指向文件的指针,输入要读入数据的磁盘文件名,然后确定文件的大开放式。
如果文件打不开,则退出函数,否则选择一种度文件方式,从文件头开始,将记录读入内存,直到文件尾。
computer()计算各门课程的总分和课程平均分
头指针开始,每读一条记录,分别累加各科成绩,并统计记录条数,当所有数据处理完毕,求出平均分,最后输出结果为所有学生各门课程的总分和平均分。
insert()插入结点
插入结点需要输入插入位置和新结点信息。
输入某个结点的学号,新结点将插入在这个指定结点之前。
申请空间得到指针info,输入新结点信息,存放到新申请的空间info中。
设链表的头指针为h,p为指定结点的指针,q为p的前驱指针,从头结点开始循环移动指针p查找指定的结点,查找和插入时分一下几种情况处理:
1指针为空,如果p等于头h,说明链表为空,则新结点为头结点,修改指针h=info,否则,说明没有指定结点。
则新结点在表尾部,此时q所指的结点时最后一个结点,所以修改指针q->next=info。
2指针p不为空,如果p=h,说明新结点插入在当前结点之前,为新的头结点,修改指针info=next=p,h=info。
否则,说明新结点的位置在p和q之间,修改指针为info->next=p,q->next=info
sort()分类统计
从头指针开始,分别对学生的各门功课成绩进行判别,并按照科目输出处于各个分数段的学生学号,姓名,成绩。
五.实验结果
菜单界面,如图一所示;
记录输入,如图
删除记录,如图所示,
显示记录,如图所示;
查询记录,如图所示;
计算各门功课的总分即平均分,如图所示;
六.体会
通过一周的计算机能力训练,在老师的耐心指导及自己的努力下,使自己对c语言有了新的认识,并初步领会了编程的思想。
,使对c语言的了解也开始有知识向应用过度。
虽然现在能力还挺有限,但自己还是感觉学了很多东西。
在程序编写过程中,首先应该从整体入手,掌握大体的框架,然后再具体到模块,并建立程序流程图。
再进入各模块的开发。
最后,把各模块联系起来并进行程序的调试。
通过具体的实践,我深刻的感觉到了自己知识的不足。
所以在编写程序时要学习很多新的知识,这时相关的网站及图书馆就成了最好的助手。
不能错过!
最后,感谢老师耐心,细致,热情的辅导及鼓励。
七.附录I——程序清单
/*ScoreManagementSystemofStudent*/
/*Welcometomysystem*/
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"conio.h"
#include"mem.h"
#include"ctype.h"
#include"alloc.h"
#defineN4
typedefstructs1
{charno[9];
charname[15];
intscore[N];
charsex[2];
intage;
floatsum;
floataverage;
intorder;
structs1*next;
}STUDENT;
/*以下是函数原型*/
STUDENT*init();
STUDENT*create();
STUDENT*delete(STUDENT*h);
voidprint(STUDENT*h);
voidsearch(STUDENT*h);
voidsave(STUDENT*h);
STUDENT*load();
voidcomputer(STUDENT*h);
STUDENT*insert(STUDENT*h);
void*all_sum_ave(STUDENT*h);
voidgrade();
voidcopy();
STUDENT*sort(STUDENT*h);
intmenu_select();
intsubmenu();
voidgrade00(STUDENT*h);
voidgrade60(STUDENT*h);
voidgrade70(STUDENT*h);
voidgrade80(STUDENT*h);
voidgrade90(STUDENT*h);
/******主函数*******/
main()
{
inti;
STUDENT*head;
head=init();
clrscr();/*清屏*/
for(;;)/*无限循环*/
{
switch(menu_select())/*调用主菜单函数,返回值整数作开关语句的条件*/
{/*值不同,执行的函数不同,break不能省略*/
case0:
head=init();break;/*执行初始化*/
case1:
head=create();break;/*创建链表*/
case2:
head=delete(head);break;/*删除记录*/
case3:
print(head);break;/*显示全部记录*/
case4:
search(head);break;/*查找记录*/
case5:
save(head);break;/*保存文件*/
case6:
head=load();break;/*读文件*/
case7:
computer(head);break;/*计算总分和均分*/
case8:
head=insert(head);break;/*插入记录*/
case9:
head=sort(head);break;/*排序*/
case10:
grade();break;
case11:
exit(0);/*如菜单返回值为11程序结束*/
}}}
/******主菜单函数******/
menu_select()
{
char*menu[]={"******************MENU************************",/*定义菜单字符串数组*/
"0.Initlist",/*初始化*/
"1.Enterlist",/*输入记录*/
"2.Deletearecordfromlist",/*从表中删除记录*/
"3.printlist",/*显示单链表中所有记录*/
"4.Searchrecordonname",/*按照姓名查找记录*/
"5.Savethefile",/*将单链表中记录保存到文件中*/
"6.Loadthefile",/*从文件中读入记录*/
"7.SumandAverage",/*计算所有学生的总分和均分*/
"8.Insertrecordtolist",/*插入记录到表中*/
"9.Sorttomakenewfile",/*排序*/
"10.Classificationthescore",/**/
"11.Quit",
"****************20051118*********************"
};
chars[3];/*以字符形式保存选择号*/
intc,i;/*定义整形变量*/
gotoxy(1,1);/*移动光标*/
printf("pressanykeytocontinue...\n");/*压任一键进入主菜单*/
getch();/*输入任一键*/
clrscr();/*清屏幕*/
gotoxy(1,1);/*移动光标*/
textcolor(WHITE);/*设置文本显示颜色为白色*/
textbackground(BLUE);/*设置背景颜色为蓝色*/
gotoxy(10,2);/*移动光标*/
putch(0xc9);/*输出左上角边框┏*/
for(i=1;i<64;i++)
putch(0xcd);/*输出上边框水平线*/
putch(0xbb);/*输出右上角边框┓*/
for(i=3;i<20;i++)
{
gotoxy(10,i);putch(0xba);/*输出左垂直线*/
gotoxy(74,i);putch(0xba);
}/*输出右垂直线*/
gotoxy(10,20);putch(0xc8);/*输出左下角边框┗*/
for(i=1;i<64;i++)
putch(0xcd);/*输出下边框水平线*/
putch(0xbc);/*输出右下角边框┛*/
window(11,3,73,19);/*制作显示菜单的窗口,大小根据菜单条数设计*/
clrscr();/*清屏*/
for(i=0;i<14;i++)/*输出主菜单数组*/
{
gotoxy(10,i+1);
cprintf("%s",menu[i]);
}
textbackground(13);/*设置背景颜色为黑色*/
window(1,1,80,25);/*恢复原窗口大小*/
gotoxy(10,21);/*移动光标*/
do{
printf("\n\tEnteryourchoice(0~11)tocontinue...");/*在菜单窗口外显示提示信息*/
scanf("%s",s);/*输入选择项*/
c=atoi(s);/*将输入的字符串转化为整形数*/
}while(c<0||c>12);/*选择项不在0~12之间重输*/
returnc;/*返回选择项,主程序根据该数调用相应的函数*/
}
/*初始化*/
STUDENT*init()
{returnNULL;
}
/*创建链表*/
STUDENT*create()
{inti;ints;
STUDENT*h=NULL,*info;/*STUDENT指向结构体的指针*/
for(;;)
{
info=(STUDENT*)malloc(sizeof(STUDENT));/*申请空间*/
if(!
info)/*如果指针info为空*/
{
printf("\noutofmemory");/*输出内存溢出*/
returnNULL;/*返回空指针*/
}
inputs("EntertheNo.as20051118.[Type#toEndEnter]:
",info->no,9);/*输入学号并校验*/
if(info->no[0]=='#')break;/*如果学号首字符为#则结束输入*/
inputs("Entername:
",info->name,15);/*输入姓名,并进行校验*/
inputs("EnterthesexM(ale)orF(emale):
",info->sex,2);
do{
printf("Entertheageofthestudent:
");
scanf("%d",&info->age);
if(info->age>30||info->age<0)
printf("\x07AGEERROR!
!
TYPEAGAIN!
\n");
}while(info->age<0||info->age>30);
printf("pleaseinputstudentsscores:
\n");/*提示开始输入成绩*/
s=0;/*计算每个学生的总分,初值为0*/
for(i=0;i { do{ switch(i) {case0: printf("pleaseinputENGLISHscores: ");break; case1: printf("pleaseinputMATHscores: ");break; case2: printf("pleaseinputClanguagescores: ");break; case3: printf("pleaseinputmazhescores: ");break; } scanf("%d",&info->score[i]);/*输入成绩*/ if(info->score[i]>100||info->score[i]<0)/*确保成绩在0~100之间*/ printf("DATAERROR! ! TYPEAGAIN! \n");/*出错提示信息*/ }while(info->score[i]>100||info->score[i]<0); s=s+info->score[i];/*累加各门课程成绩*/ } info->sum=s;/*将总分保存*/ info->average=(float)s/N;/*求出平均值*/ info->order=0;/*未排序前此值为0*/ info->next=h;/*将头结点做为新输入结点的后继结点*/ h=info;/*新输入结点为新的头结点*/ } return(h);/*返回头指针*/ } /*输入字符串,并进行长度验证*/ inputs(char*prompt,char*s,intcount) { charp[255]; do{ printf(prompt);/*显示提示信息*/ scanf("%s",p);/*输入字符串*/ if(strlen(p)>count)printf("\ntoolong! \n");/*进行长度校验,超过count值重输入*/ }while(strlen(p)>count); strcpy(s,p);/*将输入的字符串拷贝到字符串s中*/ } /*输出链表中结点信息*/ voidprint(STUDENT*h) { inti=0;/*统计记录条数*/ STUDENT*p;/*移动指针*/ clrscr();/*清屏*/ p=h;/*初值为头指针*/ printf("\n\n\n**********************************STUDENT***************************************\n"); printf("|rec|No|name|sex|age|eg|MATH|CLANG|MA|sum|ave|order|\n"); printf("|---|--------|------------|---|---|----|----|------|----|------|-----|-----|\n"); while(p! =NULL) { i++; printf("|%-3d|%-8s|%-12s|%1s|%3d|%4d|%4d|%6d|%4d|%4.2f|%5.2f|%3d|\n",i,p->no,p->name,p->sex,p->age,p->score[0],p->score[1], p->score[2],p->score[3],p->sum,p->average,p->order); p=p->next; } printf("************************************end*****************************************\n"); } /*****删除记录*****/ STUDENT*delete(STUDENT*h) {STUDENT*p,*q;/*p为查找到要删除的结点指针,q为其前驱指针*/ chars[9];/*存放学号*/ system("cls"); clrscr();/*清屏*/ printf("pleasedeletedno\n");/*显示提示信息*/ scanf("%s",s);/*输入要删除记录的学号*/ q=p=h;/*给q和p赋初值头指针*/ while(strcmp(p->no,s)&&p! =NULL)/*当记录的学号不是要找的,或指针不为空时*/ { q=p;/*将p指针值赋给q作为p的前驱指针*/ p=p->next;/*将p指针指向下一条记录*/ } if(p==NULL)/*如果p为空,说明链表中没有该结点*/ printf("\nlistno%sstudent\n",s); else/*p不为空,显示找到的记录信息*/ {printf("\n\n\n***********************************STUDENT**************************************\n"); printf("|No|name|sex|age|sc1|sc2|sc3|sc4|sum|ave|order|\n"); printf("|----------|---------------|---|---|---|---|---|---|--------|-------|-----|\n"); printf("|%-10s|%-15s|%1s|%3d|%3d|%3d|%3d|%3d|%4.2f|%4.2f|%3d|\n",p->no,p->name,p->sex,p->age,p->score[0],p->score[1], p->score[2],p->score[3],p->sum,p->average,p->order); printf("************************************end*****************************************\n"); getch();/*压任一键后,开始删除*/ if(p==h)/*如果p==h,说明被删结点是头结点*/ h=p->next;/*修改头指针指向下一条记录*/ else q->next=p->next;/*不是头指针,将p的后继结点作为q的后继结点*/ free(p);/*释放p所指结点空间*/ printf("\nhavedeletedNo%sstudent\n",s); printf("Don'tforgetsave\n");/*提示删除后不要忘记保存文件*/ } return(h);/*返回头指针*/ } /*查找记录*/ voidsearch(STUDENT*h) { STUDENT*p;/*移动指针*/ chars[15];/*存放姓名的字符数组*/ clrscr();/*清屏幕*/ printf("Pleaseenternameforsearching\n"); scanf("%s",s);/*输入姓名*/ p=h;/*将头指针赋给p*/ while(strcmp(p->name,s)&&p! =NULL)/*当记录的姓名不是要找的,且指针不为空时*/ p=p->next;/*移动指针,指向下一结点*/ if(p==NULL)/*如果指针为空*/ printf("\n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 吉林大学 语言 编程 实验 学生 成绩管理系统