写点什么

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 10000typedef 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"); }

复制代码


发布于: 刚刚阅读数: 6
用户头像

还未添加个人签名 2022-11-01 加入

还未添加个人简介

评论

发布
暂无评论
C语言学生管理系统_C语言_我是一个茶壶_InfoQ写作社区