#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STU_NUM 40 //信息最大存储数
int DAY[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
//记录平年闰年每个月的天数DAY[0]为平年 DAY[1]为闰年
typedef struct
{
char no[20];//学号
char name[20];//姓名
char sex[5];//性别
int time[3];//出生日期
int score[3];//分数
float avg;//平均分
}STU;//结构体类型为STU
void PRINT();
void Dis_Stu_Info(STU stu[],int n);
//两个函数的声明
//添加学生信息 直接加在数组尾部 尾部元素是stu[n]
int Add_Stu_Info(STU stu[],int n)
{
int i,flag=0;
char temp[20];
system("cls");
do
{
flag=0;//flag为0说明没有重复学号
printf("请输入学生学号:");
scanf("%s",temp);
for(i=0;i<n;i++)
{
if(!strcmp(temp,stu[i].no))//遍历结构体数组 如果有相同学号
{
flag=1;//flag变成1
break;//相同跳出循环
}
}
if(flag)//如果是1 说明重复
{
printf("已存在该学号,请重新输入!\n");
}
else//如果没有重复 把学号添加到最后一个元素中
{
strcpy(stu[n].no,temp);
}
}while(flag);//如果重复就循环
printf("请输入学生姓名:");
scanf("%s",&stu[n].name);
printf("请输入学生性别:");
scanf("%s",&stu[n].sex);
do
{
flag=0;
printf("请输入学生生日(y-m-d):");
scanf("%d-%d-%d",&stu[n].time[0],&stu[n].time[1],&stu[n].time[2]);
if(stu[n].time[0]>=1980&&stu[n].time[0]<=2000)//年份是否满足1980-2000
{
if(stu[n].time[1]>=1&&stu[n].time[1]<=12)//日期是否满足1-12月
{
if((stu[n].time[0]/4==0 && stu[n].time[0]/100!=0) || (stu[n].time[0]/400==0))
{
flag=1;//判断闰年 如果flag是1 就是闰年 0就是平年
}
if(stu[n].time[2]<=DAY[flag][stu[n].time[1]-1]&&stu[n].time[2]>=1)
{//DAY[flag][stu[n].time[1]-1] tu[n].time[1]-1 输入的1-12代表月份 在数组的0-11保存 所以对应-1
break;//如果都满足 跳出循环
}
}
}
printf("日期不正确!重新输入!\n");
}while(1);
do
{
printf("请输入学生程序设计分数:");
scanf("%d",&stu[n].score[0]);
if(stu[n].score[0]>=0&&stu[n].score[0]<=100)//分数要满足0-100才能跳出录入
{
break;
}
printf("成绩范围错误!重新输入!\n");
}while(1);
do
{
printf("请输入学生高等数学分数:");
scanf("%d",&stu[n].score[1]);
if(stu[n].score[1]>=0&&stu[n].score[1]<=100)
{
break;
}
printf("成绩范围错误!重新输入!\n");
}while(1);
do
{
printf("请输入学生大学英语分数:");
scanf("%d",&stu[n].score[2]);
if(stu[n].score[2]>=0&&stu[n].score[2]<=100)
{
break;
}
printf("成绩范围错误!重新输入!\n");
}while(1);
stu[n].avg=(stu[n].score[0]+stu[n].score[1]+stu[n].score[2])/3.0;//平均分是三科之和除以3
PRINT();//显示中文提示
Dis_Stu_Info(&stu[n],1);//显示新录入的学生信息
printf("录入成功!\n");
n++;//结构体数组 元素增大一
system("pause");
return n;//返回新的数量给主函数
}
/*输入学生信息*/
int Input_Stu_Info(STU stu[],int n)
{
char temp[20];
do
{
n=Add_Stu_Info(stu,n);//调用输入函数
printf("是否继续录入(Y/N)!\n");//询问是否继续输入
scanf("%s",temp);
}while(!strcmp(temp,"Y")||!strcmp(temp,"y"));//如果输入y Y则继续输入
return n;
}
void Modify_Stu_Info(STU stu[],int n)
{
int i,flag=0;
char temp[20];
system("cls");
flag=0;
printf("请输入要修改的学生学号:");
scanf("%s",temp);
for(i=0;i<n;i++)
{
if(!strcmp(temp,stu[i].no))//遍历结构体数组 如果有相同的
{
flag=1;//说明找到这个学号
break;
}
}
if(!flag)//如果flag是0
{
printf("无该学号!\n");
system("pause");
return ;//函数结束
}
//否则输入新的信息
printf("请输入学生姓名:");
scanf("%s",&stu[i].name);
printf("请输入学生性别:");
scanf("%s",&stu[i].sex);
do
{
flag=0;
printf("请输入学生生日(y-m-d):");
scanf("%d-%d-%d",&stu[i].time[0],&stu[i].time[1],&stu[i].time[2]);
if(stu[i].time[0]>=1980&&stu[i].time[0]<=2000)
{
if(stu[i].time[1]>=1&&stu[i].time[1]<=12)
{
if((stu[i].time[0]/4==0 && stu[i].time[0]/100!=0) || (stu[i].time[0]/400==0))
{
flag=1;
}
if(stu[i].time[2]<=DAY[flag][stu[i].time[1]-1]&&stu[i].time[2]>=1) //判断闰年
{
break;
}
}
}
printf("日期不正确!重新输入!\n");
}while(1);
do
{
printf("请输入学生程序设计分数:");
scanf("%d",&stu[i].score[0]);
if(stu[i].score[0]>=0&&stu[i].score[0]<=100)
{
break;
}
printf("成绩范围错误!重新输入!\n");
}while(1);
do
{
printf("请输入学生高等数学分数:");
scanf("%d",&stu[i].score[1]);
if(stu[i].score[1]>=0&&stu[i].score[1]<=100)
{
break;
}
printf("成绩范围错误!重新输入!\n");
}while(1);
do
{
printf("请输入学生大学英语分数:");
scanf("%d",&stu[i].score[2]);
if(stu[i].score[2]>=0&&stu[i].score[2]<=100)
{
break;
}
printf("成绩范围错误!重新输入!\n");
}while(1);
stu[i].avg=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
printf("修改成功!\n");
system("pause");
}
//删除学生信息
int Del_Stu_Info(STU stu[],int n)
{
int i,flag=0,j;
char temp[20];
system("cls");
flag=0;
printf("请输入要删除的学生学号:");
scanf("%s",temp);
for(i=0;i<n;i++)
{
if(!strcmp(temp,stu[i].no))
{
flag=1;//同样 找到则跳出
break;
}
}
if(!flag)
{
printf("无该学号!\n");
system("pause");
return n;
}
PRINT();//找到后输出这个学生的信息
Dis_Stu_Info(&stu[i],1);
printf("确认删除(Y/N)?");//询问是否删除
scanf("%s",temp);
if(!strcmp(temp,"Y")||!strcmp(temp,"y"))
{
for(j=i;j<n;j++)//每一个数组元素都前移 达到删除效果 1 2 3 删除2 变成 1 3 3但是计数器变2 只显示1 3
{
stu[j]=stu[j+1];
}
n--;//计数器减一
printf("删除成功!\n");
}
else
{
printf("取消删除成功!\n");
}
system("pause");
return n;
}
int menu(STU stu[],int n)
{
int chioce;
system("cls");
if(n!=0)
{
PRINT();//显示中文提示
Dis_Stu_Info(stu,n);//显示新录入的学生信息
}
printf("1: 学生信息录入\n");
printf("2: 学生信息增加\n");
printf("3: 学生信息修改\n");
printf("4: 学生信息删除\n");
printf("5: 学生成绩排序\n");
printf("6: 排序学生信息\n");
printf("7: 查找学生信息\n");
printf("8: 查询各分数段\n");
printf("9: 各课程最高分\n");
printf("10:统计各科成绩\n");
printf("11:一门课程不合格\n");
printf("0: 退出\n");
printf("请输入选择:");
scanf("%d",&chioce);
while(chioce<0||chioce>11)//判断选择是否正确
{
printf("请重新输入:");
scanf("%d",&chioce);
}
return chioce;//返回给主函数
}
void PRINT()
{
printf("%-20s","学号");
printf("%-20s","姓名");
printf("%-10s","性别");
printf("%-20s","出生日期");
printf("%-20s","程序设计");
printf("%-20s","高等数学");
printf("%-20s","大学英语");
printf("%-20s","平均成绩");
printf("\n");
}
//显示信息 stu是要显示的首地址 n是要显示的个数
void Dis_Stu_Info(STU stu[],int n)
{
int i;
if(n==0)
{
printf("无学生信息!\n");
system("pause");
return ;
}
for(i=0;i<n;i++)
{
printf("%-20s",stu[i].no);
printf("%-20s",stu[i].name);
printf("%-10s",stu[i].sex);
printf("%4d-%-2d-%-12d",stu[i].time[0],stu[i].time[1],stu[i].time[2]);
printf("%-20d",stu[i].score[0]);
printf("%-20d",stu[i].score[1]);
printf("%-20d",stu[i].score[2]);
printf("%-20g",stu[i].avg);
printf("\n");
}
}
/*对分数进行排序 */
void Sort_Score(STU stu[],int n,int m)//m代表第几科
{
int i,j;
STU temp;
if(m==3)//如果m是3 则对平均分排序
{
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(stu[i].avg<stu[j].avg)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
}
else
{
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(stu[i].score[m]<stu[j].score[m])//否则对第m门课排序
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
}
}
/*分数排序菜单*/
void Sort_Score_Menu(STU stu[],int n)
{
int chioce;
do
{
system("cls");
printf("1:按程序设计\n");
printf("2:按高等数学\n");
printf("3:按大学英语\n");
printf("4:按平均成绩\n");
printf("0:退出\n");
printf("请输入选择:");
scanf("%d",&chioce);
while(chioce<0||chioce>4)
{
printf("重新输入:");
scanf("%d",&chioce);
}
switch(chioce)
{
case 0:
return;
break;
case 1:
case 2:
case 3:
case 4:
Sort_Score(stu,n,chioce-1);
break;
}
system("cls");
PRINT();
Dis_Stu_Info(stu,n);//对排序后的数据显示
system("pause");
}while(1);
}
/*对学号进行排序*/
void Sort_No(STU stu[],int n)
{
int i,j;
STU temp;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(strcmp(stu[i].no,stu[j].no)>0)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
}
/*对名字进行排序*/
void Sort_Name(STU stu[],int n)
{
int i,j;
STU temp;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(strcmp(stu[i].name,stu[j].name)>0)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
}
/*学生排序信息菜单*/
void Sort_Stu_Info_Menu(STU stu[],int n)
{
int chioce;
do
{
system("cls");
printf("1:按学号排序\n");
printf("2:按姓名排序\n");
printf("0:退出\n");
printf("请输入选择:");
scanf("%d",&chioce);
while(chioce<0||chioce>2)
{
printf("重新输入:");
scanf("%d",&chioce);
}
switch(chioce)
{
case 0:
return ;
break;
case 1:
Sort_No(stu,n);
break;
case 2:
Sort_Name(stu,n);
break;
}
system("cls");
PRINT();
Dis_Stu_Info(stu,n);
system("pause");//打印排序后的信息
}while(1);
}
/*保存文件信息*/
void Save_Stu_Info(STU stu[],int n)
{
int i;
FILE* fp;//文件指针
fp=fopen("Stu_Info.dat","w");//打开文件
for(i=0;i<n;i++)
{
fwrite(&stu[i],1,sizeof(STU),fp);//向文件写入
}
fclose(fp);//关闭文件
}
void Load_Stu_Info(STU stu[],int* n)//加载文件
{
FILE* fp;
fp=fopen("Stu_Info.dat","r");
if(fp==NULL)
{
return ;
}
while(fread(&stu[*n],1,sizeof(STU),fp))
{
(*n)++;
}
fclose(fp);
}
/*按名字查找*/
void Serach_Name(STU stu[],int n)
{
int i,flag;
char temp[20];
system("cls");
printf("请输入要查找的姓名:");
scanf("%s",temp);
flag=1;
for(i=0;i<n;i++)
{
if(!strcmp(temp,stu[i].name))
{
if(flag)//flag可以确保只输出一次 PRINT
{
PRINT();
}
Dis_Stu_Info(&stu[i],1);
flag=0;
}
}
if(flag)
{
printf("无该姓名信息!\n");
}
system("pause");
}
/*按年龄查找*/
void Serach_Age(STU stu[],int n)
{
int i,flag;
int temp;
system("cls");
printf("请输入要查找的年份:");
scanf("%d",&temp);
flag=1;
for(i=0;i<n;i++)
{
if(temp==stu[i].time[0])
{
if(flag)
{
PRINT();
}
Dis_Stu_Info(&stu[i],1);
flag=0;
}
}
if(flag)
{
printf("无该姓名信息!\n");
}
system("pause");
}
/*按性别查找*/
void Serach_Sex(STU stu[],int n)
{
int i,flag;
char temp[20];
system("cls");
printf("请输入要查找的性别:");
scanf("%s",temp);
flag=1;
for(i=0;i<n;i++)
{
if(!strcmp(temp,stu[i].sex))
{
if(flag)
{
PRINT();
}
Dis_Stu_Info(&stu[i],1);
flag=0;
}
}
if(flag)
{
printf("无该姓名信息!\n");
}
system("pause");
}
/*查找菜单*/
void Serach_Stu_Info_Menu(STU stu[],int n)
{
int chioce;
do
{
system("cls");
printf("1:按姓名查找\n");
printf("2:按年龄查找\n");
printf("3:按性别查找\n");
printf("0:退出\n");
printf("请输入选择:");
scanf("%d",&chioce);
while(chioce<0||chioce>3)
{
printf("重新输入:");
scanf("%d",&chioce);
}
switch(chioce)
{
case 1:
Serach_Name(stu,n);
break;
case 2:
Serach_Age(stu,n);
break;
case 3:
Serach_Sex(stu,n);
break;
}
}while(chioce!=0);
}
/*对某个区间内的分数进行查找 m代表第几门课 min-max代表区间*/
void Serach_Score(STU stu[],int n,int m,int min,int max)
{
int i,flag;
system("cls");
flag=0;
for(i=0;i<n;i++)
{
if(stu[i].score[m]>min&&stu[i].score[m]<max)
{
if(flag==0)
{
PRINT();
}
Dis_Stu_Info(&stu[i],1);
flag++;//flag记录人数
}
}
if(flag==0)
{
printf("无符合信息学生!\n");
}
else
{
printf("符合信息人数共有:%d人!\n",flag);
}
system("pause");
}
/*查找学生分数菜单*/
void Serach_Stu_Score_Menu(STU stu[],int n)
{
int chioce;
int min,max;
do
{
system("cls");
printf("1:程序设计\n");
printf("2:高等数学\n");
printf("3:大学英语\n");
printf("0:退出\n");
printf("请输入选择:");
scanf("%d",&chioce);
while(chioce<0||chioce>3)
{
printf("重新输入:");
scanf("%d",&chioce);
}
if(chioce!=0)
{
printf("请输入要查询的下界:");
scanf("%d",&min);
printf("请输入要查询的上界:");
scanf("%d",&max);
}
switch(chioce)
{
case 1:
case 2:
case 3:
Serach_Score(stu,n,chioce-1,min,max);
break;
}
}while(chioce!=0);
}
/*查找最高分*/
void Serach_Max_Score(STU stu[],int n,int m)
{
int i;
int max=stu[0].score[m];
for(i=1;i<n;i++)
{
if(max<stu[i].score[m])
{
max=stu[i].score[m];
}
}
printf("该科最高分为:%d\n",max);
system("pause");
}
void Serach_Max_Score_Menu(STU stu[],int n)
{
int chioce;
do
{
system("cls");
printf("1:程序设计\n");
printf("2:高等数学\n");
printf("3:大学英语\n");
printf("0:退出\n");
printf("请输入选择:");
scanf("%d",&chioce);
while(chioce<0||chioce>3)
{
printf("重新输入:");
scanf("%d",&chioce);
}
switch(chioce)
{
case 1:
case 2:
case 3:
Serach_Max_Score(stu,n,chioce-1);
break;
}
}while(chioce!=0);
}
//统计分数段
void Total_Score(STU stu[],int n,int m)
{
int i;
int sum[5]={0};
system("cls");
for(i=0;i<n;i++)
{
switch(stu[i].score[m]/10)//分数除以10
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
sum[4]++;
break;
case 6:
sum[3]++;
break;
case 7:
sum[2]++;
break;
case 8:
sum[1]++;
break;
case 9:
case 10:
sum[0]++;
break;
}
}
printf("%-15s%-10s%10s\n","成绩段","人数","百分比");
printf("%-15s%-10d%10g%%\n","90 - 100",sum[0],sum[0]*100.0/n);
printf("%-15s%-10d%10g%%\n","80 - 89",sum[1],sum[1]*100.0/n);
printf("%-15s%-10d%10g%%\n","70 - 79",sum[2],sum[2]*100.0/n);
printf("%-15s%-10d%10g%%\n","60 - 69",sum[3],sum[3]*100.0/n);
printf("%-15s%-10d%10g%%\n"," 0 - 59",sum[4],sum[4]*100.0/n);
system("pause");
}
//查找只有一科不合格的人
void Sreach_Pass_Info(STU stu[],int n)
{
int i,j,sum;
system("cls");
PRINT();
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<3;j++)
{
if(stu[i].score[j]<60)
{
sum++;
}
}
if(sum==1)
{
Dis_Stu_Info(&stu[i],1);
}
}
system("pause");
}
void Total_Score_Menu(STU stu[],int n)
{
int chioce;
do
{
system("cls");
printf("1:程序设计\n");
printf("2:高等数学\n");
printf("3:大学英语\n");
printf("0:退出\n");
printf("请输入选择:");
scanf("%d",&chioce);
while(chioce<0||chioce>3)
{
printf("重新输入:");
scanf("%d",&chioce);
}
switch(chioce)
{
case 1:
case 2:
case 3:
Total_Score(stu,n,chioce-1);
break;
}
}while(chioce!=0);
}
int main()
{
int chioce;
STU stu[MAX_STU_NUM];
int NUM=0;//记录学生人数
Load_Stu_Info(stu,&NUM);
system("mode con: cols=140 lines=40");//设置控制台大小
do
{
chioce=menu(stu,NUM);
switch(chioce)
{
case 1:
NUM = Input_Stu_Info(stu,NUM);
Save_Stu_Info(stu,NUM);
break;
case 2:
NUM = Add_Stu_Info(stu,NUM);
Save_Stu_Info(stu,NUM);
break;
case 3:
Modify_Stu_Info(stu,NUM);
Save_Stu_Info(stu,NUM);
break;
case 4:
NUM=Del_Stu_Info(stu,NUM);
Save_Stu_Info(stu,NUM);
break;
case 5:
Sort_Score_Menu(stu,NUM);
break;
case 6:
Sort_Stu_Info_Menu(stu,NUM);
break;
case 7:
Serach_Stu_Info_Menu(stu,NUM);
break;
case 8:
Serach_Stu_Score_Menu(stu,NUM);
break;
case 9:
Serach_Max_Score_Menu(stu,NUM);
break;
case 10:
Total_Score_Menu(stu,NUM);
break;
case 11:
Sreach_Pass_Info(stu,NUM);
break;
}
}while(chioce!=0);
return 0;
}
成绩管理系统
最新推荐文章于 2024-07-11 19:57:37 发布