#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include<string.h>
#define N 50
//定义结构类型
struct student
{
int stuNo; //学号
char name[10]; //姓名
float cScore ; //C成绩
float javaScore; //java成绩
float sqlScore; //sql成绩
float sumScore; //总分
float avgScore; //平均分
}stu[N];//定义学生结构数组
/*函数原型说明*/
void add();
void display();
void sort();
void insert();
void del();
void sortByNo(); //px学号
void sortByavg(); //px平均分
void insertById(int);
void writeFile();
void readFile();
struct student input();//录入的函数原型
int count=0; //存储当前已有的学生人数
//登入界面
int login()
{
int i=0;
char uname[20];
char pwd[20];//密码 123\0
system("cls");
printf("\n\t\t +++++ Welcome to you!!! +++\n");
printf("\n\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\n\t\t用户名:");
gets(uname);
printf("\n\t\t密 码:");
fflush(stdin);
do
{
pwd[i] = getch(); // 123\r
if(pwd[i]!='\r')//如果当前输入不是回车键,则输出*
{
i++;
printf("*");
}
}while(pwd[i]!='\r');
pwd[i]='\0';//将最后的\r替换为\0
//验证
if(strcmp(uname,"hhysz")==0 && strcmp(pwd,"hh200707")==0)
return 1;
else
return 0;
}
void main()
{
int isSuccess;
int c = 0;//记录登入的次数
do
{
isSuccess = login();//调用登入函数
if(!isSuccess)//如果没有成功
{
printf("\n\t\t\t用户名不存在或密码错误,请检查后重新输入!\n");
printf("\n\t\t\t<您还有 %d 次机会!>",2-c);
c++;
if(c==3)
{
printf("\n\t\t您已尝试登入三次且失败,系统将退出!!!\n");
exit(1);
}
fflush(stdin);
getch();
}
else //登入成功
break;
}while(1);
int select; //选择项
do
{
system("cls");//清屏
printf("\n\t\t 欢迎进入学生成绩管理系统\n");
printf("\n\t***********************************************\n");
printf("\n\t\t\t1.添加学生信息\n");
printf("\n\t\t\t2.显示学生信息\n");
printf("\n\t\t\t3.排序学生信息\n");
printf("\n\t\t\t4.插入学生信息\n");
printf("\n\t\t\t5.删除学生信息\n");
printf("\n\t\t\t6.保存文件\n");
printf("\n\t\t\t7.打开文件\n");
printf("\n\t\t\t8.退出系统\n");
printf("\n\t**********************************************\n");
printf("\n\t请选择<1--8>:");
scanf("%d",&select);
if(select == 8)
{
printf("\n\t~~bye!!!\n");
break;
}
switch(select)
{
case 1:
add();//添加学生
break;
case 2:
display();//显示
break;
case 3:
s
ort();//排序
break;
case 4:
insert();//插入学生
break;
case 5:
del();//删除学生
break;
case 6:
writeFile();//写文件
break;
case 7:
readFile();//读
文件
break;
default:
printf("\n\t您输入的选项无效!按任意键重新输入...\n");
getch();
}
}while(1); //死循环
}
/*录入学生*/
struct student input()
{
int i;
struct student st;//定义结构变量
//循环验证添加的学号是否已经存在。
do{
printf("\n输入学号:");
scanf("%d",&st.stuNo);
for(i=0;i<count;i++)
{
if(st.stuNo == stu[i].stuNo)
{
printf("\n\t\t\t您输入的学号已存在,按任意键返回...");
fflush(stdin);
getch();
break;
}
}
if(i==count)
{
break;
}
}while(1);
fflush(stdin); //清空键盘输入的缓存区
printf("请输入姓名:");
gets();
printf("请输入C成绩:");
scanf("%f",&st.cScore);
printf("请输入Java成绩:");
scanf("%f",&st.javaScore);
printf("请输入SQL成绩:");
scanf("%f",&st.sqlScore);
//计算总分与平均分
st.sumScore = st.cScore +st.javaScore +st.sqlScore ;
st.avgScore =st.sumScore /3;
return st;//返回该学生
}
/*添加学生*/
void add()
{
char ans;//用于存放用户的回答
do
{
stu[count] = input();
count++;
printf("\n\t信息录入完成,是否继续(y|n):");
fflush(stdin);
ans = getchar();
}while(ans == 'y'||ans == 'Y');
}
/*显示*/
void display()
{
system("cls");
int i;
//输出表头
printf("\n\t\t*** 显示学生 ***\n");
printf("\n\t学号\t姓名\tC\tJava\tSQL\t总分\t平均分\n");
printf("\t======================================================\n");
for(i=0;i<count;i++)
{
printf("\t%d\t%s\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\n",
stu[i].stuNo,stu[i].name,stu[i].cScore,stu[i].javaScore,stu[i].sqlScore,
stu[i].sumScore,stu[i].avgScore);
}
printf("\t====================================================\n");
printf("\n\t\t\t\t按任意键返回主菜单...");
fflush(stdin);
getch();
}
void sort()
{
int op;
do{
system("cls");//清屏
printf("主界面>>>排序界面");
printf("\n\t\t***********************************************\n");
printf("\n\t\t\t 1.按学号排序<升序> \n");
printf("\n\t\t\t 2.按成绩排序<降序> \n");
printf("\n\t\t\t 0.返回主菜单 \n");
printf("\n\t\t***********************************************\n");
printf("\n\t请选择: ");
scanf("%d",&op);
if(op == 0)
{
break;
}
switch(op)
{
case 1:
sortByNo(); //学号
break;
case 2:
sortByavg(); //平均分
break;
default:
printf("\n\t您输入的选项无效!!!按任意键重新输入...\n");
fflush(stdin);
getch();
}
}while(1); //死循环
}
//按学号排序
void sortByNo()
{
printf("\n\t\t排序进行中,请稍后i...\n");
S
leep(2000);
//冒泡排序
int i,j;
struct student temp; //临时变量
for(i=0;i<count;i++) //控制要冒起的元素的个数
{
for(j=0;j<count-1-i;j++)//控制每冒起一个数,需要经
历的排序次数
{
if(stu[j].stuNo>stu[j+1].stuNo) //">"实现的是升序
{
temp=stu[j+1];
stu[j+1]=stu[j];
stu[j]=temp;
}
}
}
display();
printf("\n\t\t\t排序已完成,按任意键继续...");
fflush(stdin);
getch();
}
//按成绩排序
void sortByavg()
{
int i,j;
struct student temp; //临时变量
for(i=0;i<count;i++)
{
for(j=0;j<count-1-i;j++)
{
if(stu[j].avgScore<stu[j+1].avgScore) //"<"实现的是降序
{
temp=stu[j+1];
stu[j+1]=stu[j];
stu[j]=temp;
}
}
}
display();
printf("\n\t\t\t排序已完成,按任意键继续...");
fflush(stdin);
getch();
}
void insert()
{
int op;
do{
system("cls");//清屏
printf("主界面>>>插入界面");
printf("\n\t\t******************************************************\n");
printf("\n\t\t\t 1.按学号插入<升序>\n");
printf("\n\t\t\t 2.按平均分插入<降序>\n");
printf("\n\t\t\t 0.返回主菜单 \n");
printf("\n\t\t******************************************************\n");
printf("\n\t请选择: ");
scanf("%d",&op);
if(op == 0)
{
break;
}
switch(op)
{
case 1:
insertById(1); //按学号插入
break;
case 2:
insertById(2); //按平均分插入
break;
default:
printf("\n\t您输入的选项无效!!!按任意键重新输入...\n");
fflush(stdin);
getch();
}
}while(1); //死循环
}
//插入学生数据
void insertById(int id)
{
int i;
struct student s = input(); //调用函数,接收要插入的信息
//(1) 查找要插入的数组中的下标位置
for(i=0;i<count;i++)
{
if(id==1) //按学号插入
{
if(s.stuNo<stu[i].stuNo)
break;
}
else if(id==2) //按平均分的降序插入
{
if(s.avgScore > stu[i].avgScore)
break;
}
}
//(2) 循环平移操作---->为要出入的元素预留空间
int j;
for(j=count-1;j>=i;j--)
{
stu[j+1] = stu[j];
}
//(3) 将要插入的元素放入该位置
stu[i] = s;
//(4) 将当前学生人数++
count++;
printf("\n\t学生数据插入完成,按任意键继续...\n");
fflush(stdin);
getch();
}
//删除功能
void del()
{
char ans;
int i;
int sno;//学号
do
{
system("cls");//清屏
printf("主界面>>>删除界面\n");
printf("\n\t*******************************************\n");
printf("\n\t\t请输入需要删除的学号: ");
scanf("%d",&sno);
//1) 查找被删除的学生的学号是否已存在,如果不存在,i即其下标
for(i=0;i<count;i++)
{
if(stu[i].stuNo == sno)
break;
}
//2) 判断是否找到
if(i<count) //找到了
{
//显示需要删除的学生的信息
printf("\n\t需要删除的学生信息如下:\n");
printf("\n\t\t学号\t姓名\tC
\tJava\tSQL\t总分\t平均分\n");
printf("\n\t------------------------------------------------\n");
printf("\n\t\t%d\t%s\t%5.2f\t%
5.2f\t%5.2f\t%5.2f\t%5.2f\n",
stu[i].stuNo,stu[i].name,stu[i].cScore,stu[i].javaScore,
stu[i].sqlScore,stu[i].sumScore,stu[i].avgScore);
//提示是否正确删除
printf("\n\t确认删除该学生信息吗?<y|n>:");
fflush(stdin);
ans = getchar();
if(ans == 'y' || ans =='Y')
{
//如果确认删除,则执行相应的删除操作
int j;
for(j = i;j>count-1 ; j++)
{stu[j] = stu[j+1];}
//将当前学生人数 --
count--;
printf("\n\t\t\t删除操作完成,按任意键继续...");
fflush(stdin);
getch();
}
}
else //没有找到
{
printf("\n\t\tSorry,没有找到对应的学号,无法删除...\n");
fflush(stdin);
getch();
}
//是否继续删除
printf("\n\n\t\t\t是否继续执行删除操作?<y|n>:");
fflush(stdin);
ans = getchar();
if(ans == 'y'||ans == 'Y')
continue; //继续提示删除的学号
else
break; //跳出循环,回到主界面
}while(1);
}
//保存文件
void writeFile()
{
FILE *fp; //定义文件指针变量
fp = fopen("stu.dat","wb"); //以创建文件形式关联
int i;
for(i=0;i<count;i++)
{
//循环将结构数组stu中的记录写入到fp所指向的文件中去
fwrite(&stu[i],sizeof(struct student),1,fp);
}
fclose(fp);//关闭文件
printf("\n\t\t\t文件保存完毕,按任意键继续...\n");
printf("\n");
fflush(stdin);
getch();
}
//读取文件
void readFile()
{
FILE *fp; //定义文件指针
fp = fopen("stu.dat","rb"); //以读取文件形式关联
if(fp==NULL)
{
printf("\n\t\t\tSorry,您要打开的文件不存在。按任意键继续\n");
fflush(stdin);
getch();
}
else //文件存在时
{
//将文件指针移到文件末尾
fseek(fp,0,2);
//计算文件中的记录数
count= ftell(fp)/sizeof (struct student);
//将文件指针移到文件开始,便于读取文件
rewind(fp);
int i;
for(i=0;i<count;i++)
{
fread(&stu[i],sizeof(struct student),1,fp);
}
fclose(fp); //关闭文件
printf("\n\t\t\t文件打开完成,按任意键返回...\n");
printf("\n");
fflush(stdin);
getch();
}
}
//分页显示
void dispByPage()
{
char op;
int i;
int size = 5; //每页显示的记录数 size--->5
int sumPages; //总页数 sumPage
// sumPage = count%size==0 ? count/size : count/size+1;
int p=1; //当前的页码 ---> p--> 1
sumPages = count/size;
if(count%size!=0)
{
sumPages++;
}
do
{
system("cls");//清屏
printf("\n\t\t ===分页显示===\n");
printf("\n\t***************************************************\n");
printf("\n\t学号\t姓名\tC\tJava\tSQL\t总分\t平均分\n");
printf("\t-----------------------------------------------------\n");
for(i=5*(p-1);i<5*p && i<
;count ;i++)
{
printf("\t%d\t%s\t%5.2f\t%5.2f\t%5.2f\t%5.2f\t%5.2f\n",
stu[i].stuNo,stu[i].name,stu[i].cScore,stu[i].javaScore,stu[
i].sqlScore,
stu[i].sumScore,stu[i].avgScore);
}
printf("\t====================================================\n");
printf("\t\t\t 第【 %d 】页\n",p);
printf("\n 1.首页 2.上一页 3.下一页 4.末页 0.退出");
fflush(stdin);
op = getch();
if(op=='0')
break;
switch(op)
{
case '1':
p=1;
break;
case 2:
p--;
if(p<1)
{
printf("\n\n\t\t\t当前已经是第一页了...");
p++;
fflush(stdin);
getch();
}
break;
case 3:
p++;
if(p>sumPage
s)
{
printf("\n\n\t\t当前已经是最后一页了...");
p--;
fflush(stdin);
getch();
}
break;
case 4:
p = sumPages;
break;
}
}while(1);
}