c语言课程设计:学生管理信息系统设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、设计任务
1.选题意义
设计该项目可以简化学生信息管理的流程,使管理更加简便、清晰。
本程序包含输入记录、显示记录、按成绩排序、插入记录、删除记录(按姓名查找并删除)、查找并显示记录(按姓名查找)、输出系统信息等各种学生管理系统所需功能,基本能够满足管理需求。
2.设计目标
设计该程序是为了实现更简洁的学生信息管理,满足管理学生学号、姓名和成绩等信息的要求。
系统具体功能如下:
(1)输入记录——输入的记录包括:学生学生证号、姓名、成绩;
(2)显示记录——显示所有以上输入记录或根据成绩排序后的记录;
(3)按成绩排序——根据学生成绩由大到小排序;
(4)插入一条记录——插入一条包含学生信息的记录;
(5)删除一条记录——查找姓名,并删除该学生记录;
(6)查找——按照学生姓名查找并显示该学生信息;
(7)输出统计信息——输出包含:记录总数、最高分、最低分、平均分和挂科学生信息等;
(8)读取信息——将保存与VC同一个盘的文件中的学生记录读取出来;
(9)存储信息——将学生信息保存指定文件中;
(10)退出程序。
二、程序设计与实现
1.程序结构
该系统首先定义了包含:学生学号、姓名、成绩的结构体。
然后定义了菜单函数供用户选择,紧接着定义了实现以上各功能的子函数。
最后是主函数,主函数通过switch 语句实现对各子函数的调用。
图1. 系统程序功能组成框图
2. 数据描述——结构体类型定义说明
说明:该程序定义了一个结构体,结构体变量名为student,结构体数组包含:(char 型)学号、(char型)学生姓名以及(int型)学生成绩。
该结构体如下:typedef struct /*定义结构体数组*/
{
char num[10]; /*学号*/
char name[20]; /*姓名*/
int score; /*成绩*/
}Student;
Student stu[80]; /*结构体数组变量*/
3.函数功能说明
程序包含11个函数,除主函数外,还有:菜单函数—int menu_select()、输入记录函数—int input(student stud[],int n)、显示所有记录函数—void Display(student stud[],int n)、排序函数—void sort_by_score(student stud[] ,int n)、插入记录函数—int Insert_a_record(student stud[] int n)、删除记录函数—int Delete_a_record(student stud[],int n)、查询函数—void Query_a_record(student stud[] ,int n)、统计系统信息函数—void Statistic(student stud[],int n)、读取信息函数—int AddfromText(stuent stud[],int n)、存储信息函数—void WritetoText(student stud[],int n)等10个辅助系统完成各项功能函数。
各函数详细说明如下:
(1)主函数——void main()
算法描述:利用无限次循环for(;;)和switch()实现对各函数的调用,系统根据输入的数字选项来调用相应的函数,实现相应的功能。
(2)菜单函数——int menu_select()
函数功能:使用者通过输入数字选项实现对各功能的使用。
当运行完任一功能,返回运行界面时,也要用到该函数。
算法描述:使用do-while循环进行菜单选择,在循环内用getchar()读如所选择的序号,并且每次运行都运用system("cls")进行清屏。
(3)输入记录函数——int input(student stud[],int n)
函数功能:输入学生学号、姓名和成绩,输入后有一个提示语句——是否继续输入。
根据需要选择Y:继续输入记录;选择N:停止输入。
算法描述:使用while循环和标准输入函数进行数据的输入。
(4)显示所有记录函数——void Display(student stud[],int n)
函数功能:将输入的所有记录显示在运行界面,或将按成绩排序后的记录显示在界面。
算法描述:使用for循环进行循环输出,循环内运用if语句使十条数据可以实现暂停功能。
其中还包含了一些辅助的使界面更简洁、清晰的语句
(5)排序函数——void sort_by_score(student stud[] ,int n)
函数功能:按学生成绩由高到底的顺序进行排序。
算法描述:运用简单冒泡法排序,排序后通过显示记录功能将排序后的记录显示在界面。
(6)插入记录函数——int Insert_a_record(student stud[] int n)
函数功能:插入学生信息,包括学生学号、姓名和成绩,插入同时按成绩进行排序,并显示“添加成功”。
算法描述:使用标准的输入函数输入一条学生记录,带到返回值中,并调用排序函数将该学生记录插入到排好序的记录中。
(7)删除记录函数—int Delete_a_record(student stud[],int n)
函数功能:按姓名将需要删除的记录删除。
首先输入姓名,判断是否存在该学生记录:如果存在,回车后,显示“删除成功”;如果不存在,显示“无法找到该信息”。
算法描述:运用标准输入函数输入需要删除记录的学生的姓名,通过用while 循环查找该学生信息,再运用if语句看是否存在该学生,无则返回“无法找到该信息”,有则运用for循环进行删除操作,即找到记录后用后面记录覆盖前面的记录。
这种方法虽不是直接将记录删除,只是将后边的学生记录复制到要删除的学生记录,但实现的功能是相同的。
执行完删除命令后返回“删除成功”。
(8)查询函数——void Query_a_record(student stud[] ,int n)
函数功能:定义该函数为无返回值的的有参函数,根据输入的姓名查找并显示学生的学号、姓名和成绩。
算法描述:运用标准的输入函数输入要查找的学生姓名,然后进行while循环,用if语句进行判断是否存在该学生信息,无则显示“无法找到该信息”,有则将该学生信息运用标准输出函数输出。
(9)统计系统信息函数——void Statistic(student stud[],int n)
函数功能:统计输入的学生信息,包括记录总数,成绩最低和最高学生的学号、姓名和成绩,以及所有学生的平均成绩和挂科学生(即成绩小于60分)的信息。
算法描述:首先统计记录的条数输出总共的记录条数,然后对所有成绩求和,存入sum变量中,再求平均值并将平均值输出。
用两条if语句找到最高分和最低分,并分别将他们的信息输出。
最后运用for循环并定义flag作为标记挂科的变量,即当flag=1时,该学生挂科,输出他的信息。
若没有学生挂科,则输出“无学生挂科”。
(10)读取信息函数——int AddfromText(stuent stud[],int n)
函数功能:定义该函数为一个有返回值的有参函数,根据输入的文件名进行读取记录。
算法描述:运用标准输入函数输入文件名,通过if语句判断,如果有该文件则打开,并使用fscanf进行操作,无该文件则显示“打开失败”。
(11)存储信息函数——void WritetoText(student stud[],int n)
函数功能:该函数定义为无返回值的有参函数,可以把学生记录保存自己命名的文件中。
算法描述:运用while循环进行存储,并使用fprintf,存储完成之后显示“操作成功”,可以使用读取功能读取此文件的内容。
图2.系统总流程图
三、设计难点与解决方法(1)设计难点
设计难点包括:数组的调用、按成绩运用冒泡法进行排序、查找挂科学生信息和文件的使用以及怎样将记录存储到指定文件等。
(2)解决方法
通过看书以及请教老师和同学将难点一一解决。
四、设计效果与不足之处
图3程序效果图如下:
不足之处:
(1)程序仅包含了一项学生成绩,在实际运用中需要多门成绩进行统计操作;
(2)运行第8功能时,需先运行9功能将信息存储到指定文件中,才能运行8功能,否则直接运行8功能将无法打开文件;
(3)输入太多个学生的信息时,屏幕显示不能控制为一页一页显示。
五、学习体会
经过几周的程序编写和调试,我受益匪浅,学到了很多以前不知道的东西:
(1)学会了认识调试中产生的各种错误,通过分析引起错误的原因并改正。
有时候会出现很多错误,而其中的某些错误有可能都是由一个错误引起的。
因此,改正一个后,会有多个错误同时消失;
(2)通过查书和上网查询了解和认识了很多头文件,例如:stdlib.h—动态存储分配头文件、ctype.h—字符函数头文件等;
(3)通过这次程序设计使我认识到使用结构体的方便、快捷,以及调用结构体数组时应该注意的问题,特别是结构体变量名与成员名之间的“.”;
(4)这次设计让我充分的认识到C语言的重要性。
此程序虽参考了很多文献资料,但其中的程序基本是在自己知识范围内完成的。
总结:
这次的课程设计为我以后阅读C程序和设计程序打下了坚实的基础,也为继续学习其他语言开了一个很好的头。
附录1:程序使用说明
为了使用者能够获得正确的程序运行结果,防止未按程序要求输入,导致程序退出,现对该程序说明如下:
(1)程序运行环境:VC++ ;
(2)文件夹设置:所有文件包含在以“P081513088—黄鑫”命名的文件夹中,包含一个“学生管理信息系统.cpp”文件,直接打开运行即可;
(3)文件组成说明:程序头文件由#include<stdlib.h>—动态存储分配头文件、#include<ctype.h>—字符函数头文件、#include<stdio.h>—库函数文件、#include<string.h>—字符串函数文件组成;
(4)操作说明:打开C++程序,编译、链接、运行,此时运行界面。
屏幕显示菜单选择——输入0~9的数字选择菜单,选择菜单后按照提示输入信息再进行操作,系统中的提示信息都设置为中文提示,所以直接按照提示进行操作即可,系统功能以上已有介绍,此处不再赘述。
注意:操作时当第二次或者第三次进入系统时,无需重新输入记录,只需先执行第8功能,按提示输入上一次用户指定所有保存记录的文件的文件名,打开该文件,然后使用第2功能就可以显示所有已保存的记录,即上次输入的记录已保存在指定文件当中,无需更新记录,请用户注意。
附录2:源程序
#include<stdio.h> /*引用库函数*/
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
typedef struct /*定义结构体数组*/
{
char num[10]; /*学号*/
char name[20]; /*姓名*/
int score; /*成绩*/
}Student;
Student stu[80]; /*结构体数组变量*/
int menu_select() /*菜单函数*/
{
char c;
do
{
system("cls"); /*运行前清屏*/
printf("\t\t 欢迎使用学生信息管理系统\n");
printf("\t\t*****************************************\n");
printf("\t\t ****学生管理信息系统****\n"); /*菜单选择*/ printf("\t\t | 1. 请输入记录|\n");
printf("\t\t | 2. 显示所有记录|\n");
printf("\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 | 9. 将所有记录存储到文件中|\n");
printf("\t\t | 0. 退出程序|\n");
printf("\t\t*****************************************\n");
printf("\t\t 请选择使用选项:(0-9):");
c=getchar(); /*读入选择*/
}while(c<'0'||c>'9');
return(c-'0'); /*返回选择*/
}
int Input(Student stud[],int n) /*输入若干条记录*/
{
int i=0;
char sign,x[10]; /*x[10]为清除多余的数据所用*/
while(sign!='n'&&sign!='N') /*判断*/
{
printf("\t\t\t请输入学生证号:"); /*交互输入*/
scanf("\t\t\t%s",stud[n+i].num);
printf("\t\t\t请输入学生姓名:");
scanf("\t\t\t%s",stud[n+i].name);
printf("\t\t\t请输入学生成绩:");
scanf("\t\t\t%d",&stud[n+i].score);
gets(x); /*清除多余的输入*/
printf("\t\t\t是否继续输入记录?(Y/N)");
scanf("\t\t\t%c",&sign); /*输入判断*/
i++;
}
return(n+i);
}
void Display(Student stud[],int n) /*显示所有记录*/
{
int i;
printf("\t\t\t-----------------------------------\n"); /*格式头*/
printf("\t\t\t学生证号姓名成绩\n");
printf("\t\t\t-----------------------------------\n");
for(i=1;i<n+1;i++) /*循环输入*/
{
printf("\t\t\t%-16s%-15s%d\n",stud[i-1].num,stud[i-1].name,stud[i-1].score);
if(i>1&&i%10==0) /*每十个暂停*/
{
printf("\t\t\t-----------------------------------\n"); /*格式*/
printf("\t\t\t");
system("pause");
printf("\t\t\t-----------------------------------\n");
}
}
printf("\t\t\t");
system("pause");
}
void Sort_by_score(Student stud[],int n) /*按成绩排序*/
{
int i,j,*p,*q,s;
char t[10];
for(i=0;i<n-1;i++) /*冒泡法排序*/
for(j=0;j<n-1-i;j++)
if(stud[j].score<stud[j+1].score)
{
strcpy(t,stud[j+1].num);
strcpy(stud[j+1].num,stud[j].num);
strcpy(stud[j].num,t);
strcpy(t,stud[j+1].name);
strcpy(stud[j+1].name,stud[j].name);
strcpy(stud[j].name,t);
p=&stud[j+1].score;
q=&stud[j].score;
s=*p;
*p=*q;
*q=s;
}
}
int Insert_a_record(Student stud[],int n) /*插入一条记录*/
{
char x[10]; /*清除多余输入所用*/
printf("\t\t\t学生证号:"); /*交互式输入*/
scanf("\t\t\t%s",stud[n].num);
printf("\t\t\t学生姓名:");
scanf("\t\t\t%s",stud[n].name);
printf("\t\t\t学生成绩:");
scanf("\t\t\t%d",&stud[n].score);
gets(x);
n++;
Sort_by_score(stud,n);
printf("\t\t\t添加成功!\n"); /*返回成功信息*/
return(n);
}
int Delete_a_record(Student stud[],int n) /*按姓名查找,删除一条记录*/ {
char s[20];
int i=0,j;
printf("\t\t\t请输入该学生姓名:"); /*交互式问寻*/
scanf("%s",s);
while(strcmp(stud[i].name,s)!=0&&i<n) i++; /*查找判断*/
if(i==n)
{
printf("\t\t\t无法找到该信息!\n"); /*返回失败信息*/
return(n);
}
for(j=i;j<n-1;j++) /*删除操作*/
{
strcpy(stud[j].num,stud[j+1].num);
strcpy(stud[j].name,stud[j+1].name);
stud[j].score=stud[j+1].score;
}
printf("\t\t\t删除成功!\n"); /*返回成功信息*/
return(n-1);
}
void Query_a_record(Student stud[],int n) /*查找并显示一个记录*/
{
char s[20];
int i=0;
printf("\t\t\t请输入要查询的学生姓名:"); /*交互式输入*/
scanf("\t\t\t%s",s);
while(strcmp(stud[i].name,s)!=0&&i<n) i++; /*查找判断*/
if(i==n)
{
printf("\t\t\t无法找到该信息!\n"); /*输入失败信息*/
return;
}
printf("\t\t\t该学生学生证号:%s\n",stud[i].num); /*输出该学生信息*/ printf("\t\t\t该学生的成绩:%d\n",stud[i].score);
}
void Statistic(Student stud[],int n) /*新增功能,输出统计信息*/
{
int i,j=0,k=0,sum=0,flag,m=0;
float aver; /*成绩平均值*/
for(i=0;i<n;i++) /*循环输入判断*/
{
sum+=stud[i].score;
if(stud[j].score>stud[i].score) j=i;
if(stud[k].score<stud[i].score) k=i;
}
aver=1.0*sum/n;
printf("\t\t\t总计%d 记录.\n",n); /*总共记录数*/
printf("\t\t\t最低学生成绩:\n"); /*最低分*/
printf("\t\t\t学生证号:%s 姓名:%s 成绩:%d\n",stud[j].num,stud[j].name,stud[j].score);
printf("\t\t\t最高学生成绩:\n"); /*最高分*/
printf("\t\t\t学生证号:%s 姓名:%s 成绩:%d\n",stud[k].num,stud[k].name,stud[k].score);
printf("\t\t\t平均成绩:%5.2f\n",aver); /*平均分*/
printf("\n\t\t\t挂科学生信息:\n");
for(i=0;i<n;i++)
{
flag=0;
if(stud[i].score<60)
{
flag=1;
++m;
}
if(flag==1)
printf("\t\t\t学生证号:%s 姓名:%s 成绩:%d\n",stud[i].num,stud[i].name,stud[i].score);
}
if(m) printf("\t\t\t挂科人数为:%d\n",m);
else printf("\t\t\t无学生挂科!\n");
}
int AddfromText(Student stud[],int n) /*从文件中读入数据*/
{
int i=0,num;
FILE *fp; /*定义文件指针*/
char filename[20]; /*定义文件名*/
printf("\t\t\t请输入文件名:");
scanf("\t\t\t%s",filename); /*输入文件名*/
if((fp=fopen(filename,"rb"))==NULL) /*打开文件*/
{
printf("\t\t\t无法打开文件!\n"); /*打开失败信息*/
printf("\t\t\t");
system("pause");
return(n);
}
fscanf(fp,"%d",&num); /*读入总记录量*/
while(i<num) /*循环读入数据*/
{
fscanf(fp,"%s%s%d",stud[n+i].num,stud[n+i].name,&stud[n+i].score);
i++;
}
n+=num;
fclose(fp); /*关闭文件*/
printf("\t\t\t成功!\n");
printf("\t\t\t");
system("pause");
return(n);
}
void WritetoText(Student stud[],int n) /*将所有记录写入文件*/
{
int i=0;
FILE *fp; /*定义文件指针*/
char filename[20]; /*定义文件名*/
printf("\t\t\t从正文中添加记录:\n"); /*输入文件名*/
printf("\t\t\t请输入文件名:");
scanf("\t\t\t%s",filename);
if((fp=fopen(filename,"w"))==NULL) /*打开文件*/
{
printf("\t\t\t无法打开文件!\n");
system("pause");
return;
}
fprintf(fp,"%d\n",n); /*循环写入数据*/
while(i<n)
{
fprintf(fp,"%-16s%-15s%d\n",stud[i].num,stud[i].name,stud[i].score);
i++;
}
fclose(fp); /*关闭文件*/
printf("成功!\n"); /*返回成功信息*/
}
void main() /*主函数*/
{
int n=0;
for(;;)
{
switch(menu_select()) /*选择判断*/
{
case 1:
printf("\t\t\t输入记录:\n"); /*输入若干条记录*/
n=Input(stu,n);
break;
case 2:
printf("\t\t\t显示所有记录:\n"); /*显示所有记录*/
Display(stu,n);
break;
case 3:
printf("\t\t\t排序\n");
Sort_by_score(stu,n); /*按学号排序*/
printf("\t\t\t排序成功!\n");
printf("\t\t\t");
system("pause");
break;
case 4:
printf("\t\t\t添加记录\n");
n=Insert_a_record(stu,n); /*插入一条记录*/
printf("\t\t\t");
system("pause");
break;
case 5:
printf("\t\t\t删除记录\n");
n=Delete_a_record(stu,n); /*按姓名查找,删除一条记录*/
printf("\t\t\t");
system("pause");
break;
case 6:
printf("\t\t\t查询\n");
Query_a_record(stu,n); /*查找并显示一个记录*/
printf("\t\t\t");
system("pause");
break;
case 7:
printf("\n\t\t\t统计结果:\n");
Statistic(stu,n); /*新增功能,输出统计信息*/
printf("\t\t\t");
system("pause");
break;
case 8:
printf("\t\t\t从正文中添加记录:\n");
n=AddfromText(stu,n); /*新增功能,输出统计信息*/
break;
case 9:
printf("\t\t\t将所有记录存储到文件中\n");
WritetoText(stu,n); /*循环写入数据*/
printf("\t\t\t");
system("pause");
break;
case 0:
printf("\t\t\t谢谢使用,再见!\n"); /*结束程序*/
printf("\t\t\t");
system("pause");
exit(0);
}
}
}。