#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20
typedef struct stu
{
char num[10];
char name[10];
double score[3];
double sum;
double aver;
}STU;
void OutputFun(STU*a) //由for循环依次打印每个学生的记录
{
int i;
printf("********************\n列出所有学生记录\n********************\n学号\t姓名\t\t\t3门课成绩\t\t总分\t\t平均分\n");
for(i=0; i<N; i++)
{
if(a[i].sum==0||a[i].score[0]==0)
break;
printf("%s\t%-10s\t\t%.1lf %.1lf %.1lf\t\t%.1lf\t\t%.1lf\n", a[i].num, a[i].name, a[i].score[0], a[i].score[1], a[i].score[2], a[i].sum, a[i].aver);
}
return ;
}
void TotalMax(STU*a) //此函数利用平均分排序输出(总分最高即为平均分最高)
{
int i, j;STU m;
printf("****************************\n 选出总分最高的学生记录\n****************************\n学号\t姓名\t\t\t3门课成绩\t\t总分\t\t平均分\n");
for(i=0; i<N; i++)
{
for(j=i+1; j<N; j++)
{
if(a[i].aver<a[j].aver)
{
m=a[i];
a[i]=a[j];
a[j]=m;
}
}
}
printf("%s\t%-10s\t\t%.1lf %.1lf %.1lf\t\t%.1lf\t\t%.1lf\n", a[0].num, a[0].name, a[0].score[0], a[0].score[1], a[0].score[2], a[0].sum, a[0].aver);
return ;
}
void AverCompositor(STU*a) //利用for循环, 选择排序法 比较平均分替换下标
{
int i, j;STU m;
printf("请选择排序方式【a、升序排列 b、降序排列】:");
getchar();
if(getchar()=='a') //判断降序还是升序
{
printf("****************************\n 按平均分升序排序\n****************************\n学号\t姓名\t\t\t3门课成绩\t\t总分\t\t平均分\n");
for(i=0; i<N; i++)
{
for(j=i+1; j<N; j++)
{
if(a[i].aver>a[j].aver)
{
m=a[i];
a[i]=a[j];
a[j]=m;
}
}
}
for(i=0; i<N; i++)
{
if(a[i].sum!=0)
printf("%s\t%-10s\t\t%.1lf %.1lf %.1lf\t\t%.1lf\t\t%.1lf\n", a[i].num, a[i].name, a[i].score[0], a[i].score[1], a[i].score[2], a[i].sum, a[i].aver);
}
}
else
{
printf("****************************\n 按平均分降序排序\n****************************\n学号\t姓名\t\t\t3门课成绩\t\t总分\t\t平均分\n");
for(i=0; i<N; i++)
{
for(j=i+1; j<N; j++)
{
if(a[i].aver<a[j].aver)
{
m=a[i];
a[i]=a[j];
a[j]=m;
}
}
}
for(i=0; i<N; i++)
{
if(a[i].sum!=0)
printf("%s\t%-10s\t\t%.1lf %.1lf %.1lf\t\t%.1lf\t\t%.1lf\n", a[i].num, a[i].name, a[i].score[0], a[i].score[1], a[i].score[2], a[i].sum, a[i].aver);
}
}
return ;
}
void NameLookup(STU*a) //利用for循环对输入的进行依次与a[]比较
{
int i, x;
char n[10];
STU namecpy;
printf("\n请输入学生姓名:");
scanf("%s", n);
for(i=0; i<20; i++)
{
x=strcmp(a[i].name,n);
if(x==0)
{
namecpy=a[i];
break; //x=0即为二者相等, 比较完成后退出
}
}
if(i==N)
printf("没有该学生的记录");
else
{
printf("\n学号\t姓名\t\t\t3门课成绩\t\t总分\t\t平均分\n");
printf("%s\t%-10s\t\t%.1lf %.1lf %.1lf\t\t%.1lf\t\t%.1lf\n", namecpy.num, namecpy.name, namecpy.score[0], namecpy.score[1], namecpy.score[2], namecpy.sum, namecpy.aver);
}
return ;
}
void NumberLook(STU*a) //此子函数 换汤不换药
{
int i, x;
char n[10];
STU numcpy;
printf("\n请输入学生学号:");
scanf("%s", n);
for(i=0; i<N; i++)
{
x=strcmp(a[i].num,n);
if(x==0)
{
numcpy=a[i];
break;
}
}
if(i==N)
printf("没有该学生的记录");
else
{
printf("\n学号\t姓名\t\t\t3门课成绩\t\t总分\t\t平均分\n");
printf("%s\t%-10s\t\t%.1lf %.1lf %.1lf\t\t%.1lf\t\t%.1lf\n", numcpy.num, numcpy.name, numcpy.score[0], numcpy.score[1], numcpy.score[2], numcpy.sum, numcpy.aver);
}
return ;
}
void AddStudent(STU*a)
{
int i, x, new;
char n[10], y, z;
for(i=0; i<N; i++) // 由for循环找到下一个空白分数, 以此进行赋值
{
if(a[i].sum==0)
{
new=i;break;
}
}
printf("请输入新记录的学号:");
scanf("%s", n);
for(i=0; i<N; i++)
{
x=strcmp(a[i].num,n); //判定是否重复
if(x==0)
{
printf("输入新记录的学号错误,学号不能重复!\n");break;
}
}
if(x==0)
printf("");
else //依次进行赋值
{
strcpy(a[new].num, n);
printf("请输入新记录的姓名:");
scanf("%s", a[new].name);
printf("请输入新记录的3门课成绩(成绩之间用逗号隔开):");
scanf("%lf%c %lf%c %lf", &a[new].score[0], &y, &a[new].score[1], &z, &a[new].score[2]);
printf("已添加以下学生记录:\n");
printf("%s\t%s\t\t%.1lf %.1lf %.1lf\t\t%.1lf\t\t%.1lf\n", a[new].num, a[new].name, a[new].score[0], a[new].score[1], a[new].score[2], a[new].score[0]+a[new].score[1]+a[new].score[2], (a[new].score[0]+a[new].score[1]+a[new].score[2])/3);
}
return ;
}
void DeleteStudent(STU*a)
{
int i, x;
char n[10];
printf("请输入待删除记录的学号:");
scanf("%s", n);
for(i=0; i<N; i++) //由if语句判断是否由该学号
{
x=strcmp(a[i].num,n);
if(x==0)
break;
else
continue;
}
if(i==N)
printf("输入的学号错误,所有记录中没有这个学号 !");
else
{
printf("已删除以下学生记录\n%s\t%s\t\t%.1lf %.1lf %.1lf\t\t%.1lf\t\t%.1lf\n", a[i].num, a[i].name, a[i].score[0], a[i].score[1], a[i].score[2], a[i].sum, a[i].aver);
for(x=i; x<N; x++) //利用for循环覆盖掉要删除的记录
{
a[x]=a[x+1];
}
}
return ;
}
void ModifyStudent(STU*a)
{
int i, x, m;
char y, z, n[10];
printf("请输入待修改记录的学号:");
scanf("%s",n);
for(i=0; i<N; i++) //由if语句判断是否由该学号
{
x=strcmp(a[i].num,n);
if(x==0)
{
m=i;break;
}
else
continue;
}
if(i==N)
printf("输入的学号错误,所有记录中没有这个学号 !");
else //为该记录重新赋值(修改)
{
a[m].sum=n[10];
printf("请输入待修改的姓名:");
scanf("%s", a[m].name);
printf("请输入待修改的成绩(成绩之间用逗号隔开):");
scanf("%lf%c %lf%c %lf", &a[m].score[0], &y, &a[m].score[1], &z, &a[m].score[2]);
printf("已修改成功!");
}
return ;
}
int main()
{
int i, m, x;
STU a[N]={{"200901", "LiMing", {76, 78, 82}}, //初始化学生记录
{"200902", "WangRui",{80, 85, 89}},
{"200903", "ZhangQin",{65, 75, 80}},
{"200904", "ZhouYu" , {95, 92, 88}},
{"200905", "GuoHui", {70, 73, 74}},
{"200906", "ZengPin", {87, 90, 94}}};
char password[7]="123456", pass[7]; //定义密码
printf("请输入6位数的密码以进入学生成绩管理系统:\n");
gets(pass);
for(i=0; i<3; i++) //由for循环进入或退出系统
{
x=strcmp(password, pass);
if(x==0)
{
printf("密码输入成功!进入系统:\n\n");
printf("**********************\n 学生成绩管理系统\n**********************\n");
printf("1、列出所有学生记录\n2、选出总分最高的学生\n3、按平均分排列\n4、按姓名查找学生记录\n5、按学号查找学生记录\n6、添加学生记录 \n7、删除学生记录\n8、修改学生记录\n9、退出系统\n\n");
break;
}
else
{
printf("密码输入错误!还有%d次机会:\n", 2-i);
if(i==2)
{
printf("密码错误!退出程序");
break;
}
gets(pass);
}
}
for(i=0; i<N; i++) //由for循环依次计算出每个人的总分sum和平均分aver
{
a[i].sum=a[i].score[0]+a[i].score[1]+a[i].score[2];
a[i].aver=a[i].sum / 3;
}
if(x==0)
{
while(1)
{
printf("\n请输入选项序号:");
scanf("%d", &m);
switch(m) //利用switch进行子函数跳转
{
case 1: OutputFun(a); break; //跳转
case 2: TotalMax(a); break;
case 3: AverCompositor(a);break;
case 4: NameLookup(a); break;
case 5: NumberLook(a); break;
case 6: AddStudent(a); break;
case 7: DeleteStudent(a); break;
case 8: ModifyStudent(a); break;
case 9: printf("是否确定需要退出学生成绩管理系统(Y/N):");getchar();break; //获取退出系统的Y或N
default :printf("error");
}
for(i=0; i<N; i++) //由for循环依次计算出每个人的总分sum和平均分aver
{
a[i].sum=a[i].score[0]+a[i].score[1]+a[i].score[2];
a[i].aver=a[i].sum / 3;
}
if(getchar()=='Y')
break; //退出系统
}
}
return 0;
}
本代码定义学生个数为20个, 可在#define N 20 出修改学生个数!
第一次发文, 如有错误,多多包涵。