#include <stdio.h>
#include <string.h>
#define N 3 //科目数
#define MAX 50 //总人数
typedef struct
{
char num[5];
char name[20];
float score[N];
float ave;
}S;
void construct(S *p,int *count); //此函数用于把学院编号,姓名,成绩,平均成绩初始化
void record(S *pr,int *pc); //此函数用于录入学生姓名,成绩,并计算平均成绩
void gradesort(S stu[],int *c); //此函数用于按成绩高低顺序查看成绩
void namesort(S stu[],int *c); //此函数用于按姓名顺序查看成绩
void numbersort(S stu[],int *c); //此函数用于按学号顺序查看成绩
void about(); //此函数输出版本,作者,版权,制作时间等信息
void insert(S *pi,int *pc); //此函数用于插入学员记录
void rework(S *pre,int *pc); //此函数用于修改学员信息
void del(S stu[],int *pc); //此函数用于删除学员记录
void find(S stu[],int *c); //此函数用于查找学员
void welcomeAdministrator(S stu[],int *c); //此函数是管理员登陆界面
void welcomeUser(S stu[],int *c); //此函数是普通用户登陆界面
void login(); //此函数用于选择登陆信息
/****关于函数************************************************************************************/
void about()
{
printf("\n******************************************************************************\n");
printf("\n 关于学员成绩管理系统");
printf("\n 版本 1.3 ");
printf("\n 作者 ***");
printf("\n Copyright(C)2006 **** All Rights Reserved.");
printf("\n 2006-8-26, 16:53:29");
printf("\n******************************************************************************\n");
}
/****查找函数**********************************************************************************/
void find(S stu[],int *c)
{
int i,flag=0;
char choose;
char n[5];
char search[20];
float a;
printf("\n 请选择一种查找方式");
fflush(stdin);
printf("\n 1: 按学号查找\n 2: 按姓名查找\n 3: 按成绩查找\n 选择:");
choose=getchar();
switch(choose)
{
case '1':
printf("\n 请输入要查找的学号: ");
fflush(stdin);
gets(n);
printf("学号\t 姓名\t\t\t平均成绩\n\n");
for(i=0;i<*c;i++)
{
if(strcmp(n,stu[i].num)==0)
{
flag=1;
printf("\n %s 号学员的信息\n",n);
printf("%-10s %-20s %-5.1f\n",stu[i].num,stu[i].name,stu[i].ave);
}
}
if(flag==0)
{
printf("\n\t没有找到此学号!\n");
}
break;
case '2':
printf("\n 请输入要查找的姓名: ");
fflush(stdin);
gets(search);
printf("学号\t 姓名\t\t\t平均成绩\n\n");
for(i=0;i<*c;i++)
{
if(strcmp(search,stu[i].name)==0)
{
flag=1;
printf("\n 学员 %s 的信息\n",search);
printf("%-10s %-20s %-5.1f\n",stu[i].num,stu[i].name,stu[i].ave);
}
}
if(flag==0)
{
printf("\n\t没有找到此姓名!\n");
}
break;
case '3':
printf("\n 请输入要查找的成绩: ");
scanf("%f",&a);
printf("学号\t 姓名\t\t\t平均成绩\n\n");
for(i=0;i<*c;i++)
{
if((int)stu[i].ave==(int)a)
{
flag=1;
printf("\n 成绩为 %d 的学员信息\n",(int)a);
printf("%-10s %-20s %-5.1f\n",stu[i].num,stu[i].name,stu[i].ave);
}
}
if(flag==0)
{
printf("\n\t没有找到!\n");
}
break;
default:
printf("\n输入错误,无法查找!\n");
}
}
/****成绩排序函数********************************************************************************/
void gradesort(S stu[],int *c)
{
int i,j;
S temp; //定义临时结构,用于交换结构数组
for(i=0;i<*c-1;i++)
{
for(j=0;j<*c-i-1;j++)
{
if(stu[j].ave<stu[j+1].ave) //判断条件(前一个的成绩低于后一个)
{
temp=stu[j]; //把前一个结构赋给临时结构
stu[j]=stu[j+1]; //把后一个结构赋给前一个结构
stu[j+1]=temp; //把临时结构赋给后一个结构
}
}
}
printf("\n\t按成绩高低排列\n\n");
printf("学号\t 姓名\t\t\t平均成绩\n\n");
for(i=0;i<*c;i++) //循环体输出(输出次数由总人数控制)
{
printf("%-10s %-20s %-5.1f\n",stu[i].num,stu[i].name,stu[i].ave);
}
}
/****姓名排序函数********************************************************************************/
void namesort(S stu[],int *c)
{
int i,j;
S temp; //定义临时结构,用于交换结构数组
for(i=0;i<*c-1;i++)
{
for(j=0;j<*c-i-1;j++)
{
if(strcmp(stu[j].name,stu[j+1].name)>0) //判断条件(前一个姓名大于后一个)
{
temp=stu[j]; //把前一个结构赋给临时结构
stu[j]=stu[j+1]; //把后一个结构赋给前一个结构
stu[j+1]=temp; //把临时结构赋给后一个结构
}
}
}
printf("\n\t按姓名顺序排列\n\n");
printf("学号\t 姓名\t\t\t平均成绩\n\n");
for(i=0;i<*c;i++) //循环体输出(输出次数由总人数控制)
{
printf("%-10s %-20s %-5.1f\n",stu[i].num,stu[i].name,stu[i].ave);
}
}
/****学号排序函数********************************************************************************/
void numbersort(S stu[],int *c)
{
int i,j;
S temp; //定义临时结构,用于交换结构数组
for(i=0;i<*c-1;i++)
{
for(j=0;j<*c-i-1;j++)
{
if(strcmp(stu[j].num,stu[j+1].num)>0) //判断条件(前一个的编号大于后一个)
{
temp=stu[j]; //把前一个结构赋给临时结构
stu[j]=stu[j+1]; //把后一个结构赋给前一个结构
stu[j+1]=temp; //把临时结构赋给后一个结构
}
}
}
printf("\n\t按学号顺序排列\n\n");
printf("学号\t 姓名\t\t\t平均成绩\n\n");
for(i=0;i<*c;i++) //循环体输出(输出次数由总人数控制)
{
printf("%-10s %-20s %-5.1f\n",stu[i].num,stu[i].name,stu[i].ave);
}
}
/****显示函数***********************************************************************************/
void display(S stu[],int *c)
{
char choose;
printf("\n\t请选择一种排序方法\n");
printf("\n 1: 按学号顺序排序");
printf("\n 2: 按姓名顺序排序");
printf("\n 3: 按成绩高低排序");
printf("\n 请输入选择(1-3): ");
fflush(stdin);
choose=getchar();
switch(choose)
{
case '1':numbersort(stu,c);break; //调用编号排序函数
case '2':namesort(stu,c);break; //调用姓名排序函数
case '3':gradesort(stu,c);break; //调用成绩排序函数
default:
printf("\n选择错误!\n");
}
}
/****删除函数************************************************************************************/
void del(S stu[],int *pc)
{
int i; //定义循环控制器
char n[5];
char ans; //定义字符型选择变量
if(!(*pc)) //判断总人数是否为0
{
printf("\n当前档案为空,不能删除!");
}
else
{
printf("\n请输入要删除的学员的学号: ");
fflush(stdin);
gets(n); //接收删除编号
for(i=0;i<*pc;i++)
{
if(strcmp(stu[i].num,n)==0)
{
break;
}
}
if(i==*pc)
{
printf("\n找不到这个学员!\n");
}
else
{
printf("\n是否要删除%s号学员的信息(Y/N):",stu[i].num);
fflush(stdin);
ans=getchar();
if(ans=='Y'||ans=='y')
{
for(;i<*pc-1;i++)
{
stu[i]=stu[i+1];
}
(*pc)--; //总人数减少
printf("\n删除操作完成!\n");
}
}
}
}
/****修改函数***********************************************************************************/
void rework(S *pre,int *pc)
{
int i,j,flag=0;
char temp[5],ch;
float sum;
fflush(stdin);
printf("\n 请输入要修改的学员的学号: ");
gets(temp);
for(i=0;i<*pc;i++)
{
if(strcmp((pre+i)->num,temp)==0) //查找对应的学号
{
break;
}
}
if(i==*pc)
{
printf("\n找不到此学号!\n");
}
else
{
printf("\n 请选择要修改的部分\n");
printf("\n 1: 学号");
printf("\n 2: 姓名");
printf("\n 3: 成绩");
printf("\n请选择: ");
fflush(stdin);
ch=getchar();
switch(ch)
{
case '1':
printf("\n请输入要修改的学号: ");
fflush(stdin);
gets((pre+i)->num);
break;
case '2':
printf("\n请输入要修改的姓名: ");
fflush(stdin);
gets((pre+i)->name);
break;
case '3':
for(j=0,sum=0;j<N;j++)
{
printf("\n修改的成绩 %d: ",j+1);
scanf("%f",&(pre+i)->score[j]);
sum+=(pre+i)->score[j];
}
(pre+i)->ave=sum/N;
break;
default:
printf("\n没有此项操作!\n");
flag=1;
}
if(flag==0)
{
printf("\n 修改成功!该学员修改后的信息如下\n");
printf("学号\t 姓名\t\t\t平均成绩\n\n");
printf("%-10s %-20s %-5.1f\n",(pre+i)->num,(pre+i)->name,(pre+i)->ave);
}
}
}
/****插入函数**********************************************************************************/
void insert(S *pi,int *pc)
{
int i,j,flag;
float sum;
char ans='y';
printf("请输入学员信息.\n");
i=*pc; //计数器从已记录的总人数开始
if(i==MAX) //判断总人数是否已满
{
printf("档案已满,无法继续输入!");
}
else
{
while(ans=='Y'||ans=='y') //循环条件(用户选择继续)
{
printf("---请输入第%d个学员的信息---\n",i+1);
do
{
flag=0;
fflush(stdin);
printf("\n编号:"); //接收编号
gets((pi+i)->num);
for(j=0;j<i;j++)
{
if(strcmp((pi+j)->num,(pi+i)->num)==0)
{
printf("\n学号已存在,请重新输入!\n");
flag=1;
break;
}
}
}while(flag==1);
fflush(stdin);
printf("\n姓名: ");
gets((pi+i)->name); //录入姓名
printf("\n科目成绩:\n");
for(j=0,sum=0;j<N;j++) //循环接收三门成绩
{
printf("成绩%d: ",j+1);
scanf("%f",&(pi+i)->score[j]);
sum+=(pi+i)->score[j]; //录入并统计总成绩
}
(pi+i)->ave=sum/N; //计算平均成绩
i++; //计数器递增
(*pc)++; //总人数统计器递增;
if(*pc==MAX)
{
printf("档案录入完毕,请选择其他操作.\n");
break;
}
fflush(stdin); //清空缓存
printf("\n 录入成功,是否继续录入(Y/N): "); //重复录入提示
ans=getchar(); //接收用户选择
}
}
}
/****录入函数************************************************************************************/
void record(S *pr,int *pc)
{
int i,j,flag; //循环计数器
float sum; //总成绩统计变量
char ans='y',answer; //定义字符型提示变量
printf("\n是否清空档案并重新录入学员成绩(Y/N): "); //输出提示
fflush(stdin);
answer=getchar();
if(answer=='Y'||answer=='y')
{
construct(pr,pc); //调用初始化函数
printf("录入学员信息.\n");
i=0;
while(ans=='Y'||ans=='y')
{
printf("---请输入第%d个学员的信息---\n",*pc+1);
do
{
flag=0;
fflush(stdin);
printf("\n编号:"); //接收编号
gets((pr+i)->num);
for(j=0;j<i;j++)
{
if(strcmp((pr+j)->num,(pr+i)->num)==0)
{
printf("\n学号已存在,请重新输入!\n");
flag=1;
break;
}
}
}while(flag==1);
fflush(stdin);
printf("\n姓名: ");
gets((pr+i)->name); //录入姓名
printf("\n科目成绩:\n");
for(j=0,sum=0;j<N;j++) //循环接收三门成绩
{
printf("成绩%d: ",j+1);
scanf("%f",&(pr+i)->score[j]);
sum+=(pr+i)->score[j]; //录入并统计总成绩
}
(pr+i)->ave=(float)sum/N; //计算平均成绩
(*pc)++; //总人数统计器递增;
if(*pc==MAX)
{
printf("档案录入完毕,请选择其他操作.\n");
break;
}
i++; //指针指向结构体数组的下一个位置
fflush(stdin); //清空缓存
printf("\n 录入成功,是否继续录入(Y/N): "); //重复录入提示
ans=getchar(); //接收用户选择
}
}
}
/****初始化结构体函数****************************************************************************/
void construct(S *p,int *count)
{
int i,j; //循环计数器
*count=0; //初始化总人数
for(i=0;i<MAX;i++)
{
for(j=0;j<5;j++) //初始化编号
{
p->num[j]='\0';
}
for(j=0;j<20;j++)
{
p->name[j]='\0'; //初始化姓名
}
for(j=0;j<N;j++)
{
p->score[j]=0; //初始化每课成绩
}
p->ave=0; //初始化平均分
p++; //指针指向下一个数组结构
}
}
/****普通用户界面函数*************************************************************************/
void welcomeUser(S stu[],int *c)
{
int flag=0; //定义总人数变量,定义检查标记
char operationClass; //定义操作选择变量
printf("\n\t\t学员成绩管理系统\n\n");
printf("\n=========================================\n");
construct(stu,c); //调用初始化结构体函数对数组进行初始化
//display(stu,MAX); //查看初始化效果
printf("\n\t本系统基本操作如下\n");
do
{ //提示信息
printf("\n--------------------------------------\n");
printf("\n 1: 插入新学员信息");
printf("\n 2: 查看学员信息");
printf("\n 3: 查找学员");
printf("\n 4: 关于本系统");
printf("\n 5: 退出");
printf("\n 档案容量(%d\\%d)\n",*c,MAX);
printf("\n请选择您要进行的操作(1-5): "); //操作选择
fflush(stdin);
operationClass=getchar();
printf("\n--------------------------------------\n");
switch(operationClass)
{
case '1': insert(stu,c);continue; //调用插入函数
case '2': display(stu,c);continue; //调用显示函数
case '3': find(stu,c);continue; //调用查找函数
case '4': about();continue; //调用关于函数
case '5': //退出选择
{ printf("\n\t感谢使用本系统,再见!\n"); //输出退出提示
flag=1; //使标记值为真并跳出switch
break;
}
default:printf("\n输入错误!请重新输入\n"); //提示选择错误的信息
continue;
}
if(flag=1) //检查标记为真时停止循环
{
break;
}
}while(1);
}
/****管理员界面函数****************************************************************************/
void welcomeAdministrator(S stu[],int *c)
{
int flag=0; //定义检查标记
char operationClass; //定义操作选择变量
printf("\n\t\t学员成绩管理系统\n\n");
printf("\n=========================================\n");
construct(stu,c); //调用初始化结构体函数对数组进行初始化
//display(stu,MAX); //查看初始化效果
printf("\n\t本系统基本操作如下\n");
do
{ //提示信息
printf("\n--------------------------------------\n");
printf("\n 1: 重新录入学员信息");
printf("\n 2: 插入新学员信息");
printf("\n 3: 修改学员信息");
printf("\n 4: 删除学员信息");
printf("\n 5: 查看学员信息");
printf("\n 6: 查找学员");
printf("\n 7: 关于本系统");
printf("\n 8: 退出");
printf("\n 档案容量(%d\\%d)\n",*c,MAX);
printf("\n请选择您要进行的操作(1-8): "); //操作选择
fflush(stdin);
operationClass=getchar();
printf("\n--------------------------------------\n");
switch(operationClass)
{
case '1': record(stu,c);continue; //调用记录函数
case '2': insert(stu,c);continue; //调用插入函数
case '3': rework(stu,c);continue; //调用修改函数
case '4': del(stu,c);continue; //调用删除函数
case '5': display(stu,c);continue; //调用显示函数
case '6': find(stu,c);continue; //调用查找函数
case '7': about();continue; //调用关于函数
case '8': //退出选择
{ printf("\n\t感谢使用本系统,再见!\n"); //输出退出提示
flag=1; //使标记值为真并跳出switch
break;
}
default:printf("\n输入错误!请重新输入\n"); //提示选择错误的信息
continue;
}
if(flag=1) //检查标记为真时停止循环
{
break;
}
}while(1);
}
/****登陆函数*******************************************************************************/
void login()
{
S stu[MAX];
int count;
char username[20],password[15]; //定义用户名字符串,密码字符串
int flag; //控制循环标记
printf("\n\t\t欢迎使用学员成绩管理系统\n"); //欢迎提示
do
{
flag=0; //初始化标记
printf("\n\t请输入用户名: ");
fflush(stdin);
gets(username); //接收用户名
if(strcmp(username,"t09")==0) //检查用户名是否为管理员
{
printf("\n\t请输入密码: ");
gets(password); //接收密码
if(strcmp(password,"T09")==0) //检查密码
{
printf("\n\t您好,您登陆的类型为 管理员\n");
welcomeAdministrator(stu,&count); //调用管理员界面函数
}
else
{
printf("\n\t密码错误!\n"); //提示密码错误
flag=1; //标记为真
}
}
else
{
printf("\n\t您好,您登陆的类型为 普通用户\n");
welcomeUser(stu,&count); //调用普通用户界面函数
}
}while(flag==1);
}
/****主函数(所有函数的执行函数,程序入口)*****************************************************/
void main()
{
login(); //调用欢迎界面函数
}
参考资料:...