/**************************************************************************
北大青鸟学员管理系统。。 此程序可实现以管理员方式操作学员的学号,姓名,三门成绩,以及平均成绩的录入, 读取,删除,排序,查找,保存功能。并提供普通帐户对学员信息的浏览。 ***************************************************************************/ #include<stdio.h> #include<string.h> #include<windows.h> int count=0,flag; //定义两个全局变量,count为总录入人数。flag为一个标记 char ch; //定义一个全局字符变量,为程序经常执行“是否继续”输入 struct student //声明一个结构体,并作为全局变量。 { char num[5]; //学号 char name[30]; //姓名 float score[3]; //三门课程成绩 float pinjun; //平均成绩 }stu[50]; //声明结构数组可存放50名学生 void denglu(); //选择登录函数 void administrator(); //管理员界面 void guess(); //普通帐户界面 void input(); //录入函数 void charu(); //插入函数 void xiugai(); //修改函数 void del(); //删除函数 void output(); //显示函数 void jiang(); //降序排列函数 void sheng(); //升序排列函数 void find(); //查找函数 void exit1(); //退出函数 void jilu(); //读取上次记录 void read_count(); //读取总人数值 void save_count(); //保存总人数值 void read(); //读取学员信息 void save(); //保存学员信息 void main() //主函数 { denglu(); //主函数中调用登录函数 } void denglu() //登录函数 { char admin[30],pass[20]; //字符数组分别用于存放用户名,密码 char pass1[20]="123456"; //字符串用于存放默认密码 int i,j; //统计数组下标 /***********************************登录前界面***********************************************/ printf("\n\n\n\n\t\t\t★★★★★★★★★★★★★★★"); printf("\n\n\t\t\t★ 学 员 管 理 系 统 ★\n\n\t\t\t★★★★★★★★★★★★★★★\t\t\t\t\n\n\n"); printf("\t﹉﹊﹉﹊﹉﹊﹉﹊﹉﹊﹉﹊﹉﹉﹊﹉﹊﹉﹊﹉﹊﹉﹊﹉﹊﹉﹊﹉﹊﹉﹊﹉\n"); getch(); do{ printf("\n\n\t\t\t1:管理员帐户\n\t\t\t2:普通帐户\n\t\t\t0:退出程序\n\n\t\t\t"); printf("\n\t\t\t请选择登录类型:"); fflush(stdin); ch = getchar(); switch(ch) //分支实现用户输入的功能 { case '1': //选择管理员登录 printf("\n\t\t\t请输入用户名:"); fflush(stdin); gets(admin); fflush(stdin); printf("\n\t\t\t请输入密码:"); i=0; /*以下用于输入密码,从键盘得到一个符并赋给字符数组。同时打印一个*号。直到遇\n结束。*/ do{ fflush(stdin); ch=getch(); pass if(ch!=13) { printf("*"); } i++; }while(ch!=13); /* 以下用于判断密码是否为管理员密码,将用户输入密码串与系统内设密码相比, 相等则继续,否则跳出 ,同时返回一个j的值 */ for(j=0;j<6;j++) { if(pass[j]==pass1[j]) continue; else break; } if((j==6)&&(strcmp(admin,"admin")==0)&&(i==7)) //判断用户名,密码是否为管理员。 { printf("\n\t\t\t登录中请稍等"); for(i=0;i<6;i++) { Sleep(500); printf("."); } system("cls"); //系统清屏 printf("\n登录成功,当前是管理员账户."); //成功登录 administrator(); //调用管理员界面函数 } if((strcmp(pass,pass1)!=0)||(strcmp(admin,"admin")!=0)) //用户名,密码错误,则跳出重新选择 { printf("\n\t\t\t用户名或密码错误,请重新选择"); break; } case '2': //分支实现用户输入的功能:游客 printf("\n\t\t\t将以普通帐户登录"); for(i=0;i<6;i++) //循环控制输出系统等待时间 { Sleep(500); printf("."); } system("cls"); //清屏 printf("\n登录成功,当前是普通帐户."); guess(); //调用普通帐户界面函数 case '0': //分支实现用户输入的功能:退出 /******************************退出时显示界面***********************************************/ system("cls"); printf("\n\n\n\n******************************************************************************\n"); printf("\n\t\t\t关于学员成绩管理系统\n"); Sleep(800); printf("\n\t\t\t作者 赛思特组\n"); Sleep(800); printf("\n\t\t\t组员:汪波 王勃 张小惠 李承檬 田庆康\n"); Sleep(800); printf("\n\t\t\t特别鸣谢:北大青鸟清河中心\n"); Sleep(800); printf("\n\t\t\t北大青鸟TS111班 2008-5-19\n"); Sleep(800); printf("\n\t\t\tCopyright(C)2008\n"); Sleep(800); printf("\n******************************************************************************\n\n\n\n\n\n\n"); printf("正在退出请稍候"); for(i=0;i<6;i++) //循环控制退出等待时间 { Sleep(500); printf("."); }; system("cls"); //清屏 printf("\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t成功退出!\n\n\t\t\t\t谢谢使用!\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); exit(0); //终止程序 default: //若用户输入错误。则跳出继续循环。 { printf("\n\t\t\t输入错误!"); continue; } } }while(ch!='1'||ch!='2'); //判断用户输入不为1或者2时执行循环 } void administrator() //管理员函数 { char sel; //字符变量,控制选择降序或者升序 int i; jilu(); //调用函数,询问用户是否读取上次操作记录。 do{ /************************管理员主界面*******************************/ printf("\n\n\t\t\t〖\t学 员 管 理 系 统\t〗\t\n"); printf("\n\t\t≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈\n"); //提示信息 printf("\n\t\t︴\t\t1: 录入新学员信息\t\t︴"); printf("\n\n\t\t︴\t\t2: 插入新学员信息\t\t︴"); printf("\n\n\t\t︴\t\t3: 修改学员信息 \t\t︴"); printf("\n\n\t\t︴\t\t4: 删除学员信息 \t\t︴"); printf("\n\n\t\t︴\t\t5: 查看学员信息 \t\t︴"); printf("\n\n\t\t︴\t\t6: 顺序排列学员 \t\t︴"); printf("\n\n\t\t︴\t\t7: 查找学员 \t\t︴"); printf("\n\n\t\t︴\t\t8: 保存所有信息 \t\t︴"); printf("\n\n\t\t︴\t\t0: 退出 \t\t︴\n"); printf("\n\t\t≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈\n"); printf("\n请选择您要进行的操作(0-8): "); //操作选择 fflush(stdin); ch = getchar(); switch(ch) //分支实现各项功能 { case '1': system("cls");input();system("cls");continue; //调用记录函数 并清屏 case '2': system("cls");charu();system("cls");continue; //调用插入函数 并清屏 case '3': system("cls");xiugai();system("cls");continue; //调用修改函数 并清屏 case '4': system("cls");del();system("cls");continue; //调用删除函数 并清屏 case '5': system("cls"); output(); //调用显示函数 并清屏 system("cls"); continue; case '6': system("cls"); printf("\n程序将按成绩排序:\n\na:降序\t\tb:升序\n\n请选择:"); fflush(stdin); sel = getchar(); if(sel=='a'||sel=='A') //选择成绩降序,则调用降序函数 { jiang(); output(); } else if(sel=='b'||sel=='B') //选择成绩升序,则调用降序函数 { sheng(); output(); } system("cls"); continue; case '7': system("cls");find();system("cls");continue; //调用查找函数 case '8': system("cls"); printf("\n正在保存,请稍候!"); for(i=0;i<6;i++) //循环控制输出系统等待。。。。。。 { Sleep(500); printf("."); } save(); //调用保存函数 printf("\n保存成功。\n"); printf("\n任意键继续!"); fflush(stdin); ch = getch(); continue; case '0': printf("是否保存当前更改?(y/n)"); fflush(stdin); ch = getchar(); if(ch=='y'||ch=='Y') { printf("\n正在保存,请稍候!"); for(i=0;i<6;i++) //循环控制输出系统等待。。。。。。 { Sleep(500); printf("."); } save(); printf("\n保存成功。\n"); exit1(); system("cls"); } else{ exit1(); system("cls"); } continue; //退出函数 default: { printf("\n输入错误!请重新输入\n"); //提示选择错误的信息 flag=1; //使标记值为真并跳出switch 执行下次循环 break; } } }while(1); } void guess() //普通帐户函数 { int flag=1; //定义检查标记 char sel; //字符变量,控制选择降序或者升序 printf("\n\n\n\n\t\t\t〖\t学 员 管 理 系 统\t〗\t\n"); do{ /*****************************普通帐户主界面**********************************/ printf("\n\n\t\t≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈\n"); //提示信息 printf("\n\t\t︴\t\t1: 查看学员信息 \t\t︴"); printf("\n\n\t\t︴\t\t2: 顺序排列学员 \t\t︴"); printf("\n\n\t\t︴\t\t3: 查找学员 \t\t︴"); printf("\n\n\t\t︴\t\t0: 退出 \t\t︴\n"); printf("\n\t\t≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈\n"); printf("\n\n\n请选择您要进行的操作(0-3): "); //操作选择 fflush(stdin); ch = getchar(); printf("\n--------------------------------------\n"); switch(ch) //分支实现用户输入各项功能 { case '1': system("cls");output();system("cls");continue; //调用显示函数 case '2': //实现排序 system("cls"); { printf("\n程序将按成绩排序:\n\na:降序\t\tb:升序\n\n请选择:"); fflush(stdin); sel = getchar(); if(sel=='a') //选a则实现降序 { jiang(); output(); //调用降序函数后调用显示函数 } else if(sel=='b') //选b则实现升序 { sheng(); output(); //调用降序函数后调用显示函数 } system("cls"); continue; } case '3': system("cls");find();system("cls");continue; //调用查找函数 case '0': exit1();system("cls");continue; //退出 default: { printf("\n输入错误!请重新输入\n"); //提示选择错误的信息 flag=1; //使标记值为真并跳出switch system("cls"); continue; } } }while(flag=1); } void input() //录入函数 { int i=0,j; //i控制结构数组元素,j 为标记 float s=0; printf("\n请输入学员信息:\n"); do{ float s=0; //初始化总成绩为0 do{ printf("请输入学号:"); fflush(stdin); gets(stu[count].num); //接收用户输入学号 for(i=0;i<count;i++) { if(strcmp(stu { printf("\n学号已存在,请重新输入!\n"); j=1; //标记为1 break; //存在则跳出内循环。 } else j=0; //否则标记为0 } }while(j==1); //判断标记为1时执行循环 printf("请输入姓名:"); fflush(stdin); //接收输入姓名 gets(stu[count].name); for(j=0;j<3;j++) //循环接收三门课程成绩并累加和 { fflush(stdin); printf("请输入第%d门成绩:",j+1); scanf("%f",&stu[count].score[j]); s=s+stu[count].score[j]; } stu[count].pinjun = s/3; //求平均成绩 count++; printf("是否继续录入?(y/n)"); fflush(stdin); ch = getchar(); }while(ch=='y'||ch=='Y'); //循环是否继续 save(); //执行录入完后保存 } void charu() //插入函数 { int i=0,j; //i,j控制下标 float s=0; //s存放累加和并初始化为0 printf("\n插入前学员信息:\n"); //显示插入前信息 output(); //调用显示函数 printf("\n请插入学员信息:\n"); //执行插入 do{ float s=0; do{ printf("请输入学号:"); fflush(stdin); gets(stu[count].num); for(i=0;i<count;i++) { if(strcmp(stu { printf("\n学号已存在,请重新输入!\n"); flag=1; //标记为1 break; } else flag=0; //否则标记为0 } }while(flag==1); //标记为1时继续循环 printf("请输入姓名:"); fflush(stdin); gets(stu[count].name); for(j=0;j<3;j++) //循环控制三门成绩输入 { fflush(stdin); printf("请输入第%d门成绩:",j+1); scanf("%f",&stu[count].score[j]); s+=stu[count].score[j]; //累加和 } stu[count].pinjun = s/3; //求平均值 count++; //每插入一名学员,人数加1 printf("是否继续插入?(y/n)"); fflush(stdin); ch = getchar(); }while(ch=='y'||ch=='Y'); //判断是否继续 printf("\n插入后学员信息:\n"); //显示插入后学员信息 --调用降序函数--调用显示函数 jiang(); output(); //插入后显示 save(); //保存 } void xiugai() //修改函数 { char xiu[5]; //定义一个字符串,用于查找结构体学号成员 int i,j; float s = 0; //总成绩S do{ printf("\n请输入要修改的学员学号:"); fflush(stdin); gets(xiu); for(i=0;i<=count;i++) //循环用于查找学号 { if(strcmp(xiu,stu { //此时下标i正好指向要修改的元素 printf("\n 请选择要修改的部分\n"); //选择修改内容。 printf("\n 1: 学号"); printf("\n 2: 姓名"); printf("\n 3: 成绩"); printf("\n请选择: "); fflush(stdin); ch=getchar(); switch(ch) //分支用于选择 { case '1': do{ printf("\n请输入新的学号: "); //修改学号 fflush(stdin); gets(stu for(j=0;j<count;j++) { if((j<i||j>i)&&(strcmp(stu[j].num,stu { printf("\n学号已存在,请重新输入!\n"); flag=1; //标记为1 break; } else flag=0; //否则标记为0 } }while(flag==1); break; case '2': //修改姓名 printf("\n请输入新的姓名: "); fflush(stdin); gets(stu break; case '3': //修改成绩并重新计算平均值 for(j=0,s=0;j<3;j++) { fflush(stdin); printf("请输入第%d门成绩:",j+1); scanf("%f",&stu s+=stu } stu break; default: printf("\n没有此项操作!\n"); flag=1; //标记 } if(flag!=1) //如果有操作,,则提示修改成功 { printf("\n 修改成功!该学员修改后的信息如下\n"); printf("学号\t姓名\tc成绩\tj成绩\ts成绩\t平均成绩\n"); printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu break; } } if(strcmp(xiu,stu { continue; } } if(i>count) //如果下标越界,则未找。 { printf("没找到此学号\n"); } printf("是否继续修改?(y/n)"); fflush(stdin); ch = getchar(); }while(ch=='Y'||ch=='y'); //循环是否继续 save(); //保存 } void del() //删除函数
{ char dell[5]; //定义字符串,用于查找学号 int i; //i为下标 struct student temp; //声明一个结构体。用于作容器 do{ printf("\n请输入要删除的学员学号:"); fflush(stdin); gets(dell); for(i=0;i<=count;i++) //循环查找学员学号,找着则退出循环 { if(strcmp(dell,stu { break; } } if(i>count) //如果下标越界,则说明未找以。 { printf("\n找不到这个学员!\n"); } if(i<=count) //提示找到, ,询问是否删除 { printf("\n是否要删除%s号学员的信息(Y/N):",stu fflush(stdin); ch = getchar(); if(ch=='Y'||ch=='y') { for(;i<count;i++) { temp = stu stu stu } count--; //总人数-1 printf("删除成功\n"); } } printf("是否继续删除?(y/n)"); fflush(stdin); ch = getchar(); }while(ch=='Y'||ch=='y'); //判断是否继续 save(); //保存 } void output() //显示函数 { int i; //定义I为下标 if(count>0) //如果 有录入记录,则显示相关信息 { printf("\n\t\t\t学员信息:\n\n"); printf("学号\t姓名\tc成绩\tj成绩\ts成绩\t平均成绩\n"); for(i=0;i<count;i++) //循环控制输出所有学员信息 { printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu } } else //否则说明文件无记录 { printf("\n文件中无任何信息!\n"); } printf("\n任意键退出查看!"); fflush(stdin); ch = getch(); } void jiang() //降序函数 { int i,j; //i控制大循环。j控制小循环 struct student temp; //定义一个结构体容器 for(i=0;i<count;i++) //冒泡排序 大循环控制总执行次数。 { for(j=0;j<count-i-1;j++) //冒泡排序 小循环控制小执行次数 { if(stu[j].pinjun<stu[j+1].pinjun) //如果第一个元素小于第二个,则交换位置,然后下标后移一位。 { temp = stu[j]; stu[j] = stu[j+1]; stu[j+1] = temp; } } } } void sheng() //升序函数 { int i,j; //i控制大循环。j控制小循环 struct student temp; //定义一个结构体容器 for(i=0;i<count;i++) //冒泡排序 大循环控制总执行次数。 { for(j=0;j<count-i-1;j++) //冒泡排序 小循环控制小执行次数 { if(stu[j].pinjun>stu[j+1].pinjun) //如果第一个元素大于第二个,则交换位置,然后下标后移一位 { temp = stu[j]; stu[j] = stu[j+1]; stu[j+1] = temp; } } } } void find() //查找函数 { char s[5]; //定义一个数组,用于查找学号 int i; printf("\n请输入要查找的学员学号:"); fflush(stdin); gets(s); for(i=0;i<count;i++) { if(strcmp(s,stu { printf("该学员信息如下:\n"); printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n"); printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu break; } } if(i>=count) //如果下标越界未找着相同的,则显示没找到。 { printf("没找到该学号\n"); } printf("\n\n按任意键返回\n"); fflush(stdin); ch = getch(); //控制画面停顿 } void exit1() //退出函数 { int i; //i 为计数器 printf("\n\n正在退出,请稍等"); for(i=0;i<6;i++) //循环控制输出系统等待。。。。。。 { Sleep(500); printf("."); } system("cls"); //清屏 printf("\n\t\t\t\t\t成功退出"); denglu(); //返回登录界面 } void read_count() //读取总人数值 { FILE *reade_Count; if((reade_Count=fopen("count.txt","r"))!=NULL) { fscanf(reade_Count,"%d",&count); } fclose(reade_Count); } void save_count() //保存总人数值 { FILE *write_count; write_count = fopen("count.txt","w"); fprintf(write_count,"%d",count); fclose(write_count); } void read() //读取学员信息 { struct student stu1; FILE *fp; int i; if((fp=fopen("student.txt","r"))==NULL) { printf("文件中无记录,按任意键新建\n"); fflush(stdin); ch=getch(); } else { printf("\n读取成功,正在进入"); for(i=0;i<6;i++) //循环控制输出系统等待。。。。。。 { Sleep(500); printf("."); } read_count(); for(i=0;i<count;i++) { fscanf(fp,"%s%s%f%f%f%f",stu } fclose(fp); } } void save() //保存学员信息 { FILE *fp; /*FILE4个字母都要大写*/ int i; fp=fopen("student.txt","w"); for(i=0;i<50;i++) { fprintf(fp,"%s %s %f %f %f %f ",stu } fclose(fp); save_count(); } void jilu() { int i; FILE *fp; if((fp=fopen("student.txt","r"))!=NULL) { printf("\n\n是否读取上次记录?(y/n)"); fflush(stdin); ch = getchar(); if(ch=='Y'||ch=='y') { printf("\n读取中,请稍候"); for(i=0;i<6;i++) //循环控制输出系统等待。。。。。。 { Sleep(500); printf("."); } read(); } } else { return; } } |
|