C语言 学生成绩管理系统.docx
- 文档编号:9220861
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:62
- 大小:360.52KB
C语言 学生成绩管理系统.docx
《C语言 学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《C语言 学生成绩管理系统.docx(62页珍藏版)》请在冰豆网上搜索。
C语言学生成绩管理系统
泉州师范学院数学与计算机科学学院
《高级语言程序设计》
综合实验报告
目录
1实验题目:
学生成绩管理系统3
2实验目的与实验要求3
2.1.实验目的3
2.2.实验要求3
3功能描述4
3.1、输入学生信息4
3.2、注销学生信息4
3.3、查询学生信息4
3.4、修改学生信息4
3.5、添加学生信息4
3.6、学生信息排序4
3.7、学生信息统计5
3.8、显示学生信息5
3.9、帮助信息5
3.10、退出本系统5
4内容与设计思想5
4.1系统流程图5
4.2详细设计6
5运行结果及测试27
6总结37
6.1碰到的问题37
6.2程序有待改进的地方38
6.3心得和体会38
7参考文献38
8附录(程序清单及注释)39
1实验题目:
学生成绩管理系统
2实验目的与实验要求
2.1.实验目的
1)能够利用所学的基本知识和技能,解决简单的程序设计问题;
2)进一步理解和运用结构化程序设计的思想和方法;
3)初步掌握开发一个小型实用系统的基本方法;
4)学会利用流程图或N-S图表示算法;
5)掌握书写程序设计开发文档的能力。
2.2.实验要求
Ø基本要求:
1)要求利用C语言面向过程的编程思想来完成系统的设计;
2)突出C语言的函数特征,以多个函数实现每一个子功能;
3)画出功能模块图;
4)进行简单界面设计(见附录图1),能够实现友好的交互;
5)具有清晰的程序流程图和数据结构的详细定义;
6)按实验报告电子模板格式填写实验内容。
Ø创新要求:
在基本要求达到后,可进行创新设计,如系统用户功能控制,对管理员级和一般级别的用户系统功能操作不同。
3功能描述
3.1、输入学生信息
按照提示输入10个学生的学号、姓名、性别及三门功课(数学、英语、计算机)的成绩。
3.2、注销学生信息
按照学号查找是否存在该学生的记录,若存在删除其记录,不存在给出相应信息。
(功能可以扩展:
按姓名删除记录。
)
3.3、查询学生信息
按照学号查找是否存在该学生的记录,若存在则输出其各科成绩,不存在给出相应信息。
(功能可以扩展:
按姓名进行查找。
)
3.4、修改学生信息
按照提示修改某一名学生的学号、姓名、性别及各科成绩。
3.5、添加学生信息
添加新生信息到已有的学生链表(要求按学号的顺序插入)。
3.6、学生信息排序
按学号对所有学生进行排序。
(功能可以扩展:
按姓名或者按照成绩进行排序。
)
3.7、学生信息统计
(1)输入学生的学号,则统计该生的总分及平均分;
(2)输入课程名,则求出该门课程的总平均分。
3.8、显示学生信息
显示系统中所有学生的信息。
3.9、帮助信息
获得帮助信息。
3.10、退出本系统
4内容与设计思想
4.1系统流程图
1234567890
4.2详细设计
(1)主函数main()模块
该模块功能说明:
利用C语言面向过程的编程思想来完成对学生管理系统的设计。
(2)显示第一个页面:
(3)算法说明及N-S流程图
说明:
通过switch语句选择对学生管理系统的操作。
N-S流程图:
n=0
读入一个数字(0-9)给choose
是chooce=1否
调用cre
at()
是choose=2否
调用
del
()
是choose=3否
调用
sear
ch()
是choose=4否
调
用
modi
fy()
是choose=5否
调用
add
()
是choose=6否
调用
sort
()
是choose=7否
调用
sta()
是choose=8否
调用
disp
lay()
是choose=9否
调
用
help
()
退出
(4)关键代码及代码注释
voidmain()
{
charchoose,yes_no;
n=0;
do
{
menu();
choose=getch();
switch(choose)
{
case'1':
creat();break;
case'2':
if(n==0)
{
creat();break;
}
del();break;
case'3':
if(n==0)
{
creat();break;
}
search();break;
case'4':
if(n==0)
{
creat();break;
}
modify();break;
case'5':
if(n==0)
{
creat();break;
}
add();break;
case'6':
if(n==0)
{
creat();break;
}
sort();break;
case'7':
if(n==0)
{
creat();break;
}
statistics();break;
case'8':
if(n==0)
{
creat();break;
}
display();break;
case'9':
help();break;
case'0':
break;
default:
printf("\n\n输入错误,请重新输入(0-9)!
\n");
}
if(choose=='0')break;
printf("\n\n返回主菜单请输入(y)退出系统请输入(n)\n\n");
do
{
yes_no=getche();
}while(yes_no!
='y'&&yes_no!
='n');
}while(yes_no=='y');
}
(2)各模块功能及程序说明
模块一:
menu()模块
功能:
显示主菜单界面。
程序说明:
只要运用printf语句即可。
模块二:
creat()模块
功能:
按照提示输入10个学生的学号、姓名、性别及三门功课(数学、英语、计算机)的成绩。
程序说明:
运用链表,先开辟空间在读入数据。
知道n不小于10.
N-S流程图:
n=0
开辟一个新结点,并使p1、p2指向它
读入一个学生数据给p1所指的结点
Head=p1
n<10
n=n+1
p2->next=p1
(把p1所指的结点链接到表尾)
P2=p1(p2移到表尾)
在开辟一个新结点,并使p1指向它
读入一个学生数据给p1所指的结点
表尾结点的指针变量置NULL
Creat()模块N-S流程图
关键代码及代码注释
voidcreat()/*输入学生信息*/
{
structstudent*p1,*p2;
top();
n=0;
top();
head=NULL;
n=0;
p1=p2=(structstudent*)malloc(LEN);
printf("\n请输入10个学生的信息(包括:
学号,姓名,性别,数学成绩,英语成绩,计算机成绩!
)\n");
printf("\n请输入第%d个学生的信息:
\n",++n);
printf("\n请输入学生的学号:
");gets(p1->num);
printf("\n请输入学生的姓名:
");gets(p1->name);
printf("\n请输入学生的性别(boy/girl):
");gets(p1->sex);
printf("\n请输入学生的数学成绩:
");scanf("%f",&p1->score[0]);
printf("\n请输入学生的英语成绩:
");scanf("%f",&p1->score[1]);
printf("\n请输入学生的计算机成绩:
");scanf("%f%*c",&p1->score[2]);
head=p1;
while(n<10)
{
n=n++;
top();
p1=(structstudent*)malloc(LEN);
p2->next=p1;
p2=p1;
printf("\n请输入第%d个学生的信息:
\n",n);
printf("\n请输入学生的学号:
");gets(p1->num);
printf("\n请输入学生的姓名:
");gets(p1->name);
printf("\n请输入学生的性别(boy/girl):
");gets(p1->sex);
printf("\n请输入学生的数学成绩:
");scanf("%f",&p1->score[0]);
printf("\n请输入学生的英语成绩:
");scanf("%f",&p1->score[1]);
printf("\n请输入学生的计算机成绩:
");scanf("%f%*c",&p1->score[2]);
}
p2->next=NULL;
}
模块三:
display()模块
功能:
显示系统中所有学生的信息。
程序说明:
指针指向头结点,然后一一输出链表中的学生数据。
N-S流程图:
P1=head,使p1指向第一个结点
P1是要注销的结点
是否
输出p1指向的结点
当p1指向不是表尾
display()模块N-S流程图
关键代码及代码注释
voiddisplay()/*显示学生信息*/
{
structstudent*p1=head;
top();
printf("\nNow,There%drecordsare:
\n\n",n);
printf("学号姓名性别数学英语计算机\n");
if(head!
=NULL)
while(p1)
{
printf("%-10s%-10s%-4s%-5.2f%-5.2f%-5.2f\n",p1->num,p1->name,p1->sex,p1->score[0],p1->score[1],p1->score[2]);
p1=p1->next;
}
printf("\n");
}
模块四:
del()模块
功能:
按照学号查找是否存在该学生的记录,若存在删除其记录,不存在给出相应信息。
(功能可以扩展:
按姓名删除记录。
)
程序说明:
根据输入的学生号,在链表中移动指针找出所要注销的结点,将结点的前一个结点与后一个结点相接。
N-S流程图:
P1=head
当num≠p1->num以及p1所指的结点不是表尾结点
P2=p1(p2后移一个位置)
P1=p1->next(p1后移一个位置)
P1是要注销的结点
是否
p1所指是头结点
是否
输出“不存在要注销的学生”
Head=p1->next
(注销头结点)
P2->next=p1->next
当输入为y时(继续注销)
del()模块N-S流程图
关键代码及代码注释
voiddel()/*注销学生信息*/
{
structstudent*p1=head,*p2;
charnum[10],ch;
top();
printf("\n\n请输入您所要注销的学生号:
\n\n");
gets(num);
while(strcmp(num,p1->num)!
=0&&p1->next!
=NULL)
{
p2=p1;p1=p1->next;
}
if(strcmp(num,p1->num)==0)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
printf("\n\n注销成功!
\n");
n--;
printf("\n\n是否要继续注销学生信息?
是/否:
(y/n)\n\n");
scanf("%c%*c",&ch);
if(ch=='y')del();
}
else
printf("\n\n不存在您所要注销的学生号!
\n\n");
}
模块五:
search()模块
功能:
按照学号查找是否存在该学生的记录,若存在则输出其各科成绩,不存在给出相应信息。
(功能可以扩展:
按姓名进行查找。
)
程序说明:
根据输入的学生号,在链表中移动指针找出所要寻找的结点,输出结点信息即可。
N-S流程图:
P1=head
输入所要查询的学生号给num
当q->num≠p1->num以及p1所指的结点不是表尾结点
P2=p1(p2后移一个位置)
P1=p1->next(p1后移一个位置)
p1是要查询的结点
是否
输出p1所指向的结点
输出“不存在所要查询的学生”
当输入为y时(继续查询)
search()模块N-S流程图
关键代码及代码注释
voidsearch()/*查询学生信息*/
{
structstudent*p1;
charnum[10],ch;
intflag=1;
p1=head;
top();
printf("\n\n请输入您所要查询的学生号:
\n\n");
gets(num);
while(strcmp(num,p1->num)!
=0&&p1->next!
=NULL)
p1=p1->next;
if(strcmp(num,p1->num)==0)
{
top();
printf("该学生信息如下:
\n\n");
printf("学号:
");printf("%-10s\n\n",p1->num);
printf("姓名:
");printf("%-10s\n\n",p1->name);
printf("性别:
");printf("%-5s\n\n",p1->sex);
printf("数学成绩:
");printf("%.2f\n\n",p1->score[0]);
printf("英语成绩:
");printf("%.2f\n\n",p1->score[1]);
printf("计算机成绩:
");printf("%.2f\n\n",p1->score[2]);
flag=0;
printf("\n\n是否要继续查询学生信息?
是/否:
(y/n)\n\n");
scanf("%c%*c",&ch);
if(ch=='y')search();
}
if(flag)printf("\n\n\n不存在您所要查询的学生号!
\n\n");
}
模块六:
modify()模块
功能:
按照提示修改某一名学生的学号、姓名、性别及各科成绩。
程序说明:
根据输入的学生号,在链表中移动指针找出所要修改的结点,再将正确信息赋给该结点。
N-S流程图:
P1=head
开辟一个新结点,并使q指向它
读入一个学生数据给q所指的结点
当q->num≠p1->num以及p1所指的结点不是表尾结点
P2=p1(p2后移一个位置)
P1=p1->next(p1后移一个位置)
p1是要修改的结点
是否
P1->num=q->num
P1->name=q->name
P1->sex=q->sex
P1->score[0]=q->score[0]
P1->score[1]=q->score[1]
P1->score[2]=q->score[2]
输出“不存在要修改的学生”
当输入为y时(继续修改)
modify()模块N-S流程图
关键代码及代码注释
voidmodify()/*修改学生信息*/
{
structstudent*p1,*q;
charnum[10],ch;
intflag=1;
p1=head;
top();
printf("\n\n请输入您所要修改的学生号:
\n\n");
gets(num);
while(strcmp(num,p1->num)!
=0&&p1->next!
=NULL)
p1=p1->next;
if(strcmp(num,p1->num)==0)
{
q=p1;
printf("\n请输入正确的学生信息:
\n\n");
printf("\n请输入学生的学号:
");gets(p1->num);
printf("\n请输入学生的姓名:
");gets(p1->name);
printf("\n请输入学生的性别(boy/girl):
");gets(p1->sex);
printf("\n请输入学生的数学成绩:
");scanf("%f",&p1->score[0]);
printf("\n请输入学生的英语成绩:
");scanf("%f",&p1->score[1]);
printf("\n请输入学生的计算机成绩:
");scanf("%f%*c",&p1->score[2]);
flag=0;
printf("\n\n修改成功!
!
\n\n");
printf("\n\n是否要继续修改学生信息?
是/否:
(y/n)\n\n");
scanf("%c%*c",&ch);
if(ch=='y')modify();
}
if(flag)
printf("\n\n不存在您所要修改的学生号!
\n\n");
}
模块七:
sort()模块
功能:
按学号对所有学生进行排序。
(功能可以扩展:
按姓名或者按照成绩进行排序。
)
程序说明:
根据冒泡排序法,在链表中移动指针对各学生的学号进行排序。
N-S流程图:
P1=head
开辟一个新结点,并使q指向它
i由0变到n-2共执行n-1循环
进行n-i次比较
p1->num>p1->next->num
真假
交换p1yup1->next里的信息
sort()模块N-S流程图
关键代码及代码注释
voidsort()/*学生信息排序*/
{
inti,j;
charch;
structstudent*p1=head,*q;
q=(structstudent*)malloc(LEN);
for(i=0;i { for(j=0;j { if(strcmp(p1->num,p1->next->num)>0) { strcpy(q->num,p1->num);strcpy(p1->num,p1->next->num);strcpy(p1->next->num,q->num); strcpy(q->name,p1->name);strcpy(p1->name,p1->next->name);strcpy(p1->next->name,q->name); strcpy(q->sex,p1->sex);strcpy(p1->sex,p1->next->sex);strcpy(p1->next->sex,q->sex); q->score[0]=p1->score[0];p1->score[0]=p1->next->score[0];p1->next->score[0]=q->score[0]; q->score[1]=p1->score[1];p1->score[1]=p1->next->score[1];p1->next->score[1]=q->score[1]; q->score[2]=p1->score[2];p1->score[2]=p1->next->score[2];p1->next->score[2]=q->score[2]; } p1=p1->next; } p1=head; } top(); printf("\n\n排序成功! \n\n是否要显示排序后学生信息? 是/否: (y/n)\n\n"); scanf("%c%*c",&ch); if(ch=='y')display(); } 模块八: add()模块 功能: 添加新生信息到已有的学生链表(要求按学号的顺序插入)。 程序说明: 根据输入的学生号,在链表中移动指针找出第一个大于该学生号的结点,在将结点所要添加的结点插入这个结点之前。 N-S流程图: P1=head 开辟一个新结点,并使q指向它 读入一个学生数据给q所指的结点 当q->num>p1->num以及p1所指的结点不是表尾结点 P2=p1(p2后移一个位置) P1=p1->next(p1后移一个位置) q->num 真假 p1指向头结点 是否 P1->next=q q->next=NULL (插到表尾之后) n=n+1 head=q q->next=p1 (插到表头之前) n=n+1 P2->next=q q->next=p1 (插到表中间) n=n+1 当输入为y时(继续查询) add()模块N-S流程图 关键代码及代码注释 voidadd1()/*添加学生信息子模块*/ { structstudent*p1=head,*p2,*q; intflag=1; charch; top(); q=(structstudent*)malloc(LEN); printf("\n请输入您所要添加的学生信息: \n\n"); printf("\n请输入学生的学号: ");gets(q->num); printf("\n请输入学生的姓名: ");gets(q->name); printf("\n请输入学生的性别(boy/girl): ");gets(q->sex); printf("\n请输入学生的数学成绩: ");scanf("%f",&q->score[0]); printf("\n请输入学生的英语成绩: ");scanf("%f",&q->score[1]); printf("\n请输入学生的计算机成绩: ");scanf("%f%*c",&q->score[2]); if(head==NULL) { head=q;q->next=NULL; } else { whi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言 学生成绩管理系统 语言 学生 成绩管理系统