#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include<string.h>
/*
功能:
1.添加学生信息(学号,姓名,性别,5门课程成绩)
2.按学号或者姓名查找、修改、删除和保存各个学生的信息
3.按学号或者总分排序输出每个学生的信息以及总分、平均分和名次
4.计算全班各门功课的平均分,显示每门课程低于平均分的学生信息
5.显示每门课程成绩在90分以上的,以及每门课程不及格的学生信息
注意:必须排序后才能排出名次
*/
#define N 50
/*定义结构类型*/
struct student
{
int stuNo;
char name[10];
char sex[5];
float score1 ;
float score2;
float score3;
float score4;
float score5;
float sumScore;
float avgScore;
int ranking; //排名
}stu[N];
/*函数声明*/
int login();
void add();
void del();
void delByIndex(int i);
void search();
int searchByNo();
int searchByName();
void update();
void updateByIndex(int i);
void display();
void sort();
void sortByNo();
void sortBySum();
void writeFile();
void readFile();
struct student input();
void lowScoreAvg();
void greaterThanNinty();
void failed();
int count=0; //存储当前已有的学生人数
/*程序入口*/
void main()
{
int select;
int isSuccess;
int c = 0;//记录登入的次数
do
{
isSuccess = login();
if(!isSuccess)
{
printf("\n\t\t\t用户名不存在或密码错误,请检查后重新输入!\n");
printf("\n\t\t\t<您还有 %d 次机会!>",2-c);
c++;
if(c==3)
{
printf("\n\t\t您已尝试登入三次且失败,系统将退出!!!\n");
exit(1);
}
fflush(stdin);
getch();
}
else
break;
}while(1);
do
{
system("cls");
printf("\n\t\t欢迎进入学生成绩管理系统\n");
printf("\n***********************************************\n");
printf("\n1.添加学生信息\n");
printf("\n2.删除学生信息\n");
printf("\n3.修改学生信息\n");
printf("\n4.查找学生信息\n");
printf("\n5.显示学生信息\n");
printf("\n6.学生信息排序\n");
printf("\n7.单门课程低于课程平均分的学生信息\n");
printf("\n8.每门课程成绩在90分以上的学生信息\n");
printf("\n9.每门课程不及格的学生信息\n");
printf("\n10.保存文件\n");
printf("\n11.打开文件\n");
printf("\n12.退出系统\n");
printf("\n**********************************************\n");
printf("\n\t请选择<1--12>:");
scanf("%d",&select);
if(select == 12)
{
printf("\n\t~~bye!!!\n");
break;
}
switch(select)
{
case 1:
add();
break;
case 2:
del();
break;
case 3:
update();
break;
case 4:
search();
break;
case 5:
display();
break;
case 6:
sort();
display();
printf("\n排序已完成,按任意键继续...");
fflush(stdin);
getch();
break;
case 7:
lowScoreAvg();
break;
case 8:
greaterThanNinty();
break;
case 9:
failed();
break;
case 10:
writeFile();
break;
case 11:
readFile();
break;
default:
printf("\n\t您输入的选项无效!按任意键重新输入...\n");
getch();
}
}while(1);
}
/*登录界面*/
int login()
{
int i=0;
char uname[20];
char pwd[20];
system("cls");
printf("\n\t-----------------------------------------------------------\n");
printf("\n\t\t用户名:");
gets(uname);
printf("\n\t\t密 码:");
fflush(stdin);
do
{
pwd[i] = getch();
if(pwd[i]!=‘\r‘)
{
i++;
printf("*");
}
}while(pwd[i]!=‘\r‘);
pwd[i]=‘\0‘;
//验证帐号密码
if(strcmp(uname,"admin")==0 && strcmp(pwd,"admin")==0)
return 1;
else
return 0;
}
/*信息录入*/
struct student input()
{
int i;
struct student st;
do{
printf("\n输入学号:");
scanf("%d",&st.stuNo);
if(searchByNo(st.stuNo)!=-1)
{
printf("\n您输入的学号已存在!!!按任意键重新输入...\n");
}
else
{
break;
}
}while(1);
fflush(stdin);
do{
printf("请输入姓名:");
scanf("%s",st.name);
//gets(st.name);
if(searchByName(st.name)!=-1)
{
printf("\n您输入的姓名已存在!!!按任意键重新输入...\n");
}
else
{
break;
}
}while(1);
fflush(stdin);
printf("请输入性别:");
scanf("%s",st.sex);
//gets(st.sex);
printf("请输入课程1的成绩:");
scanf("%f",&st.score1);
printf("请输入课程2的成绩:");
scanf("%f",&st.score2);
printf("请输入课程3的成绩:");
scanf("%f",&st.score3);
printf("请输入课程4的成绩:");
scanf("%f",&st.score4);
printf("请输入课程5的成绩:");
scanf("%f",&st.score5);
st.sumScore = st.score1 + st.score2 + st.score3 + st.score4 + st.score5 ;
st.avgScore =st.sumScore / 5;
return st;
}
/*添加学生*/
void add()
{
char ans;
do
{
stu[count] = input();
count++;
printf("\n\t信息录入完成,是否继续(y|n):");
fflush(stdin);
ans = getchar();
}while(ans == ‘y‘||ans == ‘Y‘);
}
/*删除界面*/
void del()
{
int op;
char name[10];
int no;
int i;
do{
system("cls");
printf("主界面>删除界面");
printf("\n\t\t***********************************************\n");
printf("\n\t\t\t 1.根据学号删除\n");
printf("\n\t\t\t 2.根据姓名删除\n");
printf("\n\t\t\t 0.返回主菜单 \n");
printf("\n\t\t***********************************************\n");
printf("\n\t请选择: ");
scanf("%d",&op);
if(op == 0)
{
break;
}
switch(op)
{
case 1:
printf("请输入需要修改的学生信息的学号:");
scanf("%d",&no);
i=searchByNo();
if(i!=-1){
delByIndex(i);
}
else{
printf("\n您输入的学号不存在!!!\n");
}
break;
case 2:
printf("请输入需要修改的学生信息的姓名:");
scanf("%s",name);
//gets(name);
i=searchByName(name);
if(i!=-1){
delByIndex(i);
}
else{
printf("\n您输入的姓名不存在!!!\n");
}
break;
default:
printf("\n您输入的选项无效!!!按任意键重新输入...\n");
fflush(stdin);
getch();
}
}while(1);
}
/*根据学号删除学生信息*/
void delByIndex(int i)
{
char ans;
do
{
printf("\n需要删除的学生信息如下:\n");
printf("\n学号\t姓名\t性别\t课程1\t课程2\t课程3\t课程4\t课程5\t总分\t平均分\n");
printf("-------------------------------------------------------------------------------\n");
printf("%d\t%s\t%s\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\n",
stu[i].stuNo,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].score4,stu[i].score5,
stu[i].sumScore,stu[i].avgScore);
printf("\n确认删除该学生信息吗?<y|n>:");
fflush(stdin);
ans = getchar();
if(ans == ‘y‘ || ans ==‘Y‘)
{
int j;
for(j = i;j>count-1 ; j++)
{stu[j] = stu[j+1];}
count--;
printf("\n删除操作完成,按任意键继续...");
fflush(stdin);
getch();
}
printf("\n是否继续执行删除操作?<y|n>:");
fflush(stdin);
ans = getchar();
if(ans == ‘y‘||ans == ‘Y‘)
continue;
else
break;
}while(1);
}
/*修改界面*/
void update()
{
int op;
char name[10];
int no;
int i;
do{
system("cls");
printf("主界面>修改界面");
printf("\n\t\t***********************************************\n");
printf("\n\t\t\t 1.根据学号修改\n");
printf("\n\t\t\t 2.根据姓名修改\n");
printf("\n\t\t\t 0.返回主菜单 \n");
printf("\n\t\t***********************************************\n");
printf("\n\t请选择: ");
scanf("%d",&op);
if(op == 0)
{
break;
}
switch(op)
{
case 1:
printf("请输入需要修改的学生信息的学号:");
scanf("%d",&no);
i=searchByNo();
if(i!=-1){
updateByIndex(i);
}
else{
printf("\n您输入的学号不存在!!!\n");
}
break;
case 2:
printf("请输入需要修改的学生信息的姓名:");
scanf("%s",name);
//gets(name);
i=searchByName();
if(i!=-1){
updateByIndex(i);
}
else{
printf("\n您输入的姓名不存在!!!\n");
}
break;
default:
printf("\n您输入的选项无效!!!按任意键重新输入...\n");
fflush(stdin);
getch();
}
}while(1);
}
/*根据下标修改信息*/
void updateByIndex(int i)
{
printf("请输入修改后的性别:");
scanf("%s",stu[i].sex);
//gets(stu[i].sex);
printf("请输入修改后的课程1的成绩:");
scanf("%f",&stu[i].score1);
printf("请输入修改后的课程2的成绩:");
scanf("%f",&stu[i].score2);
printf("请输入修改后的课程3的成绩:");
scanf("%f",&stu[i].score3);
printf("请输入修改后的课程4的成绩:");
scanf("%f",&stu[i].score4);
printf("请输入修改后的课程5的成绩:");
scanf("%f",&stu[i].score5);
stu[i].sumScore = stu[i].score1 + stu[i].score2 + stu[i].score3 + stu[i].score4 + stu[i].score5 ;
stu[i].avgScore =stu[i].sumScore / 5;
}
/*查找界面*/
void search()
{
int op;
int no;
char name[10];
int i;
do{
system("cls");
printf("主界面>查找界面");
printf("\n\t\t***********************************************\n");
printf("\n\t\t\t 1.根据学号查找\n");
printf("\n\t\t\t 2.根据姓名查找\n");
printf("\n\t\t\t 0.返回主菜单 \n");
printf("\n\t\t***********************************************\n");
printf("\n\t请选择: ");
scanf("%d",&op);
if(op == 0)
{
break;
}
switch(op)
{
case 1:
printf("请输入要查找的学生信息的学号:");
scanf("%d",&no);
i=searchByNo(no);
printf("\n查询结果:\n");
printf("\n学号\t姓名\t性别\t课程1\t课程2\t课程3\t课程4\t课程5\t总分\t平均分\n");
printf("-------------------------------------------------------------------------------\n");
printf("%d\t%s\t%s\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\n",
stu[i].stuNo,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].score4,stu[i].score5,
stu[i].sumScore,stu[i].avgScore);
fflush(stdin);
getch();
break;
case 2:
printf("请输入姓名:");
scanf("%s",name);
//gets(name);
i=searchByName(name);
printf("\n查询结果:\n");
printf("\n学号\t姓名\t性别\t课程1\t课程2\t课程3\t课程4\t课程5\t总分\t平均分\n");
printf("-------------------------------------------------------------------------------\n");
printf("%d\t%s\t%s\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\n",
stu[i].stuNo,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].score4,stu[i].score5,
stu[i].sumScore,stu[i].avgScore);
fflush(stdin);
getch();
break;
default:
printf("\n您输入的选项无效!!!按任意键重新输入...\n");
fflush(stdin);
getch();
}
}while(1);
}
/*根据学号查找*/
int searchByNo(int stuNo)
{
int i;
for(i=0;i<count;i++)
{
if(stu[i].stuNo == stuNo)
return i;
}
return -1;
}
/*根据姓名查找*/
int searchByName(char stuName[])
{
int i;
for(i=0;i<count;i++)
{
if(strcmp(stu[i].name,stuName)==0)
return i;
}
return -1;
}
/*显示信息*/
void display()
{
system("cls");
int i;
printf("\n\t\t*** 显示学生 ***\n");
printf("\n学号\t姓名\t性别\t课程1\t课程2\t课程3\t课程4\t课程5\t总分\t平均分\n");
printf("===============================================================================\n");
for(i=0;i<count;i++)
{
printf("%d\t%s\t%s\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\n",
stu[i].stuNo,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].score4,stu[i].score5,
stu[i].sumScore,stu[i].avgScore);
}
printf("===============================================================================\n");
printf("\n\t\t按任意键返回主菜单...");
fflush(stdin);
getch();
}
/*排序界面*/
void sort()
{
int op;
do{
system("cls");
printf("主界面>排序界面");
printf("\n\t\t***********************************************\n");
printf("\n\t\t\t 1.按学号排序<升序> \n");
printf("\n\t\t\t 2.按总分排序<降序> \n");
printf("\n\t\t\t 0.返回主菜单 \n");
printf("\n\t\t***********************************************\n");
printf("\n\t请选择: ");
scanf("%d",&op);
if(op == 0)
{
break;
}
switch(op)
{
case 1:
sortByNo();
break;
case 2:
sortBySum();
break;
default:
printf("\n您输入的选项无效!!!按任意键重新输入...\n");
fflush(stdin);
getch();
}
}while(1);
}
/*按学号排序*/
void sortByNo()
{
sortBySum();
int i,j;
struct student temp;
for(i=0;i<count;i++)
{
for(j=0;j<count-1-i;j++)
{
if(stu[j].stuNo>stu[j+1].stuNo)
{
temp=stu[j+1];
stu[j+1]=stu[j];
stu[j]=temp;
}
}
}
}
/*按总分排序*/
void sortBySum()
{
int i,j;
struct student temp;
for(i=0;i<count;i++)
{
for(j=0;j<count-1-i;j++)
{
if(stu[j].sumScore<stu[j+1].sumScore)
{
temp=stu[j+1];
stu[j+1]=stu[j];
stu[j]=temp;
}
}
}
//排名
for(i=0;i<count;i++)
{
stu[i].ranking=i+1;
}
}
/*保存文件*/
void writeFile()
{
FILE *fp;
fp = fopen("stu.txt","wb");
int i;
for(i=0;i<count;i++)
{
printf("%d\t%s\t%s\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\n",
stu[i].stuNo,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].score4,stu[i].score5,
stu[i].sumScore,stu[i].avgScore);
fwrite(&stu[i],sizeof(struct student),1,fp);
}
fclose(fp);
printf("\n文件保存完毕,按任意键继续...\n");
printf("\n");
fflush(stdin);
getch();
}
/*读取文件*/
void readFile()
{
FILE *fp;
fp = fopen("stu.txt","rb");
if(fp==NULL)
{
printf("\nSorry,您要打开的文件不存在。按任意键继续...\n");
fflush(stdin);
getch();
}
else
{
fseek(fp,0,2);
count= ftell(fp)/sizeof (struct student);
rewind(fp);
int i;
for(i=0;i<count;i++)
{
fread(&stu[i],sizeof(struct student),1,fp);
printf("%d\t%s\t%s\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\n",
stu[i].stuNo,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].score4,stu[i].score5,
stu[i].sumScore,stu[i].avgScore);
}
fclose(fp);
printf("\n文件打开完成,按任意键返回...\n");
printf("\n");
fflush(stdin);
getch();
}
}
/*单门课程低于课程平均分的学生信息*/
void lowScoreAvg()
{
int i;
float avgCourseScore[5];
for(i=0;i<count;i++)
{
avgCourseScore[0]+=stu[i].score1;
avgCourseScore[1]+=stu[i].score2;
avgCourseScore[2]+=stu[i].score3;
avgCourseScore[3]+=stu[i].score4;
avgCourseScore[4]+=stu[i].score5;
}
//求出每门课的平均分
for(i=0;i<5;i++)
{
avgCourseScore[i]=avgCourseScore[i]/5;
}
printf("\n学号\t姓名\t性别\t课程1\t课程2\t课程3\t课程4\t课程5\t总分\t平均分\n");
for(i=0;i<count;i++)
{
if(stu[i].score1<avgCourseScore[0]||stu[i].score2<avgCourseScore[1]||stu[i].score3<avgCourseScore[2]||stu[i].score4<avgCourseScore[3]||stu[i].score5<avgCourseScore[4])
{
printf("%d\t%s\t%s\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\n",
stu[i].stuNo,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].score4,stu[i].score5,
stu[i].sumScore,stu[i].avgScore);
fflush(stdin);
getch();
}
}
}
/*每门课程成绩在90分以上的学生信息*/
void greaterThanNinty()
{
int i;
printf("\n学号\t姓名\t性别\t课程1\t课程2\t课程3\t课程4\t课程5\t总分\t平均分\n");
for(i=0;i<count;i++)
{
if(stu[i].score1>90&&stu[i].score2>90&&stu[i].score3>90&&stu[i].score4>90&&stu[i].score5>90)
{
printf("%d\t%s\t%s\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\n",
stu[i].stuNo,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].score4,stu[i].score5,
stu[i].sumScore,stu[i].avgScore);
fflush(stdin);
getch();
}
}
}
/*每门课程不及格的学生信息*/
void failed()
{
int i;
printf("\n学号\t姓名\t性别\t课程1\t课程2\t课程3\t课程4\t课程5\t总分\t平均分\n");
for(i=0;i<count;i++)
{
if(stu[i].score1<60&&stu[i].score2<60&&stu[i].score3<60&&stu[i].score4<60&&stu[i].score5<60)
{
printf("%d\t%s\t%s\t%5.2f\t
%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\n",
stu[i].stuNo,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].score4,stu[i].score5,
stu[i].sumScore,stu[i].avgScore);
fflush(stdin);
getch();
}
}
}