C 语言学生管理系统
- 2022-11-29 河南
本文字数:5016 字
阅读完需:约 16 分钟
一、 实践题目及要求
设计并实现一个学生信息管理系统,能够对一个文件中所存储的学生信息进行各种常见操作,如排序、查找、计算、显示等功能,其中学生信息包括学号、姓名、性别、5 门课的成绩、总成绩以及平均成绩。该系统能实现的具体功能如下:
(1)添加学生信息;
(2)修改学生信息(按学号);
(3)排序(分别按总分升序、降序以及按姓名升序);
(4)查找学生(按学号);
(5)删除学生;
(6)查看所有学生信息。
二、 程序设计思路(可以使用程序流程图)
明确了系统要实现的功能之后,首先要考虑的就是数据结构,也就是系统中所涉及的教据应该如何来表示;一旦确定了数据结构,就可以按照模块化程序设计的思想对系统进行分析和设计,以此确定每个功能模块对应的函数;接着分析整个系统的流程,按流程调用各功能函数;最后是每个函数的具体实现。
三、具体代码实现
附页一
四、 程序运行结果及分析(以图片形式表现运行结果)
主界面
添加学生信息
修改信息
排序
输出
结束
一、 自我评价与总结
c 语言是计算机语言,有助于我们更好地理解计算机和与计算机交流,所以 c 语言学习对我们来说尤为重要。
虽然在调试程序的过程中遇到了许多困难,有时候甚至觉得一点头绪都没有,无从下手,但最终都通过各种渠道,各种方式,一一解决了。从中也让我知道了要学好这门课程,仅学习课本上的知识,掌握理论是不够的,还要有较强的实践能力。只有多实践,多编写程序,多调试才能更好地学地掌握书本上的知识,从而学好这门课。此外,在上机调试的过程中一定要有耐心,耐心地去寻找错误并改正错误;还要记住经常犯的错误,保下次不再犯同样的错误;遇到自己不能解决问题要勤于翻书,查找资料,或者问别人,不要怕麻烦。
代码如下
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#define N 10000
typedef struct student
{
char ID[10]; /*学号*/
char name [20]; /*姓名*/
char sex; /*性别*/
double score[5]; /*五门课的成绩*/
double total; /*总成绩*/
double avg; /*平均成绩*/
}STU;
void display(void); /*显示主菜单*/
void load(STU stu[],int *nPtr); /*把学生信息加载到内存*/
void save(STU stu[],int n); /*大将数据保存到磁盘*/
void sort (STU stu[],int n); /*排序*/
void InputRecord(STU st1[],int i); /*输入一条记录*/
void find (STU stu[],int n); /*查找*/
void del (STU stu[],int *nPtr); /*删除*/
void add (STU stu[],int *nPtr); /*添加一条记录*/
void edit(STU stu[],int n); /*修改一条记录*/
void DeleteAll (STU stu[],int *nPtr); /*删除所有信息*/
void DeleteRecord(STU stu[],int *nPtr); /*删除一条记录*/
int FindByNum (STU stu[],int n,char *str); /*按学号查找*/
void output (STU stu[],int n); /*输出所有信息*/
void PrintRecord(STU *sPtr); /*输出一条记录*/
int ScoreAsc( STU a,STU b); /*按成绩升厅排序规则,若a,b逆序,返回1*/
int ScoreDes (STU a, STU b); /*按成绩降序排序规则,若a, b逆序,返回1*/
int NameAsc(STU a, STU b); /*按姓名升序排序规则,若a,b逆序,返回一个正整数*/
int main()
{
STU stu[N];
int n;
int select;
load(stu,&n);
while (1)
{
display();
scanf("%d",&select);
switch(select)
{
case 1: /*添加*/
add(stu, &n);break;
case 2: /*修改*/
edit (stu,n); break;
case 3: /*排序*/
sort(stu, n); break;
case 4: /*查找*/
find(stu, n); break;
case 5: /*删除*/
del(stu, &n); break;
case 6: /*输出*/
output(stu,n);break;
case 7: /*退出*/
return 0;
}
}
return 0;
}
/*按成绩升厅排序规则,若a,b逆序,返回1*/
int ScoreAsc( STU a,STU b)
{
return a.total > b.total ? 1:-1;
}
/*按成绩降序排序规则,若a, b逆序,返回1*/
int ScoreDes (STU a, STU b)
{
return a.total<b.total ? 1:-1;
}
/*按姓名升序排序规则,若a,b逆序,返回一个正整数*/
int NameAsc(STU a, STU b)
{
return strcmp( a.name, b. name);
}
void display(void) /*显示主菜单*/
{
system("cls");
printf("欢迎使用本学生成绩管理系统\n");
printf("说明:在本系统中欲执行某功能请输入相应数字\n");
printf("1.添加\n");
printf("2.修改\n");
printf("3.排序\n");
printf("4.查找\n");
printf("5.删除\n");
printf("6.输出\n");
printf("7.退出\n");
}
void load(STU stu[],int *nPtr) /*把学生信息加载到内存*/
{
FILE *fp;
STU ex;
int i=0;
if(((fp = fopen("sutdent txt", "r")))==NULL)
{
*nPtr =0;
return;
}
while(fscanf(fp,"%s %s %c %lf %lf %lf %lf %lf %lf %lf\n",ex.ID,ex.name,&ex.sex,&ex.score[0],&ex.score[1],&ex.score[2] ,&ex.score[3] ,&ex.score[4] ,&ex.total,&ex.avg)!=EOF)
{
strcpy(stu[i].ID,ex.ID);
strcpy(stu[i].name,ex.name);
stu[i].sex=ex.sex;
stu[i].score[0]=ex.score[0];
stu[i].score[1]=ex.score[1];
stu[i].score[2]=ex.score[2];
stu[i].score[3]=ex.score[3];
stu[i].score[4]=ex.score[4];
stu[i].total=ex.total;
stu[i].avg=ex.avg;
i++;
}
*nPtr=i;
fclose(fp);/*关闭文件*/
}
void save(STU stu[],int n) /*大将数据保存到磁盘*/
{
FILE *fp;
int i;
if((fp = fopen("sutdent txt", "wb"))==NULL)
{
printf("打开文件失败\n");
exit(0);
}
// fwrite(stu, n *sizeof(stu[0]),1,fp);
for(i=0;i<n;i++)
fprintf(fp,"%s %s %c % 0lf % 0lf % 0lf % 0lf % 0lf % 0lf % 2lf\n",stu[i].ID,stu[i].name,stu[i].sex,stu[i].score[0],stu[i].score[1],stu[i].score[2] ,stu[i].score[3] ,stu[i].score[4] ,stu[i].total,stu[i].avg);
fclose(fp);
}
void sort (STU stu[],int n) /*排序*/
{
int select, i,j;
int (*cmp)( STU a, STU b );
int ScoreAsc( STU a, STU b);
int ScoreDes( STU a, STU b );
int NameAsc( STU a,STU b );
printf("1.按总分升序排列\n");
printf("2.按总分降序排列\n");
printf("3.按姓名排列\n");
scanf("%d", &select);
switch(select)
{
case 1: cmp =ScoreAsc; break;
case 2: cmp =ScoreDes; break;
case 3: cmp =NameAsc; break;
default: return;
}
/*按照指定规则,进行比较交换排序*/
for(i =0;i<n-1;i++)
for(j=i+1;j<n;j++)
if((*cmp) (stu[i],stu[j])>0)/*若逆序,cmp返回正数*/
{
STU temp;
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
output(stu, n);
}
void InputRecord(STU stu[],int i) /*输入一条记录*/
{
int j;
/*输入学号,并验证合法性*/
printf("请输入第%d个学生信息\n", i+1);
printf("请输入学生学号(学号小于9位数字组成)\n");
scanf("%s",&stu[i].ID);
/*输入姓名*/
printf("请输入学生姓名\n");
scanf("%s",stu[i].name);
printf("请输入学生性别(f或m f代表女性 m代表男性)\n");
getchar();
scanf("%c",&stu[i].sex);
/*输入5门课程成绩并累加*/
printf("请输入五门课成绩(0~100)\n");
stu[i].total =0;
for(j = 0;j < 5;j++)
{
scanf("%lf",&stu[i].score[j]);
stu[i].total +=stu[i].score[j];
}
/*计算总成绩*/
stu[i].avg=stu[i].total / 5;
}
void find (STU stu[],int n) /*查找*/
{
int index;
char str[20];
printf("请输入学号:\n");scanf("%s",str);
index = FindByNum (stu, n, str);
if(index >=0)
PrintRecord (&stu [index]);else
printf("该学生信息不存在\n");
system("pause");
}
void del (STU stu[],int *nPtr) /*删除*/
{
int i, index;
char str[20];
printf("请输入学号:\n");
scanf("%s",str);
index = FindByNum(stu, *nPtr,str);
if(index <0)
{
printf(" \n该学生信息不存在\n");
return;
}
for(i =index; i<*nPtr-1;i++)
stu[i]=stu[i+1];
(*nPtr)--;
printf("In 删除成功\n");
save(stu, *nPtr);/*保存到文件*/
}
void add (STU stu[],int *nPtr) /*添加一条记录*/
{
int i=0;
char sel ='y';
while(sel == 'y')
{
InputRecord(stu,(*nPtr)++);
/*添加第n+1个学生信息*/
printf("是否继续添加(yes--y,no--others) \n");
scanf(" %c", &sel);
save(stu, *nPtr);
}
}
void edit(STU stu[], int n) /*修改一条记录*/
{
int i, index;
char sel;
char str[20];
printf("请输入学号:\n");
scanf( "%s", str);
index = FindByNum(stu, n, str);
if(index<0)
{
printf("该学生信息不存在\n");
return;
}
printf("修改前的原记录如下:\n");
PrintRecord(&stu[index]);
/*修改姓名*/
printf("是否修改姓名?请输入 y or n:\n");
scanf(" %c", &sel);
if(sel == 'y')
{
printf("请输入姓名:\n");
scanf("%s", stu[index].name);
}
/*修改性别*/
printf("是否修改性别?请输入 y or n\n");
scanf(" %c", &sel);
if(sel == 'y')
{
printf("请输入f or m:\n");
scanf(" %c", &stu[index] .sex);
}
/*修改成绩*/
printf("是否修改成绩?请输入 y or n:\n");
scanf(" %c", &sel);
if(sel == 'y')
{
stu[index].total = 0;
printf("输5门学科成绩:\n");
for(i = 0; i<5;i++)
{
scanf("%lf", &stu[index] .score[i]);
stu[index].total = stu[index].total +stu[index] .score[i];
stu[index].avg=stu[index] .total / 5;
}
}
save(stu, n);
}
int FindByNum (STU stu[],int n ,char *str) /*按学号查找*/
{
int i;
for(i =0; i<n; i++)/*若找到,则返回对应下标*/
if(strcmp (stu[i].ID,str)==0)
return i;
return -1;
}
void output (STU stu[],int n) /*输出所有信息*/
{
int i;
/*打印表头*/
printf("%8s%8s%4s%8s%8s%8s%8s%8s%8s%8s\n","ID","NAME","SEX","SCORE1","SCORE2","SCORE3","SCORE4", "SCORE5","total","avg");
/*打印所有记录*/
for(i=0;i<n; i++)
PrintRecord(&stu[i]);
system( "pause");
}
void PrintRecord(STU *sPtr) /*输出一条记录*/
{
int i;
printf("%8s%8s%4c",sPtr->ID,sPtr->name, sPtr->sex);
for(i = 0; i<5; i++)
printf("%8.2f",sPtr->score[i]);
printf("%8.2f%8.2f",sPtr->total, sPtr->avg);
printf("\n");
}
版权声明: 本文为 InfoQ 作者【我是一个茶壶】的原创文章。
原文链接:【http://xie.infoq.cn/article/748d15ef21ca52f2c9521a6a8】。未经作者许可,禁止转载。
我是一个茶壶
还未添加个人签名 2022-11-01 加入
还未添加个人简介
评论