#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
/*定义学生结构体*/
struct Student
{
char ID[20]; //学号
char Name[20]; //姓名
int C_Mark; //C语言成绩
char gpa[10]; //C语言成绩等级
};
/*声明学生数组及学生数量*/
struct Student students[1000];
int num=0;
/*通过学号返回数组下标*/
int Student_SearchByIndex(char id[])
{
int i;
for (i=0;i<num;i++)
{
if (strcmp(students[i].ID,id)==0)
{
return i;
}
}
return -1;
}
/*通过姓名返回数组下标*/
int Student_SearchByName(char name[])
{
int i;
for (i=0;i<num;i++)
{
if (strcmp(students[i].Name,name)==0)
{
return i;
}
}
return -1;
}
/*显示单条学生信息*/
void Student_DisplaySingle(int index)
{
printf("%10s%10s%15s%12s\n","学号","姓名","C语言成绩","成绩等级");
printf("-------------------------------------------------------------\n");
printf("%10s%10s%10d%12s\n",students[index].ID,students[index].Name,students[index].C_Mark,students[index].gpa);
printf("-------------------------------------------------------------\n");
}
//C语言成绩等级判定//
void Student_Gpa(int score,int n)
{
if(score>=93){
strcpy(students[n].gpa,"A+");
}else if(score>=85&&score<=92){
strcpy(students[n].gpa,"A");
}else if(score>=80&&score<=84){
strcpy(students[n].gpa,"B+");
}else if(score>=75&&score<=79){
strcpy(students[n].gpa,"B");
}else if(score>=70&&score<=74){ //使用多个if,else if语句判断学生C语言成绩等级
strcpy(students[n].gpa,"C+");
}else if(score>=65&&score<=69){
strcpy(students[n].gpa,"C");
}else if(score>=60&&score<=64){
strcpy(students[n].gpa,"D");
}else if(score<60){
strcpy(students[n].gpa,"F");
}
}
/****1、增加学生信息*****/
void Student_add()
{ int grade;
while(1)
{
printf("请输入学号:");
scanf("%s",&students[num].ID);
getchar();
printf("请输入姓名:");
scanf("%s",&students[num].Name); //循环输入学生信息,可输入一次或多次学生信息
getchar();
printf("请输入C语言成绩:");
scanf("%d",&students[num].C_Mark);
getchar();
grade=students[num].C_Mark;
Student_Gpa(grade,num);
num++;
printf("是否继续?(Y/N),继续请按任意键,否则输入0:");
if (getchar()=='0')
{
break;
}
}
}
/******2、修改学生信息**********/
void Student_Modify()
{
while(1)
{
char id[20];
int index,grade;
printf("请输入要修改的学生的学号:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if (index==-1)
{
printf("该学生不存在!\n");
}
else
{
printf("你要修改的学生信息为:\n");
Student_DisplaySingle(index);
printf("-- 请输入新值--\n");
printf("请输入学号:");
scanf("%s",&students[index].ID);
getchar();
printf("请输入姓名:");
scanf("%s",&students[index].Name);
getchar();
printf("请输入C语言成绩:");
scanf("%d",&students[index].C_Mark);
grade=students[index].C_Mark;
Student_Gpa(grade,index);
getchar();
}
printf("是否继续?(Y/N),继续请按任意键,否则输入0:");
if (getchar()=='0')
{
break;
}
}
}
/****3、删除学生信息****/
void Student_Delete()
{
int i;
while(1)
{
char id[20];
int index;
printf("请输入要删除的学生的学号:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if (index==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要删除的学生信息为:\n");
Student_DisplaySingle(index);
printf("是否真的要删除?(1/0)");
if (getchar()=='1')
{
for (i=index;i<num-1;i++)
{
students[i]=students[i+1];//把后边的对象都向前移动
}
num--;
}
getchar();
printf("已删除\n");
}
printf("是否继续删除?(Y/N),继续请按任意键,否则输入0:");
if (getchar()=='0')
{
break;
}
}
}
/****4、按学号查询******/
void Student_Select()
{
while(1)
{
char id[20];
int index;
printf("请输入要查询的学生的学号:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if (index==-1)
{
printf("学生不存在!\n");
}
else
{
printf("你要查询的学生信息为:\n");
Student_DisplaySingle(index);
}
printf("是否继续?(Y/N),继续请按任意键,否则输入0:");
if (getchar()=='0')
{
break;
}
}
}
/******5、按C语言成绩排序*******/
void Student_SortByscore()
{
int i,j;
struct Student tmp;
for (i=0;i<num;i++)
{
for (j=1;j<num-i;j++)
{
if (students[j-1].C_Mark<students[j].C_Mark) //冒泡排序法,排列C语言成绩
{
tmp=students[j-1];
students[j-1]=students[j];
students[j]=tmp;
}
}
}
}
/******6、按学生学号排序*******/
void Student_SortByid()
{
int i,j;
struct Student tmp;
for (i=0;i<num;i++)
{
for (j=1;j<num-i;j++)
{
if (strcmp(students[j-1].ID,students[j].ID)>0) //冒泡排序法,排列学生学号
{
tmp=students[j-1];
students[j-1]=students[j];
students[j]=tmp;
}
}
}
}
/******7、输出最高分学生信息****/
void Student_bestscore()
{
int i;
int index=0;
for(i=0;i<num;i++)
{
if(students[index].C_Mark<students[i].C_Mark)
{
index=i;
}
}
printf("你要查询的学生信息为:\n");
Student_DisplaySingle(index);
}
/******8、输出最低分学生信息****/
void Student_worstscore()
{
int i;
int index=0;
for(i=0;i<num;i++)
{
if(students[index].C_Mark>students[i].C_Mark)
{
index=i;
}
}
printf("你要查询的学生信息为:\n");
Student_DisplaySingle(index);
}
/******9、输出所有学生期末成绩平均分****/
void Student_scoreaverage()
{
int i=0;
double average=0;
int scoresum=0;
for(i=0;i<num;i++)
{
scoresum+=students[i].C_Mark;
}
average=scoresum/num;
printf("所有学生期末成绩平均分:%.2f\n",average);
}
/******10、返回某个学生的成绩是否为素数****/
void Student_prime()
{
char id[20];
int index,score,i=2,flag=0;
printf("请输入要查询的学生的学号:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if (index==-1)
{
printf("学生不存在!\n");
}
else
{
score=students[index].C_Mark;
while(i<=sqrt(score)){ //开根号法缩小循环次数,判断成绩是否为素数
if(score%i==0){
flag=1;
break;}
else i++;
}
if(flag==0){
printf("-------------------------------------------------------------\n");
printf("该学生的成绩%d是素数\n",score);
printf("-------------------------------------------------------------\n");
}else{
printf("-------------------------------------------------------------\n");
printf("该学生的成绩%d不是素数\n",score);
printf("-------------------------------------------------------------\n");
}
}
}
/****11、判断某两个学生的成绩是否互质****/
void Student_coprime()
{
char id[20];
char num[20];
int index,score1,score2,grade1,grade2;
printf("请输入要查询的学生的学号:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
score1=students[index].C_Mark;
grade1=score1;
printf("请输入要查询的学生的学号:");
scanf("%s",&num);
getchar();
index=Student_SearchByIndex(num);
score2=students[index].C_Mark;
grade2=score2;
int temp; //运用辗转相除法判断两个学生的成绩是否互质
while(temp=score1%score2){
score1=score2;
score2=temp;
}
temp=score2;
if(temp==1){
printf("-------------------------------------------------------------\n");
printf("这两个学生的成绩%d,%d是互质的\n",grade1,grade2);
printf("-------------------------------------------------------------\n");
}else{
printf("-------------------------------------------------------------\n");
printf("这两个学生的成绩%d,%d不是互质的\n",grade1,grade2);
printf("-------------------------------------------------------------\n");
}
}
/*显示学生信息*/
void Student_Display()
{
int i;
printf("%10s%10s%15s%12s\n","学号","姓名","C语言成绩","成绩等级");
printf("-------------------------------------------------------------\n");
for (i=0;i<num;i++)
{
printf("%10s%10s%10d%12s\n",students[i].ID,students[i].Name,students[i].C_Mark,students[i].gpa);
printf("-------------------------------------------------------------\n");
}
}
/*将学生信息从文件(Database.txt)中读出*/
void IO_ReadInfo()
{
FILE *fp;
int i;
if ((fp=fopen("Database.txt","rb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
if (fread(&num,sizeof(int),1,fp)!=1)
{
num=-1;
}
else
{
for(i=0;i<num;i++)
{
fread(&students[i],sizeof(struct Student),1,fp);
}
}
fclose(fp);
}
/*将学生信息写入文件(Database.txt)*/
void IO_WriteInfo()
{
FILE *fp;
int i;
if ((fp=fopen("Database.txt","wb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
if (fwrite(&num,sizeof(int),1,fp)!=1)
{
printf("写入文件错误!\n");
}
for (i=0;i<num;i++)
{
if (fwrite(&students[i],sizeof(struct Student),1,fp)!=1)
{
printf("写入文件错误!\n");
}
}
fclose(fp);
}
/***********主程序*********/
int main()
{
int choice;
IO_ReadInfo(); //读取文件
while(1)
{
/*主菜单*/
printf("\n------ 学生成绩管理系统------\n");
printf(" 1. 增加学生信息\n");
printf(" 2. 修改学生信息\n");
printf(" 3. 删除学生信息\n");
printf(" 4. 按学号查询学生信息\n");
printf(" 5. 按C语言成绩排序\n");
printf(" 6. 按学号顺序排序\n");
printf(" 7. 输出最高分学生信息\n");
printf(" 8. 输出最低分学生信息\n");
printf(" 9. 输出所有学生期末成绩平均分\n");
printf(" 10.查询某个学生的成绩是否为素数\n");
printf(" 11.判断两个学生的成绩是不是互质的\n");
printf(" 0. 退出\n");
printf("请键入(1-11)选择功能键:");
scanf("%d",&choice);
getchar();
switch(choice)
{
case 1:
Student_add();
break;
case 2:
Student_Modify();
break;
case 3:
Student_Delete();
break;
case 4:
Student_Select();
break;
case 5:
Student_SortByscore();
Student_Display();
break;
case 6:
Student_SortByid();
Student_Display();
break;
case 7:
Student_bestscore();
break;
case 8:
Student_worstscore();
break;
case 9:
Student_scoreaverage();
break;
case 10:
Student_prime();
break;
case 11:
Student_coprime();
break;
case 0:
exit(0);
break;
}
IO_WriteInfo();
}
}