C语言学生成绩管理系统:从入门到操作详解

4星 · 超过85%的资源 需积分: 9 5 下载量 165 浏览量 更新于2024-09-17 收藏 12KB TXT 举报
本资源是一份基于C语言编写的学生成绩管理系统,它旨在提供一个简单易懂的框架,适用于初学者进行学习和实践。该系统结构清晰,包含了基本的数据结构(如`struct student`)定义,用于存储学生的信息,包括姓名、性别、学号、三门课程的成绩以及相关的平均分和排序信息。 以下是主要知识点的详细说明: 1. **数据结构**: - 定义了一个名为`struct student`的结构体,它包含成员变量如`name`(字符数组,用于存储学生姓名)、`sex`(字符数组,表示性别)、`no`(整型,学号)、`score1`, `score2`, `score3`(浮点型,分别对应三门课程的成绩)以及`ave`(浮点型,计算平均成绩)、`sum`(浮点型,总成绩)、`sort`(浮点型,用于存储排序后的成绩)。 2. **函数模块**: - `input()`:用于输入学生信息,可能包括姓名、性别和成绩等。 - `display()`:展示所有学生的记录。 - `sort()`:对学生成绩进行排序,可能有多个实现(如`sort1()`, `sort2()`, `sort3()`),分别对应不同的排序算法。 - `display1()`:可能显示特定格式的学生信息。 - `insert()`:将新学生信息插入到结构体数组中。 - `del()`:删除指定学生的信息。 - `average()`:计算并更新学生的平均成绩。 - `save()`:保存学生信息到文件。 - `find()`:查找特定学生的信息。 - `find1()` 和 `find2()`:可能是不同版本的查找功能,可能根据学号或姓名查找。 - `del_file()`:删除文件操作,与保存功能相关。 - `modify()`:修改已有的学生信息。 - `read()`:从文件中读取学生信息并更新数据库。 - `main()`:程序的主入口,控制用户界面和选择相应的功能。 3. **用户界面**: - 主菜单包含了多项功能选项,如查看学生信息、显示所有学生、添加新学生、删除学生、查找学生、修改信息等,允许用户根据需求进行操作。 - 使用循环结构处理用户输入,并通过`getch()`函数获取键盘输入,以便控制程序流程。 4. **文件操作**: - 提供了文件操作函数,如`del_file()`,表明系统可以读取和写入文件来存储和管理学生成绩数据,这对于持久化数据至关重要。 这份代码提供了学习C语言编程,特别是文件操作、数据结构以及控制结构的一个实用示例,适合初学者逐步理解和实践。通过阅读和分析这个系统,你可以深入理解如何组织数据,处理用户交互,以及在C语言环境中实现基础的数据库管理功能。
2013-06-02 上传
#include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX 100 //最多学生人数 struct Stu1 //学生信息 { char no[10]; char name[20]; char sex[5]; int age; char classroom[20]; }; struct date //日期 { int year; int month; int day; }; struct Stu2 //考勤 { int late[MAX]; //迟到次数 int early[MAX]; //早退次数 int absence[MAX]; //旷课节数 struct date dat; }; typedef struct Stu3 //统计 { int late[MAX]; int early[MAX]; int absence[MAX]; }statistic; void input_stud() //学生信息初始化 { FILE *fp; struct Stu1 stu; int i,n; printf("\n学生人数(<=100): "); scanf("%d",&n); if((fp=fopen("student1.dat","wb+"))==NULL) { printf("\t>>不能建立student1.dat文件\n"); exit(0); } printf("\n******************************************************************************\n"); printf("学号 \t姓名\t性别\t年龄\t班级\n"); for(i=0;i<n;i++) { scanf("%s%s%s%d%s",stu.no,stu.name,stu.sex,&stu.age,stu.classroom); fwrite(&stu,sizeof(struct Stu1),1,fp); } printf("******************************************************************************\n"); fclose(fp); } void add_stud() //添加学生 { FILE *fp; struct Stu1 stu,stun; int i,n,t; if((fp=fopen("student1.dat","ab+"))==NULL) if((fp=fopen("student1.dat","wb+"))==NULL) { printf("\t>>不能建立student1.bin文件\n"); exit(0); } fseek(fp,0,2); n=ftell(fp)/sizeof(struct Stu1); printf("\n******************************************************************************\n"); printf(" 输入信息: 学号 \t姓名\t性别\t年龄\t班级\n"); printf(" 学生信息: "); scanf("%s%s%s%d%s",stun.no,stun.name,stun.sex,&stun.age,stun.classroom); printf("1,确定 2,取消\n"); printf("请选择: "); scanf("%d",&t); switch(t) { case 1:rewind(fp); i=0; while(i<n) { fread(&stu,sizeof(struct Stu1),1,fp); if(strcmp(stun.no,stu.no)==0) break; i++; } if(i<n) printf("\t>>学号重复\n"); else { fseek(fp,0,2); fwrite(&stun,sizeof(struct Stu1),1,fp); }break; case 2:break; } printf("******************************************************************************\n"); fclose(fp); } void update_stud() //按学号修改学生信息 { FILE *fp; struct Stu1 stu; int i,n,t; char no[10]; if((fp=fopen("student1.dat","rb+"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(1); } fseek(fp,0,2); n=ftell(fp)/sizeof(struct Stu1); printf("\n******************************************************************************\n"); printf("要修改的学号: "); scanf("%s",no); i=0; rewind(fp); while(i<n) { fread(&stu,sizeof(struct Stu1),1,fp); if(strcmp(stu.no,no)==0) break; i++; } if(i<n) { printf("输入 姓名 性别 年龄 班级: "); scanf("%s %s %d %s",stu.name,stu.sex,&stu.age,stu.classroom); printf("1,确定 2,取消\n"); printf("请选择: "); scanf("%d",&t); switch(t) { case 1:fseek(fp,-(long)sizeof(struct Stu1),1); fwrite(&stu,sizeof(struct Stu1),1,fp);break; case 2:break; } } else printf("\t>>无该学号的学生\n"); printf("******************************************************************************\n"); fclose(fp); } void create_attend(int t) //考勤记录 { FILE *fp1,*fp2; int i,n,p; struct Stu1 stu; struct Stu2 attend; switch(t) { case 2:if((fp1=fopen("student2.dat","ab+"))==NULL) { printf("\t>>不能打开student2.dat文件\n"); exit(0); } break; case 1:if((fp1=fopen("student2.dat","wb+"))==NULL) { printf("\t>>不能建立student2.dat文件\n"); exit(0); } } fseek(fp1,0,2); if((fp2=fopen("student1.dat","rb+"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(2); } fseek(fp2,0,2); n=ftell(fp2)/sizeof(struct Stu1); printf("\n年.月.日: "); scanf("%d%d%d",&attend.dat.year,&attend.dat.month,&attend.dat.day); printf("\n******************************************************************************\n"); printf("学号 \t姓名\t迟到\t早退\t旷课\n"); rewind(fp2); for(i=0;i<n;i++) { fread(&stu,sizeof(struct Stu1),1,fp2); printf("%s\t%s\t",stu.no,stu.name); scanf("%d%d%d",&attend.late[i],&attend.early[i],&attend.absence[i]); } printf("******************************************************************************\n"); for(;i<MAX;i++) { attend.late[i]=attend.early[i]=attend.absence[i]=0; } printf("1,确定 2,取消\n"); printf("请选择: "); scanf("%d",&p); switch(p) { case 1:fwrite(&attend,sizeof(struct Stu2),1,fp1);break; case 2:break; } fclose(fp1); fclose(fp2); } void get_attend() //按学号显示 { FILE *fp1,*fp2; int i,n,m; char s[10]; struct Stu1 stu; struct Stu2 attend; if((fp1=fopen("student1.dat","rb+"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(3); } fseek(fp1,0,2); n=ftell(fp1)/sizeof(struct Stu1); rewind(fp1); if((fp2=fopen("student2.dat","rb+"))==NULL) { printf("\t>>不能打开student2.dat文件\n"); exit(4); } fseek(fp2,0,2); m=ftell(fp2)/sizeof(struct Stu2); if(m>0) rewind(fp2); printf("\n学号: "); scanf("%s",s); for(i=0;i<n;i++) { fread(&stu,sizeof(struct Stu1),1,fp1); if(strcmp(s,stu.no)==0) break; } if(i==n) printf("对不起,该学号不存在,谢谢!\n"); else { printf("\n******************************************************************************\n"); printf("%s %s %s %d %s\n\n",stu.no,stu.name,stu.sex,stu.age,stu.classroom); printf("迟到\t早退\t旷课\t扣学分\t日期\n"); while(m) { fread(&attend,sizeof(struct Stu2),1,fp2); printf("%d\t%d\t%d\t%.1f\t%d-%d-%d\n",attend.late[i],attend.early[i],attend.absence[i],-0.5*attend.absence[i],attend.dat.year,attend.dat.month,attend.dat.day); m--; } printf("******************************************************************************\n"); } fclose(fp1); fclose(fp2); } void disp_attend() //按日期显示 { FILE *fp1,*fp2; int i,n,x,y,m,d; struct Stu1 stu; struct Stu2 attend; if((fp1=fopen("student1.dat","rb+"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(5); } fseek(fp1,0,2); n=ftell(fp1)/sizeof(struct Stu1); rewind(fp1); if((fp2=fopen("student2.dat","rb+"))==NULL) { printf("\t>>不能打开student2.dat文件\n"); exit(6); } fseek(fp2,0,2); x=ftell(fp2)/sizeof(struct Stu2); if(x>0) rewind(fp2); printf("\n日期: "); scanf("%d%d%d",&y,&m,&d); while(x) { fread(&attend,sizeof(struct Stu2),1,fp2); if(y==attend.dat.year && m==attend.dat.month && d==attend.dat.day) break; x--; } if(x==0) printf("对不起,该日期不存在,谢谢!\n"); else { printf("\n******************************************************************************\n"); printf("学号 \t姓名\t性别\t年龄\t班级\t迟到\t早退\t旷课\t扣学分\n"); rewind(fp2); for(i=0;i<n;i++) { fread(&stu,sizeof(struct Stu1),1,fp1); printf("%s\t%s\t%s\t%d\t%s\t%d\t%d\t%d\t%.1f\n",stu.no,stu.name,stu.sex,stu.age,stu.classroom,attend.late[i],attend.early[i],attend.absence[i],-0.5*attend.absence[i]); } printf("******************************************************************************\n"); } fclose(fp1); fclose(fp2); } void disp_stud() //显示学生信息 { FILE *fp; int i,n,t; struct Stu1 stu; if((fp=fopen("student1.dat","rb+"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(5); } fseek(fp,0,2); n=ftell(fp)/sizeof(struct Stu1); rewind(fp); printf("\n******************************************************************************\n"); printf("学号 \t姓名\t性别\t年龄\t班级\n"); for(i=0;i<n;i++) { fread(&stu,sizeof(struct Stu1),1,fp); printf("%s\t%s\t%s\t%d\t%s\n",stu.no,stu.name,stu.sex,stu.age,stu.classroom); } printf("******************************************************************************\n"); printf("\n1,修改 0,退出\n"); printf("请选择: "); while(scanf("%d",&t)==1) { if(t==0) break; update_stud(); printf("\n1,修改 0,退出\n"); printf("请选择: "); } fclose(fp); } void find_attend() //查找(修改和显示) { FILE *fp1,*fp2; struct Stu1 stu; struct Stu2 attend; char s[10]; int i,n,x,t,p,y,m,d,q; printf("\n1,修改 2,显示 0,返回\n"); if((fp1=fopen("student1.dat","rb+"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(7); } fseek(fp1,0,2); n=ftell(fp1)/sizeof(struct Stu1); rewind(fp1); if((fp2=fopen("student2.dat","rb+"))==NULL) { printf("\t>>不能打开student2.dat文件\n"); exit(8); } fseek(fp2,0,2); x=ftell(fp2)/sizeof(struct Stu2); if(x>0) rewind(fp2); printf("请选择: "); while(scanf("%d",&t)==1) { if(t==0) break; p=x; printf("\n学号、日期: "); scanf("%s%d%d%d",s,&y,&m,&d); rewind(fp1); rewind(fp2); for(i=0;i<n;i++) { fread(&stu,sizeof(struct Stu1),1,fp1); if(strcmp(s,stu.no)==0) break; } if(i==n) printf("对不起,该学号不存在,谢谢!\n"); else { while(p) { fread(&attend,sizeof(struct Stu2),1,fp2); if(y==attend.dat.year && m==attend.dat.month && d==attend.dat.day) break; p--; } if(p==0) printf("对不起,该日期不存在,谢谢!\n"); else { printf("\n******************************************************************************\n"); switch(t) { case 1: printf("输入迟到次数,早退次数,旷课节数: "); scanf("%d%d%d",&attend.late[i],&attend.early[i],&attend.absence[i]); printf("1,确定 2,取消\n"); printf("请选择: "); scanf("%d",&q); switch(q) { case 1:fseek(fp2,-(long)sizeof(struct Stu2),1); fwrite(&attend,sizeof(struct Stu2),1,fp2);break; case 2:break; }break; case 2: printf("学号 \t姓名\t性别\t年龄\t班级\t迟到\t早退\t旷课\t扣学分\n"); printf("%s\t%s\t%s\t%d\t%s\t%d\t%d\t%d\t%.1f\n",stu.no,stu.name,stu.sex,stu.age,stu.classroom,attend.late[i],attend.early[i],attend.absence[i],-0.5*attend.absence[i]); } printf("******************************************************************************\n"); } } system("pause"); system("cls"); printf("\n1,修改 2,显示 0,返回\n"); printf("请选择: "); } fclose(fp1); fclose(fp2); } void total_attend() //统计(单个显示和全显示) { FILE *fp1,*fp2; statistic s; struct Stu1 stu; struct Stu2 attend; int i,n,x,t,y1,m1,d1,y2,m2,d2; char str[10]; printf("\n起始时间: "); scanf("%d%d%d",&y1,&m1,&d1); printf("终止时间: "); scanf("%d%d%d",&y2,&m2,&d2); if((fp1=fopen("student1.dat","rb+"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(9); } fseek(fp1,0,2); n=ftell(fp1)/sizeof(struct Stu1); rewind(fp1); if((fp2=fopen("student2.dat","rb+"))==NULL) { printf("\t>>不能打开student2.dat文件\n"); exit(10); } fseek(fp2,0,2); x=ftell(fp2)/sizeof(struct Stu2); if(x>0) rewind(fp2); for(i=0;i<n;i++) { s.late[i]=0;s.early[i]=0;s.absence[i]=0; } while(x) { fread(&attend,sizeof(struct Stu2),1,fp2); if(y1==attend.dat.year && m1==attend.dat.month && d1==attend.dat.day) break; x--; } x--; while(x) { for(i=0;i<n;i++) { s.late[i]+=attend.late[i];s.early[i]+=attend.early[i];s.absence[i]+=attend.absence[i]; } fread(&attend,sizeof(struct Stu2),1,fp2); if(y2==attend.dat.year && m2==attend.dat.month && d2==attend.dat.day) break; x--; } if(x==0) printf("对不起,错误!\n"); else { for(i=0;i<n;i++) { s.late[i]+=attend.late[i];s.early[i]+=attend.early[i];s.absence[i]+=attend.absence[i]; } printf("\n1,单个显示 2,全显示 0,返回\n"); printf("请选择: "); while(scanf("%d",&t)==1) { if(t==0) break; printf("\n******************************************************************************\n"); switch(t) { case 1:rewind(fp1); printf("学号: "); scanf("%s",str); for(i=0;i<n;i++) { fread(&stu,sizeof(struct Stu1),1,fp1); if(strcmp(str,stu.no)==0) break; } if(i==n) printf("对不起,该学号不存在,谢谢!\n"); else { printf("%s %s %s %d %s\n",stu.no,stu.name,stu.sex,stu.age,stu.classroom); printf("迟到\t早退\t旷课\t扣学分\n"); printf("%d\t%d\t%d\t%.1f\n",s.late[i],s.early[i],s.absence[i],-0.5*s.absence[i]); } break; case 2:rewind(fp1); printf("学号 \t姓名\t性别\t年龄\t班级\t迟到\t早退\t旷课\t扣学分\n"); for(i=0;i<n;i++) { fread(&stu,sizeof(struct Stu1),1,fp1); printf("%s\t%s\t%s\t%d\t%s\t%d\t%d\t%d\t%.1f\n",stu.no,stu.name,stu.sex,stu.age,stu.classroom,s.late[i],s.early[i],s.absence[i],-0.5*s.absence[i]); } } printf("******************************************************************************\n"); system("pause"); system("cls"); printf("\n1,单个显示 2,全显示 0,返回\n"); printf("请选择: "); } } fclose(fp1); fclose(fp2); } struct Stu2 f(struct Stu2 at1,int i,int n) { int j; for(j=i;j<n;j++) { at1.late[j]=at1.late[j+1];at1.early[j]=at1.early[j+1];at1.absence[j]=at1.absence[j+1]; } return at1; } void del_stud() //删除 { FILE *fp1,*fp2; struct Stu1 st1,stt[MAX]; struct Stu2 at1,att[300]; int i,j=0,t,n,x,p; char no[10]; if((fp1=fopen("student1.dat","rb+"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(11); } fseek(fp1,0,2); n=ftell(fp1)/sizeof(struct Stu1); rewind(fp1); if((fp2=fopen("student2.dat","rb+"))==NULL) { printf("\t>>不能打开student2.dat文件\n"); exit(12); } fseek(fp2,0,2); x=ftell(fp2)/sizeof(struct Stu2); if(x>0) rewind(fp2); printf("\n删除学号: "); scanf("%s",no); printf("1,确定 2,取消\n"); printf("请选择: "); scanf("%d",&p); switch(p) { case 1:if(n>0 && x>0) { for(i=0;i<n;i++) { fread(&st1,sizeof(struct Stu1),1,fp1); if(strcmp(no,st1.no)==0) { t=j;continue; } stt[j]=st1;j++; } fclose(fp1); fp1=fopen("student1.dat","wb"); for(i=0;i<j;i++) fwrite(&stt[i],sizeof(struct Stu1),1,fp1); for(i=0;i<x;i++) { fread(&at1,sizeof(struct Stu2),1,fp2); att[i]=f(at1,t,n); } fclose(fp2); fp2=fopen("student2.dat","wb"); for(i=0;i<x;i++) fwrite(&att[i],sizeof(struct Stu2),1,fp2); printf("已删除!\n"); }break; case 2:break; } fclose(fp1); fclose(fp2); } void dela_stud() //全删 { FILE *fp1,*fp2; int t,p; printf("\n******************************************************************************\n"); printf("\n1,仅删除考勤记录 2,全部删除 0,返回\n"); printf("请选择: "); printf("1,确定 2,取消\n"); printf("请选择: "); scanf("%d",&p); switch(p) { case 1:while(scanf("%d",&t)==1) { if(t==0) break; switch(t) { case 2:if((fp1=fopen("student1.dat","wb"))==NULL) { printf("\t>>不能打开student1.dat文件\n"); exit(13); } fclose(fp1); case 1:if((fp2=fopen("student2.dat","wb"))==NULL) { printf("\t>>不能打开student2.dat文件\n"); exit(13); } } printf("\t>>记录已删\n"); printf("\n1,仅删除考勤记录 2,全部删除 0,返回\n"); printf("请选择: "); } case 2:break; } printf("******************************************************************************\n"); fclose(fp2); } void main() { int t,p1,p2; system("color 3e"); printf("\n 欢迎使用\n"); printf("\n 考勤管理程序\n"); printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); printf("1,初始化(学生信息和考勤初始化) 2,添加(添加学生和考勤记录)\n\n"); printf("3,按学号显示考勤记录 4,按日期显示考勤记录\n\n"); printf("5,查找(修改和显示) 6,显示学生信息(含修改)\n\n"); printf("7,统计(单个显示和全显示) 8,删除\n\n"); printf("9,全删 0,返回\n\n"); printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); printf("请选择: "); while(scanf("%d",&t)==1) { if(t==0) { system("cls"); printf("\n\n\n\n\n\n\n\n\n 再见!\n\n\n\n"); printf("\n\n\n\n\n\n\n 设计者: 邱河成\n"); printf("\n 班级: 计算111班 \n\n\n\n"); break; } switch(t) { case 1:system("cls"); printf("\n1,学生信息初始化 2,考勤初始化 0,返回\n"); printf("请选择: "); while(scanf("%d",&p1)==1) { if(p1==0) break; switch(p1) { case 1:system("cls");input_stud();break; case 2:system("cls");create_attend(t);break; } system("cls"); printf("\n1,学生信息初始化 2,考勤初始化 0,返回\n"); printf("请选择: "); } break; case 2:system("cls"); printf("\n1,添加学生 2,添加考勤记录 0,返回\n"); printf("请选择: "); while(scanf("%d",&p2)==1) { if(p2==0) break; switch(p2) { case 1:system("cls");add_stud();break; case 2:system("cls");create_attend(t);break; } system("cls"); printf("\n1,添加学生 2,添加考勤记录 0,返回\n"); printf("请选择: "); } break; case 3:system("cls");get_attend();system("pause");break; case 4:system("cls");disp_attend();system("pause");break; case 5:system("cls");find_attend();system("pause");break; case 6:system("cls");disp_stud();system("pause");break; case 7:system("cls");total_attend();system("pause");break; case 8:system("cls");del_stud();system("pause");break; case 9:system("cls");dela_stud();system("pause");break; } system("cls"); printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); printf("1,初始化(学生信息和考勤初始化) 2,添加(添加学生和考勤记录)\n\n"); printf("3,按学号显示 4,按日期显示\n\n"); printf("5,查找(修改和显示) 6,显示学生信息(含修改)\n\n");; printf("7,统计(单个显示和全显示) 8,删除\n\n"); printf("9,全删 0,返回\n\n"); printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n"); printf("请选择: "); } }