用C语言代码写一个简单的学生成绩管理系统,通过菜单选择功能实现学生信息的录入、某门课程成绩的最高、最低和平均值计算、某门课程成绩的排序、学号/姓名查找学生信息等操作。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int N = 40;
int i,j;
typedef struct control
{
int no;
char name[20];
char name1[20];
int cj[7];
int all;
int lave;
} AVA;
// ------------------------函数
void menu();
void menu1();
void menu2();
void menu4(AVA stu[],int n,int n3);
//-------------------------
//-------------------------链接菜单与功能的函数
void basic(AVA stu[]);
//------------------------
//-------------------------信息录入函数
void keyboard(AVA stu[],int n,int n2);
//------------------------功能函数调用总函数
void case1(AVA stu[],int n,int a);
//========================
//------------------------功能函数
void function4(AVA stu[],AVA t,int n);//总分排序
void function5(AVA stu[],AVA t,int n);//学号排序
void function6(AVA stu[],AVA t,int n);//姓名排序
void function7(AVA stu[],AVA t,int n,int w);//学号查找
void function8(AVA stu[],AVA t,int n,char s[]);//姓名查找
void function9(AVA stu[],int n,int a);//数据分析
void function10(AVA stu[],int n,int a,int b1[],int b2[]);//输出学生信息
void function11(AVA stu[],int n,int a);//存进文件里面
void exchange(AVA stu[],int a,int b);//读档函数
//-------------------------
int main()
{
AVA stu[N];
for(i = 0; i < 30; i ++)
{
stu[i].all = 0;
stu[i].lave = 0;
}
basic(stu);
return 0;
}
void menu()
{
printf("_ _\n");
printf("| |\n");
printf(" \n");
printf(" \n");
printf(" 学生信息管理系统 \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf("| |\n");
printf("- -\n");
}
void menu1()
{
printf("-> 信息输入 <-\n");
printf("-> 学课成绩 <-\n");
printf("-> 学生成绩 <-\n");
printf("-> 总分排序 <-\n");
printf("-> 学号排序 <-\n");
printf("-> 姓名排序 <-\n");
printf("-> 学号查询 <-\n");
printf("-> 姓名查询 <-\n");
printf("-> 数据分析 <-\n");
printf("-> 信息输出 <-\n");
printf("-> 数据存档 <-\n");
}
void menu2()
{
printf("_ _\n");
printf("| |\n");
printf("-> 功能代号 <-\n");
printf("-> <1><2><3><4><5><6><7><8><9><10><11> <-\n");
printf("| |\n");
printf("- -\n");
}
void menu4(AVA stu[],int n,int n3)//读档函数总调用
{
printf("如果档案中没有存有足够的学科数,则可能提取乱码\n");
printf("如果文件中没有数据则会显示无法打开\n");
exchange( stu,n,n3);
case1( stu,n,n3);
}
//中转函数,菜单与功能的桥梁
void basic(AVA stu[])
{
menu();
printf("若无学生信息档案需要先录入\n");
printf("<1-录入><2-读档><3-退出>\n");
int n,n1,n3;
do
{
scanf("%d",&n1);
if(3<n1||n1<1)
{
printf("数据输入错误,请重新输入\n");
}
}while(3<n1||n1<1);
printf("输入学生数量\n");
do
{
scanf("%d",&n);
if(30<n||n<1)
{
printf("数据输入错误,请重新输入<1-30>\n");
}
}while(30<n||n<1);
printf("输入学科数量\n");
do
{
scanf("%d",&n3);
if(6<n3||n3<3)
{
printf("数据输入错误,请重新输入<3-6>\n");
}
}while(6<n3||n3<3);
if(n1==1)
{
keyboard( stu,n,n3);
case1( stu, n,n3);
}
else if(n1==2) menu4(stu,n,n3);
else
{
printf("欢迎再次使用\n");
exit(0);
}
}
//=========================功能函数调用的函数
void case1(AVA stu[],int n,int a)
{
AVA t;
for(i = 0; i < n; i ++)
{
for(j = 0; j < a; j ++)
{
stu[i].all+=stu[i].cj[j];
}
stu[i].lave = stu[i].all/a;
}
int x[10]={0},y[10]={0};
for(j = 0; j < a;j ++)
{
for(i = 0; i < n; i ++)
{
y[j]+=stu[i].cj[j];
}
}
for(i = 0; i < a; i ++)
{
x[i] = y[i]/n;
}
menu1();
menu2();
printf("数据录入成功\n");
printf("请输入你想选择的功能\n");
int n2;
while(scanf("%d",&n2)&&n2!=0)
{
if(n2==2)
{
for(i = 0; i < a; i ++)
{
printf("第%d门总分为:%d,平均分为:%d\n",i+1,y[i],x[i]);
}
menu1();
menu2();
printf("完成\n");
}
else if(n2==3)
{
int f;
printf("计算完成,是否打印?<1 or 0>\n");
scanf("%d",&f);
if(f==1)
{
for(i = 0; i < n; i ++)
{
printf("第%d个同学的总分为:%d,平均分为:%d\n",i+1,stu[i].all,stu[i].lave);
}
printf("打印完成\n");
menu2();
}
else
{
menu1();
menu2();
}
printf("完成\n");
}
else if(n2==4)
{
function4( stu, t, n);
menu1();
menu2();
printf("完成\n");
}
else if(n2==5)
{
function5( stu, t, n);
menu1();
menu2();
printf("完成\n");
}
else if(n2==6)
{
function6( stu, t, n);
menu1();
menu2();
printf("完成\n");
}
else if(n2==7)
{
int w;
printf("输入你想查询的学号\n");
scanf("%d",&w);
function7( stu, t, n, w);
menu1();
menu2();
printf("完成\n");
}
else if(n2==8)
{
char s[30];
printf("输入你想查询的名字\n");
scanf("%s",s);
function8(stu,t, n,s);
menu1();
menu2();
printf("完成\n");
}
else if(n2==9)
{
function9( stu, n, a);
menu1();
menu2();
printf("完成\n");
}
else if(n2==10)
{
function10( stu, n, a, x, y);
menu1();
menu2();
printf("完成\n");
}
else if(n2==11)
{
function11( stu, n, a);
menu1();
menu2();
printf("完成\n");
}
else menu2();
}
}
//=========================信息录入函数
void keyboard(AVA stu[],int n,int n2)
{
for(i = 0; i < n; i ++)
{
printf("正在输入%d个学生信息\n",i+1); //
printf("学号:\n");
scanf("%d",&stu[i].no);
printf("姓名:\n");
scanf("%s",stu[i].name);
printf("姓名拼音简写\n");
scanf("%s",stu[i].name1);
printf("分别输入%d门学课成绩\n",n2);
for(j = 0; j < n2; j ++)
{
scanf("%d",&stu[i].cj[j]);
}
}
}
void function4(AVA stu[],AVA t,int n)//总分排序
{
printf("总分排序\n");
FILE *fp;
for(i = 0; i < n-1;i ++)
for(j = 0; j < n-1-i;j++)
{
if(stu[j].all<stu[j+1].all)
{
t = stu[j];
stu[j] = stu[j+1];
stu[j+1] = t;
}
}
printf("正在生成文件\n");
printf("请及时拷贝文件,否则会造成数据丢失\n");
fp = fopen("总分排序.txt","w");
if(fp==NULL)
{
printf("打开失败\n");
exit(0);
}
for(i = 0; i < n;i ++)
{
fprintf(fp,"%s %d\n",stu[i].name,stu[i].all);
}
fclose(fp);
}
void function5(AVA stu[],AVA t,int n)//学号排序
{
printf("学号排序\n");
FILE *fp;
for(i = 0; i < n-1;i ++)
for(j = 0; j < n-1-i;j++)
{
if(stu[j].no<stu[j+1].no)
{
t = stu[j];
stu[j] = stu[j+1];
stu[j+1] = t;
}
}
char name[N];
strcpy(name,"学号为:");
printf("正在生成文件\n");
printf("请及时拷贝文件,否则会造成数据丢失\n");
fp = fopen("学号排序.txt","w");
if(fp==NULL)
{
printf("打开失败\n");
exit(0);
}
for(i = 0; i < n;i ++)
{
fprintf(fp,"%s%d\n",name,stu[i].no);
fprintf(fp,"%s%d\n",stu[i].name,stu[i].all);
}
fclose(fp);
}
void function6(AVA stu[],AVA t,int n)//姓氏排序
{
printf("姓名排序\n");
FILE *fp;
for(i = 0; i < n-1;i ++)
for(j = 0; j < n-1-i;j++)
{
if(stu[j].name1[0]>stu[j+1].name1[0])
{
t = stu[j];
stu[j] = stu[j+1];
stu[j+1] = t;
}
}
printf("正在生成文件\n");
printf("请及时拷贝文件,否则会造成数据丢失\n");
fp = fopen("姓名排序.txt","w");
if(fp==NULL)
{
printf("打开失败\n");
exit(0);
}
for(i = 0; i < n;i ++)
{
fprintf(fp,"%s%d\n",stu[i].name,stu[i].all);
}
fclose(fp);
}
void function7(AVA stu[],AVA t,int n,int w)//学号查找
{
int m = 0;
for(i = 0; i < n-1;i ++)
for(j = 0; j < n-1-i;j++)
{
if(stu[j].all<stu[j+1].all)
{
t = stu[j];
stu[j] = stu[j+1];
stu[j+1] = t;
}
}
for(i = 0; i <n; i ++)
{
m++;
if(stu[i].no==w)
{
printf("学号为:%d\n",stu[i].no);
printf("姓名为:%s\n",stu[i].name);
printf("成绩为:%d\n",stu[i].all);
printf("排名为:%d\n",m);
break;
}
}
}
void function8(AVA stu[],AVA t,int n,char s[])//姓名查找
{
int m = 0;
for(i = 0; i < n-1;i ++)
for(j = 0; j < n-1-i;j++)
{
if(stu[j].all<stu[j+1].all)
{
t = stu[j];
stu[j] = stu[j+1];
stu[j+1] = t;
}
}
for(i = 0; i <n; i ++)
{
m++;
if(strcmp(stu[i].name,s)==0)
{
printf("学号为:%d\n",stu[i].no);
printf("姓名为:%s\n",stu[i].name);
printf("成绩为:%d\n",stu[i].all);
printf("排名为:%d\n",m);
break;
}
}
}
void function9(AVA stu[],int n,int a)//数据分析
{
printf("请在文件夹中查看\n");
for(i = 0; i < a; i++)
{
double k1=0,k2=0,k3=0,k4=0,k5=0;
for( j = 0; j < n; j ++)
{
if(stu[j].cj[i]>=90) k1++;
else if(stu[j].cj[i]>=80&&stu[j].cj[i]<=89) k2++;
else if(stu[j].cj[i]>=70&&stu[j].cj[i]<=79) k3++;
else if(stu[j].cj[i]>=60&&stu[j].cj[i]<=69) k4++;
else if(stu[j].cj[i]<=59) k5++;
}
FILE *fp;
fp = fopen("数据分析.txt","a");
if(fp==NULL)
{
printf("打开失败\n");
exit(0);
}
char s[20];
strcpy(s,"subject");
s[7] = '0'+i;
s[8] = '\0';
char name1[20];
char name2[20];
char name3[20];
char name4[20];
char name5[20];
strcpy(name1,"优:%");
strcpy(name2,"良好:%");
strcpy(name3,"中等:%");
strcpy(name4,"及格:%");
strcpy(name5,"不及格:%");
fprintf(fp,"\n%s\n",s);
fprintf(fp,"%s%.2f\n",name1,(k1*100)/n);
fprintf(fp,"%s%.2f\n",name2,(k2*100)/n);
fprintf(fp,"%s%.2f\n",name3,(k3*100)/n);
fprintf(fp,"%s%.2f\n",name4,(k4*100)/n);
fprintf(fp,"%s%.2f\n",name5,(k5*100)/n);
k1=0,k2=0,k3=0,k4=0,k5=0;
fclose(fp);
}
}
void function10(AVA stu[],int n,int a,int b1[],int b2[])//输出学生信息
{
for(i = 0; i < n; i ++)
{
printf("学号:%d\n",stu[i].no);
printf("姓名:%s\n",stu[i].name);
printf("总分:%d\n",stu[i].all);
printf("平均分:%d\n",stu[i].lave);
printf("每科分数为:");
for(j = 0; j < a; j ++)
{
printf("%d ",stu[i].cj[j]);
}
printf("\n");
printf("\n");
printf("\n");
printf("\n");
}
printf("学科平均分为:\n");
for(j = 0; j < a; j ++)
{
printf("第%d学科平均分为:%d\n",j+1,b1[j]);
}
printf("学科总分:\n");
for(j = 0; j < a; j ++)
{
printf("第%d学科总分为:%d\n",j+1,b2[j]);
}
}
void function11(AVA stu[],int n,int a)//存进文件中
{
FILE *fp;
fp = fopen("学生信息存档.txt","a");
if(fp==NULL)
{
printf("无法打开\n");
exit(0);
}
char name[30];
char name1[30];
char name2[30];
strcpy(name,"每科成绩:");
strcpy(name1,"总平均成绩:");
strcpy(name2,"总成绩:");
for(i = 0; i < n; i ++)
{
fprintf(fp,"\n%d %s\n",stu[i].no,stu[i].name);
fprintf(fp,"%s %d\n",name2,stu[i].all);
fprintf(fp,"%s %d\n",name1,stu[i].lave);
fprintf(fp,"%s\n",name);
for(j = 0; j < a;j ++)
{
fprintf(fp,"%d ",stu[i].cj[j]);
}
}
fclose(fp);
FILE *fpk1,*fpk2,*fpk3,*fpk4,*fpk5,*fpk6,*fpk7,*fpk8,*fpk9;
fpk1 = fopen("学号.txt","a");
fpk2 = fopen("姓名.txt","a");
fpk3 = fopen("姓名简称.txt","a");
fpk4 = fopen("学科1.txt","a");
fpk5 = fopen("学科2.txt","a");
fpk6 = fopen("学科3.txt","a");
fpk7 = fopen("学科4.txt","a");
fpk8 = fopen("学科5.txt","a");
fpk9 = fopen("学科6.txt","a");
if(fpk1==NULL||fpk2==NULL||fpk3==NULL||fpk4==NULL||fpk5==NULL||fpk6==NULL||fpk7==NULL||fpk8==NULL||fpk9==NULL)
{
printf("无法打开\n");
exit(0);
}
for(i = 0; i < n; i ++)
{
fprintf(fpk1,"%d\n",stu[i].no);
fprintf(fpk2,"%s\n",stu[i].name);
fprintf(fpk3,"%s\n",stu[i].name1);
fprintf(fpk4,"%d\n",stu[i].cj[0]);
fprintf(fpk5,"%d\n",stu[i].cj[1]);
fprintf(fpk6,"%d\n",stu[i].cj[2]);
if(a==4||a==5||a==6)
{
fprintf(fpk7,"%d\n",stu[i].cj[3]);
}
if(a==5||a==6)
{
fprintf(fpk8,"%d\n",stu[i].cj[4]);
}
if(a==6)
{
fprintf(fpk9,"%d\n",stu[i].cj[5]);
}
}
fclose(fpk1);
fclose(fpk2);
fclose(fpk3);
fclose(fpk4);
fclose(fpk5);
fclose(fpk6);
fclose(fpk7);
fclose(fpk8);
fclose(fpk9);
}
void exchange(AVA stu[],int a,int b)//读档函数 a学生b学科
{
FILE *fpk1,*fpk2,*fpk3,*fpk4,*fpk5,*fpk6,*fpk7,*fpk8,*fpk9;
fpk1 = fopen("学号.txt","r");
fpk2 = fopen("姓名.txt","r");
fpk3 = fopen("姓名简称.txt","r");
fpk4 = fopen("学科1.txt","r");
fpk5 = fopen("学科2.txt","r");
fpk6 = fopen("学科3.txt","r");
fpk7 = fopen("学科4.txt","r");
fpk8 = fopen("学科5.txt","r");
fpk9 = fopen("学科6.txt","r");
if(fpk1==NULL||fpk2==NULL||fpk3==NULL||fpk4==NULL||fpk5==NULL||fpk6==NULL||fpk7==NULL||fpk8==NULL||fpk9==NULL)
{
printf("无法打开\n");
exit(0);
}
i = 0;
char s1[N],s2[N],s3[N],s4[N],s5[N],s6[N],s7[N],s8[N],s9[N];
while(fgets(s1,40,fpk1)!=NULL)
{
int w;
w = strlen(s1);
if(w==2)
{
stu[i].no = s1[0]-'0';
}
else if(w==3)
{
stu[i].no=(s1[0]-'0')*10+s1[1]-'0';
}
i++;
if(i==a) break;
}
i=0;
while(fgets(s2,40,fpk2)!=NULL)
{
strcpy(stu[i].name,s2);
i++;
if(i==a)break;
}
i=0;
while(fgets(s3,40,fpk3)!=NULL)
{
strcpy(stu[i].name1,s3);
i++;
if(i==a)break;
}
i = 0;
while(fgets(s4,40,fpk4)!=NULL)
{
int w;
w = strlen(s4);
if(w==2)
{
stu[i].cj[0] = s4[0]-'0';
}
else if(w==3)
{
stu[i].cj[0]=(s4[0]-'0')*10+s4[1]-'0';
}
i++;
if(i==a) break;
}
i = 0;
while(fgets(s5,40,fpk5)!=NULL)
{
int w;
w = strlen(s5);
if(w==2)
{
stu[i].cj[1] = s5[0]-'0';
}
else if(w==3)
{
stu[i].cj[1]=(s5[0]-'0')*10+s5[1]-'0';
}
i++;
if(i==a) break;
}
i = 0;
while(fgets(s6,40,fpk6)!=NULL)
{
int w;
w = strlen(s6);
if(w==2)
{
stu[i].cj[2] = s6[0]-'0';
}
else if(w==3)
{
stu[i].cj[2]=(s6[0]-'0')*10+s6[1]-'0';
}
i++;
if(i==a) break;
}
if(b==4||b==5||b==6)
{
i = 0;
while(fgets(s7,40,fpk7)!=NULL)
{
int w;
w = strlen(s7);
if(w==2)
{
stu[i].cj[3] = s7[0]-'0';
}
else if(w==3)
{
stu[i].cj[3]=(s7[0]-'0')*10+s7[1]-'0';
}
i++;
if(i==a) break;
}
}
if(b==5||b==6)
{
i = 0;
while(fgets(s8,40,fpk8)!=NULL)
{
int w;
w = strlen(s8);
if(w==2)
{
stu[i].cj[4] = s8[0]-'0';
}
else if(w==3)
{
stu[i].cj[4]=(s8[0]-'0')*10+s8[1]-'0';
}
i++;
if(i==a) break;
}
}
if(b==6)
{
i = 0;
while(fgets(s9,40,fpk9)!=NULL)
{
int w;
w = strlen(s9);
if(w==2)
{
stu[i].cj[5] = s9[0]-'0';
}
else if(w==3)
{
stu[i].cj[5]=(s9[0]-'0')*10+s9[1]-'0';
}
i++;
if(i==a) break;
}
}
fclose(fpk1);
fclose(fpk2);
fclose(fpk3);
fclose(fpk4);
fclose(fpk5);
fclose(fpk6);
fclose(fpk7);
fclose(fpk8);
fclose(fpk9);
printf("读档完成\n");
}
需要用到数据库吗
简单的实现,供你参考:
student 结构体来存储每个学生的信息,包括姓名、学号和三个成绩
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT_NUM 100
#define MAX_NAME_LENGTH 20
struct student {
char name[MAX_NAME_LENGTH];
int id;
int score1;
int score2;
int score3;
};
int student_count = 0;
struct student students[MAX_STUDENT_NUM];
void show_menu() {
printf("请选择要执行的操作:\n");
printf("1. 录入学生成绩\n");
printf("2. 计算某门课程成绩的最高、最低和平均值\n");
printf("3. 对某门课程成绩进行排序\n");
printf("4. 根据学号/姓名查找学生信息\n");
printf("5. 退出程序\n");
}
void input_scores() {
char name[MAX_NAME_LENGTH];
int id, score1, score2, score3;
printf("请输入学生姓名、学号、三门课程的成绩:\n");
scanf("%s %d %d %d %d", name, &id, &score1, &score2, &score3);
strcpy(students[student_count].name, name);
students[student_count].id = id;
students[student_count].score1 = score1;
students[student_count].score2 = score2;
students[student_count].score3 = score3;
student_count++;
printf("学生信息已成功录入!\n");
}
void show_score_stats() {
int which_score;
float sum = 0, max = 0, min = 100;
printf("请选择要计算的课程成绩:\n");
printf("1. 第一门课程\n");
printf("2. 第二门课程\n");
printf("3. 第三门课程\n");
scanf("%d", &which_score);
for (int i = 0; i < student_count; i++) {
switch (which_score) {
case 1:
sum += students[i].score1;
if (students[i].score1 > max) {
max = students[i].score1;
}
if (students[i].score1 < min) {
min = students[i].score1;
}
break;
case 2:
sum += students[i].score2;
if (students[i].score2 > max) {
max = students[i].score2;
}
if (students[i].score2 < min) {
min = students[i].score2;
}
break;
case 3:
sum += students[i].score3;
if (students[i].score3 > max) {
max = students[i].score3;
}
if (students[i].score3 < min) {
min = students[i].score3;
}
break;
default:
printf("无效的输入!\n");
return;
}
}
printf("最高分:%f\n", max);
printf("最低分:%f\n", min);
printf("平均分:%f\n", sum / student_count);
}
void sort_scores() {
int which_score;
printf("请选择要排序的课程成绩:\n");
printf("1. 第一门课程\n");
printf("2. 第二门课程\n");
printf("3. 第三门课程\n");
scanf("%d", &which_score);
switch (which_score) {
case 1:
for (int i = 0; i < student_count - 1; i++) {
for (int j = i + 1; j < student_count; j++) {
if (students[i].score1 < students[j].score1) {
struct student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
break;
case 2:
for (int i = 0; i < student_count - 1; i++) {
for (int j = i + 1; j < student_count; j++) {
if (students[i].score2 < students[j].score2) {
struct student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
break;
case 3:
for (int i = 0; i < student_count - 1; i++) {
for (int j = i + 1; j < student_count; j++) {
if (students[i].score3 < students[j].score3) {
struct student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
break;
default:
printf("无效的输入!\n");
return;
}
printf("排序完成!\n");
}
void search_student() {
int which_key;
int key_id;
char key_name[MAX_NAME_LENGTH];
printf("请选择查找方式:\n");
printf("1. 按学号查找\n");
printf("2. 按姓名查找\n");
scanf("%d", &which_key);
switch (which_key) {
case 1:
printf("请输入学号:\n");
scanf("%d", &key_id);
for (int i = 0; i < student_count; i++) {
if (students[i].id == key_id) {
printf("姓名:%s 学号:%d 成绩1:%d 成绩2:%d 成绩3:%d\n",
students[i].name, students[i].id, students[i].score1, students[i].score2, students[i].score3);
return;
}
}
printf("未找到匹配的学生!\n");
break;
case 2:
printf("请输入姓名:\n");
scanf("%s", key_name);
for (int i = 0; i < student_count; i++) {
if (strcmp(students[i].name, key_name) == 0) {
printf("姓名:%s 学号:%d 成绩1:%d 成绩2:%d 成绩3:%d\n",
students[i].name, students[i].id, students[i].score1, students[i].score2, students[i].score3);
return;
}
}
printf("未找到匹配的学生!\n");
break;
default:
printf("无效的输入!\n");
return;
}
}
int main() {
int choice;
do {
show_menu();
scanf("%d", &choice);
switch (choice) {
case 1:
input_scores();
break;
case 2:
show_score_stats();
break;
case 3:
sort_scores();
break;
case 4:
search_student();
break;
case 5:
printf("感谢使用!\n");
break;
default:
printf("无效的输入!\n");
}
} while (choice != 5);
return 0;
}
- 录入学生信息;
- 将输入的学生信息能够存入一个文件中,并能在这个文件中读取出这些学生信息;
- 显示所有学生信息;
- 搜索某个学生的信息;
- 更改某个学生的信息;
- 根据学生成绩对学生进行排序;