忙了一天,做出来个简单的成绩管理系统,代码如下:
//学生成绩管理程序 2012年3月17日08:25:05至2012年3月18日12:54:49
//此系统密码为"aa"
//此系统供学校成绩管理中心使用,不是学生自己使用,所以查每个学生信息时,会显示出密码
//学号不能相同 姓名 不能带空格
//头文件====================================
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
//声明部分===================================
void print1(); //输出信息
void print2(); //输出信息
void display();//输出所有学生信息
void del(); //删除学生信息
void modify(); //修改学生信息
void save(); //保存信息
void zhumulu(); //主目录
void write(); //录入学生信息
void sort(); //对学生信息进行排序
void find(); //查找学生信息
void read();//初始化读取学生信息
int scount; //学生的数目 全局变量
//结构体数组
struct STU
{
char num[10]; //学号
char password[10];//密码
char name[15]; //姓名
double grade[3];//成绩 语文 数学 英语
double ave;//平均成绩
}stu[10000];
//按学号
int cmp11(const void *a,const void *b) //快排
{
return strcmp((*(struct STU *)a).num,(*(struct STU *)b).num); //升序
}
int cmp12(const void *a,const void *b) //快排
{
return strcmp((*(struct STU *)b).num,(*(struct STU *)a).num); //降序
}
//按姓名
int cmp21(const void *a,const void *b) //快排
{
return strcmp((*(struct STU *)a).name,(*(struct STU *)b).name); //升序
}
int cmp22(const void *a,const void *b) //快排
{
return strcmp((*(struct STU *)b).name,(*(struct STU *)a).name); //降序
}
//按语文成绩
int cmp31(const void *a,const void *b) //快排
{
return (*(struct STU *)a).grade[0]>(*(struct STU *)b).grade[0]?1:-1; //升序
}
int cmp32(const void *a,const void *b) //快排
{
return (*(struct STU *)a).grade[0]>(*(struct STU *)b).grade[0]?-1:1; //降序
}
//按数学成绩
int cmp41(const void *a,const void *b) //快排
{
return (*(struct STU *)a).grade[1]>(*(struct STU *)b).grade[1]?1:-1; //升序
}
int cmp42(const void *a,const void *b) //快排
{
return (*(struct STU *)a).grade[1]>(*(struct STU *)b).grade[1]?-1:1; //降序
}
//按英语成绩
int cmp51(const void *a,const void *b) //快排
{
return (*(struct STU *)a).grade[2]>(*(struct STU *)b).grade[2]?1:-1; //升序
}
int cmp52(const void *a,const void *b) //快排
{
return (*(struct STU *)a).grade[2]>(*(struct STU *)b).grade[2]?-1:1; //降序
}
//按平均成绩
int cmp61(const void *a,const void *b) //快排
{
return (*(struct STU *)a).ave>(*(struct STU *)b).ave?1:-1; //升序
}
int cmp62(const void *a,const void *b) //快排
{
return (*(struct STU *)a).ave>(*(struct STU *)b).ave?-1:1; //降序
}
//主函数=================================================================================
int main()
{
char s[15];
int i=0,j;
printf("若要使用本系统,请先输入系统密码(字母分大小写)!\n\n");
while(i!=3)
{
printf("请在此处输入密码 : ");
for(j=0;;j++) //设置输入密码的时候显示为 '*'
{
s[j]=getch();
if(s[j]!='\r') //'\r'为回车的转义字符
putchar('*');
if(s[j]=='\r')
{
break;
}
}
s[j]='\0';
printf("\n");
if(strcmp(s,"aa")==0)
{
printf("\n\n\t\t\t 恭喜你,密码正确!\n\n");
printf("\t\t========================================\n");
printf("\t\t=======欢迎进入学生成绩管理程序=========\n");
printf("\t\t========================================\n");
printf("\n\t\t\t正在初始化学生信息...\n\n");
read();
printf("\t\t\t原文件中共有%d条学生信息:\n",scount);
printf("\n\n\t\t\t请按任意键进入管理目录...\n");
getch();
system("cls");
zhumulu();
break;
}
else
{
system("cls");
printf("密码不正确,请重新输入:\n");
i++;
}
if(i==3)printf("\n您已输入错误超过3次,不能再输入!\n\n");
}
return 0;
}
void print1()
{
printf("学生的信息为:\n学号 密码 姓名 语文 数学 英语 平均分\n");
printf("=============================================================================\n");
}
void print2()
{
printf("=============学生成绩管理系统=================\n");
printf("1)录入学生成绩;\n2)显示整个系统所有学生的成绩;\n3)查询学生成绩;\n4)修改学生成绩;\n5)对学生成绩进行排序;\n6)删除学生成绩;\n0)退出学生成绩管理系统\n");
printf("请按提示输入:\n");
}
void zhumulu()
{
int j=1;
char i;
print2();
printf("\n请选择功能前的数字0-6\n");
scanf("%c",&i);
while(j==1)
{
switch(i)
{
case '1':write();j=0;break;
case '2':display();j=0;break;
case '3':find();j=0;break;
case '4':modify();j=0;break;
case '5':sort();j=0;break;
case '6':del();j=0;break;
case '0':printf("\t\t\t****欢迎使用本系统****\n\n\n");j=0;break;
default:{ system("cls");
print2();
printf("\n请选择功能前的数字0-6\n");
j=1;
break;
}
}
if(j==1)scanf("%c",&i);
}
}
void read()
{
FILE *fp;
if((fp=fopen("stu.txt","r"))==NULL)
{
printf("\t\t\t文件打开错误!\n\n\n");
return; // 此处不能用exit(0) 不信试试看 在不建立stu.txt的前提下
}
scount=0;
while(!feof(fp))
{
fscanf(fp,"%s%s%s%lf%lf%lf%lf\n",stu[scount].num,stu[scount].password,stu[scount].name,&stu[scount].grade[0],&stu[scount].grade[1],&stu[scount].grade[2],&stu[scount].ave);
if(strcmp(stu[scount].num,"")!=0)scount++; //去掉 学号为空的情况
}
fclose(fp);
}
void write()
{
int n,i;
system("cls");
printf("请输入要录入学生的人数:\n");
scanf("%d",&n);
print1();
for(i=scount;i<scount+n;i++)
{
scanf("%s%s%s%lf%lf%lf",stu[i].num,stu[i].password,stu[i].name,&stu[i].grade[0],&stu[i].grade[1],&stu[i].grade[2]);
stu[i].ave=(stu[i].grade[0]+stu[i].grade[1]+stu[i].grade[2])/3;
}
scount+=n;
save();
printf("录入完毕,请按任意键进入管理目录...\n");
getch();
system("cls");
zhumulu();
}
void save()
{
int i;
FILE *fp;
if((fp=fopen("stu.txt","w"))==NULL)
{
printf("文件打开错误:\n");
exit(0);
}
for(i=0;i<scount;i++)
fprintf(fp,"%-10s%-10s%-15s%-10.1lf%-10.1lf%-10.1lf%-10.1lf\n",stu[i].num,stu[i].password,stu[i].name,stu[i].grade[0],stu[i].grade[1],stu[i].grade[2],stu[i].ave);
fclose(fp);
}
void display() //查看系统总体学生信息
{
int i;
system("cls");
print1();
for(i=0;i<scount;i++)
printf("%-10s%-10s%-15s%-10.1lf%-10.1lf%-10.1lf%-10.1lf\n",stu[i].num,stu[i].password,stu[i].name,stu[i].grade[0],stu[i].grade[1],stu[i].grade[2],stu[i].ave);
printf("请按任意键进入管理目录...:\n");
getch();
zhumulu();
}
void find()
{
int i;
char s[10];
system("cls");
printf("请输入要查询的学号:\n");
getchar(); //接收上一个回车字符
gets(s);
for(i=0;i<scount;i++)
if(strcmp(s,stu[i].num)==0)
{
print1();
printf("%-10s%-10s%-15s%-10.1lf%-10.1lf%-10.1lf%-10.1lf\n\n\n",stu[i].num,stu[i].password,stu[i].name,stu[i].grade[0],stu[i].grade[1],stu[i].grade[2],stu[i].ave);
break;
}
if(scount==i)printf("未找到该学生的信息!\n");
printf("请按任意键进入管理目录...:\n");
getch();
system("cls");
zhumulu();
}
void modify()
{
char s[10],c;
int i,k,m,n;
char j;
int p,q,t;
system("cls");
while(1)
{
p=0;//
k=0;//
n=1;//需在while内部初始化
printf("请输入您要修改的学号:\n");
getchar(); //接收上一个回车字符
gets(s);
system("cls");
for(i=0;i<scount;i++)
{
if(strcmp(s,stu[i].num)==0)
{
p=1;
t=i;
printf("此学生的信息为:\n");
print1();
printf("%-10s%-10s%-15s%-10.1lf%-10.1lf%-10.1lf%-10.1lf\n",stu[i].num,stu[i].password,stu[i].name,stu[i].grade[0],stu[i].grade[1],stu[i].grade[2],stu[i].ave);
printf("请按提示输入你想要修改的信息:\n");
//修改一个学生的信息
printf("1)学号\n2)密码(建议不要轻易修改学生密码)\n3)名字\n4)语文成绩\n5)数学成绩\n6)英语成绩\n7)平均成绩\n\n");
scanf("%c",&j);
system("cls");
while(n==1)//若输错序号,控制重复输入的语句
{
switch(j)
{
case '1':printf("请输入新学号:\n");scanf("%s",stu[i].num);n=0;break;
case '2':printf("请输入新密码:\n");scanf("%s",stu[i].password);n=0;break;
case '3':printf("请输入新名字:\n");scanf("%s",stu[i].name);n=0;break;
case '4':printf("请输入新语文成绩:\n");scanf("%lf",&stu[i].grade[0]);n=0;break;
case '5':printf("请输入新数学成绩:\n");scanf("%lf",&stu[i].grade[1]);n=0;break;
case '6':printf("请输入新英语成绩:\n");scanf("%lf",&stu[i].grade[2]);n=0;break;
case '7':printf("请输入新平均成绩:\n");scanf("%lf",&stu[i].ave);n=0;break;
default:{
system("cls");
n=1;
printf("请在数字0-7之间选择:\n");
printf("1)学号\n2)密码(建议不要轻易修改学生密码)\n3)名字\n4)语文成绩\n5)数学成绩\n6)英语成绩\n7)平均成绩\n\n");
break;
}
}//switch
if(n==1)scanf("%c",&j);
} //while
printf("此学生修改后的信息为:\n");
print1();
printf("%-10s%-10s%-15s%-10.1lf%-10.1lf%-10.1lf%-10.1lf\n",stu[t].num,stu[t].password,stu[t].name,stu[t].grade[0],stu[t].grade[1],stu[t].grade[2],stu[t].ave);
printf("若完成此修改输入Y或y,否则请输入N或n:\n");
getchar(); //必须加一个回车接收上一个的回车键
scanf("%c",&c);
if((c=='Y')||(c=='y'))
{
printf("恭喜您修改成功!\n\n");
k=1;
break;
}
else if((c=='N')||(c=='n'))
{
printf("请按提示重新修改:\n");
break;
}
}//if
} //for
if(p==0)
{
printf("没有找到学号为%s的学生信息\n\n",s);
printf("若您继续修改,确认请输入1,否则输入0\n");
scanf("%d",&q);
if(q==0)
break;
}
if(k==1)
{
printf("若要修改其他学生的信息,确认请输入1,否则输入0\n");
scanf("%d",&m);
system("cls");
if(m==0)
break;
}
} //while
save();
printf("请按任意键进入管理目录...:\n");
getch();
system("cls");
zhumulu();
}
void del()
{
int i,j,k,p=0;
char s[10],c;
printf("请输入您要删除的学生的学号:\n");
getchar();//
gets(s);
for(i=0;i<scount;i++)
{
if(strcmp(stu[i].num,s)==0)
{
p=1; //标记
print1();
printf("%-10s%-10s%-15s%-10.1lf%-10.1lf%-10.1lf%-10.1lf\n",stu[i].num,stu[i].password,stu[i].name,stu[i].grade[0],stu[i].grade[1],stu[i].grade[2],stu[i].ave);
printf("确认删除,请输入Y或y;不删除请输入N或者n:\n");
c=getchar();
if(c=='Y'||c=='y')
{
for(j=i+1;j<scount;j++)
stu[j-1]=stu[j];
for(k=0;k<scount-1;k++)
{
if(strcmp(stu[k].num,s)==0)
{
printf("删除不成功:\n");
break;
}
}
if(k==(scount-1))
{printf("恭喜你,删除成功!\n");
scount--;
}
}
else
{
printf("没有选择删除此学生的信息.\n");
break;
}
}
}
if(p==0)
printf("没有找到学号为%s的学生信息\n",s);
save();
printf("请按任意键进入管理目录...:\n");
getch();
system("cls");
zhumulu();
}
void sort()
{
int j=0;
char c1,c2;
system("cls");
printf("请按提示输入数字0-6:\n\n1)按学号排序\n2)按姓名排序\n3)按语文成绩排序\n4)按数学成绩排序\n5)按英语成绩排序\n6)按平均成绩排序\n0)退出排序\n");
getchar();//接收回车
c1=getchar();
switch(c1)
{
case '1':
{
system("cls");
printf("\n1)按学号升排序\n2)按学号降排序\n0)不排序\n");
getchar();
c2=getchar();
switch(c2)
{
case '1':qsort(stu,scount,sizeof(stu[0]),cmp11);j=1;break;
case '2':qsort(stu,scount,sizeof(stu[0]),cmp12);j=1;break;
case '0':break;
default:printf("输入错误\n");
}
if(j==1)
printf("恭喜你 排序成功!\n");
else
printf("排序失败!\n");
break;
}
case '2':
{
system("cls");
printf("\n1)按姓名字典升排序\n2)按姓名字典降排序\n0)不排序\n");
getchar();
c2=getchar();
switch(c2)
{
case '1':qsort(stu,scount,sizeof(stu[0]),cmp21);j=1;break;
case '2':qsort(stu,scount,sizeof(stu[0]),cmp22);j=1;break;
case '0':break;
default:printf("输入错误\n");
}
if(j==1)
printf("恭喜你 排序成功!\n");
else
printf("排序失败!\n");
break;
}
case '3':
{
system("cls");
printf("\n1)按语文成绩升排序\n2)按语文成绩降排序\n0)不排序\n");
getchar();
c2=getchar();
switch(c2)
{
case '1':qsort(stu,scount,sizeof(stu[0]),cmp31);j=1;break;
case '2':qsort(stu,scount,sizeof(stu[0]),cmp32);j=1;break;
case '0':break;
default:printf("输入错误\n");
}
if(j==1)
printf("恭喜你 排序成功!\n");
else
printf("排序失败!\n");
break;
}
case '4':
{
system("cls");
printf("\n1)按数学成绩升排序\n2)按数学成绩降排序\n0)不排序\n");
getchar();
c2=getchar();
switch(c2)
{
case '1':qsort(stu,scount,sizeof(stu[0]),cmp41);j=1;break;
case '2':qsort(stu,scount,sizeof(stu[0]),cmp42);j=1;break;
case '0':break;
default:printf("输入错误\n");
}
if(j==1)
printf("恭喜你 排序成功!\n");
else
printf("排序失败!\n");
break;
}
case '5':
{
system("cls");
printf("\n1)按英语成绩升排序\n2)按英语成绩降排序\n0)不排序\n");
getchar();
c2=getchar();
switch(c2)
{
case '1':qsort(stu,scount,sizeof(stu[0]),cmp51);j=1;break;
case '2':qsort(stu,scount,sizeof(stu[0]),cmp52);j=1;break;
case '0':break;
default:printf("输入错误\n");
}
if(j==1)
printf("恭喜你 排序成功!\n");
else
printf("排序失败!\n");
break;
}
case '6':
{
system("cls");
printf("\n1)按平均成绩升排序\n2)按平均成绩降排序\n0)不排序\n");
getchar();
c2=getchar();
switch(c2)
{
case '1':qsort(stu,scount,sizeof(stu[0]),cmp61);j=1;break;
case '2':qsort(stu,scount,sizeof(stu[0]),cmp62);j=1;break;
case '0':break;
default:printf("输入错误\n");
}
if(j==1)
printf("恭喜你 排序成功!\n");
else
printf("排序失败!\n");
break;
}
case '0':break;
default:printf("输入错误\n");
}
save();
printf("请按任意键进入管理目录...:\n");
getch();
system("cls");
zhumulu();
}
过程总结:
1)密码显示为'*',若输错,则不能删除,暂时没有解决这个问题,密码的算法可能需要重新设计,暂时还没想起更好的;
2)对文件部分加深了印象,此程序若没有打开文件,则应该写成return;而不能写成 exit(0),因为后期还要输入文件信息,不能直接终止程序,若不存在,还会自动的创建;
3)对结构体快排加深了印象,体会到其简洁性;
4)清屏函数system("cls")用了之后是程序更加简洁;
5)输入一个字符时无论用c=getchar();或scanf("%c",&c);之前看情况要加上getchar(),来接收上面的回车键,要不然会出错;因为其将回车符赋给了字符c;
6)在输入字符串是也一样,之前要加上一个getchar();
7)函数要声明
8)全局变量却实好用
9)初始化信息很给力
10)做标记,很有用处
OK,还比较满意,可能还有需要改进的地方,以后再说!