利用文本实现的,想法是修改时进行读和改操作,而排序不会重新写入文件。
不知道这样写会不会很罗嗦,但是先存上再说。。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define LIST_INIT_SIZE 100
typedef struct //定义日期型数据
{
int year;
int month;
int day;
}birth;
typedef struct //学生情况结构体定义
{
int num; //学号
char name[20]; //姓名
char sex[2]; //性别,只能输入"男"或"女"
birth birthday; //出生日期
int chinese; //语文成绩
int english; //英语成绩
int math; //数学成绩
int total; //总成绩
double Aver; //平均成绩
}Student;
typedef struct
{
Student *elem; //职工信息,采用动态数组的方式进行存储
int Listsize; //空间大小
int length; //实际用的空间数
}StudentList;
StudentList stu;
FILE *fp;
//****************************用户函数定义开始*****************************
void MainMenu() //主菜单
{
printf("\n\n");
printf("\t\t 常春藤学生成绩管理系统\n\n");
printf("\t==============================================\n");
printf(" \t\t 1 新 增 数 据\n\n");
printf(" \t\t 2 删 除 数 据\n\n");
printf(" \t\t 3 成 绩 录 入\n\n");
printf(" \t\t 4 成 绩 汇 总\n\n");
printf(" \t\t 5 信 息 排 序\n\n");
printf(" \t\t 6 信 息 修 改\n\n");
printf(" \t\t 7 学 生 信 息\n\n");
printf(" \t\t 0 退 出 系 统\n\n");
printf("\t==============================================\n");
printf("\t\t请选择功能(0—6):");
}
//学生基本信息
//初始化学生顺序表,参见顺序表的初始化过程
int InitStudentList(StudentList &Stu)
{
Stu.elem=(Student *) malloc ( LIST_INIT_SIZE * sizeof(Student));
if( !Stu.elem ) exit(0);
Stu.Listsize = LIST_INIT_SIZE ;
Stu.length = 0;
return 1;
//申请空间,并将空间的地址赋给Stu.elem
//判断是否申请成功;是返回1,否则返回0,并退出这个程序
}
void fread() //读文件
{
int i=0;
stu.length = -1; //文件为空时会执行一次
if((fp = fopen( "E:\\a.txt","rb" )) == NULL) //首先先创建此文件,否则会报错
{
printf("can't open file!\n");
system("pause");
return ;
}
while(!feof(fp)) //文件不结束就一直读 //文件为空时会执行一次,所以Stu.length=0 不可以
{
fread(&stu.elem[i],sizeof(Student),1,fp);
i++;
stu.length++;
}
fclose(fp);
}
void fwrite() //写文件
{
int i;
if((fp = fopen( "E:\\a.txt","wb" )) == NULL)
{
printf("can't open file!\n");
return ;
}
for(i = 0 ; i < stu.length; i++)
if( fwrite(&stu.elem[i],sizeof(Student),1,fp) != 1 ) //以二进制写入
printf("file write error\n");
fclose(fp);
}
void show (StudentList &Stu)
{
fread();
int i;
printf(" =============================================================================\n");
printf(" 学号 姓名 性别 出 生 日 期 语文 英语 数学 总分数 平均成绩 \n");
printf(" =============================================================================\n");
for(i = 0 ; i < Stu.length ; i ++)
printf("%d %-5d%-5s %-5s%-4d年%-2d月%-2d日 %-3d %-3d %-3d %-3d %-3.2lf \n",i+1,Stu.elem[i].num,Stu.elem[i].name,Stu.elem[i].sex,
Stu.elem[i].birthday.year,Stu.elem[i].birthday.month,Stu.elem[i].birthday.day,Stu.elem[i].chinese,Stu.elem[i].english,Stu.elem[i].math,Stu.elem[i].total,
Stu.elem[i].Aver
);
putchar('\n');
}
//新增新学生的基本信息,包括:学号、姓名、性别和出生日期的输入,参见顺序表的输入
void AddNewStudent(StudentList &Stu)
{
int n,k,i = 0 ;
fread();
i=0;
printf("请输入学号 :");
scanf("%d",&n);
while( i < Stu.length )
{
if( Stu.elem[i].num == n )
{
printf("当前学生已存在,是否继续输入其他学号!(0:终止 1:继续):\n");
scanf("%d",&k);
if( k != 1) return ;
printf("请输入学号 :");
scanf("%d",&n);
i = -1;
}
i++;
}
if(i== Stu.length )
{
Stu.elem[Stu.length].num = n ;
printf("--------------请继续输入该学生的其他信息---------------\n");
getchar();
printf("姓 名 : ");
scanf("%s",Stu.elem[Stu.length].name);
printf("性 别( 男 or 女 ) : ");
scanf("%s",Stu.elem[Stu.length].sex);
printf("生 日(年 月 日) ,以空格隔开 : ");
scanf("%d%d%d",&Stu.elem[Stu.length].birthday.year,&Stu.elem[Stu.length].birthday.month,&Stu.elem[Stu.length].birthday.day);
Stu.elem[Stu.length].chinese = 0 ; Stu.elem[Stu.length].english = 0 ; Stu.elem[Stu.length].math = 0 ;
Stu.elem[Stu.length].total = 0 ; Stu.elem[Stu.length].Aver = 0 ;
printf("----------------添加成功----------------\n");
Stu.length ++;
}
fwrite();
//输入学生的学号;
//检索当前学号的学生是否存在;
//不存在,继续输入学生的其它基本信息,使学生的总数加1, 否则,提示学生已经存在,输入其它学号
}
//学生删除,参见顺序表数据的删除
void DelStudent(StudentList &Stu)
{
Student temp; int i=0,j,k,number,flag=0;
char a;
fread();
i = 0;
printf("请输入学号 :");
scanf("%d",&number);
while(i < Stu.length)
{
if( Stu.elem[i].num == number )
{
printf("是否删除学号为%d的学生信息?(y/n):",number);
getchar();
a=getchar();
if( a == 'y')
{
for(j = i + 1 ; j < Stu.length ; j ++)
{
temp = Stu.elem[j];
Stu.elem[j-1]=temp;
}
flag = 1;
Stu.length--;
fwrite();
printf("--------学号为%d的学生相关信息已删除!---------\n",number);
}
else
{
printf("-------不删除该同学信息,本程序退出---------\n");
flag = 1;
return ;
}
}
else if( i == Stu.length -1 && flag == 0)
{
printf("当前学不存在,是否继续输入其他学号!(0:终止 1:继续):\n");
scanf("%d",&k);
if( k != 1) return ;
printf("请输入学号 :");
scanf("%d",&number);
i = -1;
}
i++;
}
//输入学生的学号;
//检索当前学号的学生是否存在;
//不存在,重新输入, 否则,提示是否删除,根据选择做相应的处理
}
//学生成绩输入,顺序表数据的修改
void AddGrade(StudentList &Stu)
{
int i,j,number;char a;
fread();
while(1)
{
printf("请输入学号:");
scanf("%d",&number);
for(i = 0 ; i < Stu.length ; i ++)
if(Stu.elem[i].num != number && i == Stu.length -1)
{ printf("当前学生不存在,返回主程序!\n");
return ;
}
else if ( Stu.elem[i].num == number)
{
j = i;
break;
}
printf("-----------请继续输入语文,英语,数学三科成绩------------\n");
scanf("%d",&Stu.elem[j].chinese);
scanf("%d",&Stu.elem[j].english);
scanf("%d",&Stu.elem[j].math);
fwrite();
printf("是否继续输入其他学生的三科成绩( y / n) ?\n");
getchar();
a=getchar();
if(a == 'n') return;
}
//输入学生的学号
//检索当前学号的学生是否存在;
//不存在,提示并返回主程序
//存在,输入三科成绩,提示是否继续输入,是的则继续输入,否则该函数结束
}
//学生成绩的汇总
void SumGrade(StudentList &Stu)
{
int i;
fread();
for(i = 0 ; i < Stu.length ; i ++)
{
Stu.elem[i].total = Stu.elem[i].chinese + Stu.elem[i].english +Stu.elem[i].math;
Stu.elem[i].Aver = Stu.elem[i].total / 3.0;
}
fwrite();
printf("-----------成绩汇总成功---------\n");
//从第一个学生开始,将学生的三科成绩求和求平均成绩
}
//排序-----按语文成绩排序
void BubbleSortbyCh(StudentList &Stu)
{
Student temp; int i,j;
fread();
for(i = 0 ; i <Stu.length - 1 ; i ++ )
for(j = 0 ; j < Stu.length - i -1 ; j ++)
if(Stu.elem[j].chinese < Stu.elem[j+1].chinese)
{
temp=Stu.elem[j];
Stu.elem[j]=Stu.elem[j+1];
Stu.elem[j+1] = temp;
}
show(stu);
//按语文成绩排序
}
//排序-----按英语成绩排序
void BubbleSortbyEn(StudentList &Stu)
{
Student temp; int i,j;
fread();
for(i = 0 ; i <Stu.length - 1 ; i ++ )
for(j = 0 ; j < Stu.length - i -1 ; j ++)
if(Stu.elem[j].english < Stu.elem[j+1].english)
{
temp=Stu.elem[j];
Stu.elem[j]=Stu.elem[j+1];
Stu.elem[j+1] = temp;
}
show(stu);
//按英语成绩排序
}
//排序-----按数学成绩排序
void BubbleSortbyMath(StudentList &Stu)
{
Student temp; int i,j;
fread();
for(i = 0 ; i <Stu.length - 1 ; i ++ )
for(j = 0 ; j < Stu.length - i -1 ; j ++)
if(Stu.elem[j].math < Stu.elem[j+1].math)
{
temp=Stu.elem[j];
Stu.elem[j]=Stu.elem[j+1];
Stu.elem[j+1] = temp;
}
show(stu);
//按数学成绩排序
}
//排序-----按总成绩排序
void BubbleSortbyTotal(StudentList &Stu)
{
Student temp; int i,j;
fread();
for(i = 0 ; i <Stu.length - 1 ; i ++ )
for(j = 0 ; j < Stu.length - i -1 ; j ++)
if(Stu.elem[j].total < Stu.elem[j+1].total)
{
temp=Stu.elem[j];
Stu.elem[j]=Stu.elem[j+1];
Stu.elem[j+1] = temp;
}
show(stu);
//按总成绩排序
}
//排序-----按学号排序
void BubbleSortbyNo(StudentList &Stu)
{
Student temp; int i,j;
fread();
for(i = 0 ; i <Stu.length - 1 ; i ++ )
for(j = 0 ; j < Stu.length - i -1 ; j ++)
if(Stu.elem[j].num > Stu.elem[j+1].num)
{
temp=Stu.elem[j];
Stu.elem[j]=Stu.elem[j+1];
Stu.elem[j+1] = temp;
}
show(stu);
//按学号排序
}
//排序-----按平均成绩排序
void BubbleSortbyAver(StudentList &Stu)
{
Student temp; int i,j;
fread();
for(i = 0 ; i <Stu.length - 1 ; i ++ )
for(j = 0 ; j < Stu.length - i -1 ; j ++)
if(Stu.elem[j].Aver < Stu.elem[j+1].Aver )
{
temp=Stu.elem[j];
Stu.elem[j]=Stu.elem[j+1];
Stu.elem[j+1] = temp;
}
show(stu);
//按平均成绩排序
}
//成绩修改——只修改一个学生的信息(对已经存在的成绩进行修改)
void ModifyGrade(StudentList &Stu)
{
int i,number,n=1; char a;
fread();
while(n)
{
printf("请输入学号:");
scanf("%d",&number);
for(i = 0 ; i < Stu.length ; i ++)
if(Stu.elem[i].num == number )
{
printf("------------该学生成绩如下-------------\n");
putchar('\n');
printf(" \t 语 文 英 语 数 学\n");
printf(" \t %3d %3d %3d\n",Stu.elem[i].chinese,Stu.elem[i].english,Stu.elem[i].math);
printf("是否进行修改(y / n) ?\n");
getchar();
a=getchar();
if(a == 'y')
{
printf("___________________请依次重新输入三科成绩!_______________\n");
printf("语 文 英 语 数 学\n");
scanf("%d%d%d",&Stu.elem[i].chinese,&Stu.elem[i].english,&Stu.elem[i].math);
fwrite();
n= 0;
}
else
{
printf("-----------选择不修改该学生信息,本程序退出---------\n");
return ;
}
break;
}
if(i == Stu.length)
{
printf("该学生不存在,是否继续修改其他学生的信息(0:终止 1:继续):");
scanf("%d",&n);
}
}
//输入学号
//查询该学号的学生是否存在
//存在,则
//输出1科成绩 //输出2科成绩 //输出3科成绩
//提示是否修改,若修改,则输入新的成绩
}
//学生基本信息修改—-不能修改学号信息(只修改一个学生的)
void ModifyBasicInfor(StudentList &Stu)
{
int i,number,n=1; char a;
fread();
while(n)
{
printf("请输入学号:");
scanf("%d",&number);
for(i = 0 ; i < Stu.length ; i ++)
if(Stu.elem[i].num == number )
{
printf("---------------该学生基本信息如下-------------\n");
putchar('\n');
printf(" \t姓 名 性 别 出 生 日 期\n");
printf(" \t %5s %5s %4d年%2d月%2d日\n",Stu.elem[i].name,Stu.elem[i].sex,Stu.elem[i].birthday.year,
Stu.elem[i].birthday.month,Stu.elem[i].birthday.day);
printf("是否进行修改(y / n) ?\n");
getchar();
a=getchar();
if(a == 'y')
{
printf("------------请重新输入该学生基本信息-------------\n");
printf(" \t 姓 名 性 别 出生日期\n");
scanf("%s%s%d%d%d",Stu.elem[i].name,Stu.elem[i].sex,&Stu.elem[i].birthday.year,
&Stu.elem[i].birthday.month,&Stu.elem[i].birthday.day);
fwrite();
n= 0;
}
else
{
printf("选择不修改该学生信息,本程序退出!\n");
return ;
}
break;
}
if(i == Stu.length)
{
printf("该学生不存在,是否继续修改其他学生的信息(0:终止 1:继续):");
scanf("%d",&n);
}
}
//输入学号
//查询该学号的学生是否存在
//存在,则
//输出学生信息,提示是否修改,若修改,则输入新的信息
}
void Welcome() //系统显示界面
{
system("cls");
system("color 6f");
printf("\n\t***************************************************************\n");
printf("\n\t\t 常春藤学生管理系统\n");
printf("\n\t copyright to IVY(Chang Chun Teng) Corporation Ltd.\n");
printf("\n\t***************************************************************\n");
}
int RLogin() //登陆函数
{
int i,j;
char username[20], password[20];
for( i = 1; i<=3; i++) //规定用户尝试的次数不超过3次
{
Welcome(); //显示欢迎界面
printf(" username:");
gets(username);
printf(" password:");
//gets(password);
for(j = 0 ; j < 100 ; j ++)
{
password[j]=getch();
if(password[j] == '\r') break; //回车结束
printf("*");
}
password[j]='\0';
if((strcmp(username, "user01")) || (strcmp(password, "1234567")))
{
if(3-i>0)
printf("用户名或密码错误,你还有 %d 次机会!\n", 3-i);
system("pause");
system("cls");
}
else
break;
}
if( i < 3)
return 1;
else
return 0;
}
void sortMenu() //排序菜单
{
printf("\n\t 常春藤学生成绩管理系统\n");
printf("\n\t\t 数 据 排 序\n\n");
printf(" ==============================================\n");
printf(" \t\t1 按 学 号 排 序\n\n");
printf(" \t\t2 按 语 文 成 绩 排 序\n\n");
printf(" \t\t3 按 数 学 成 绩 排 序\n\n");
printf(" \t\t4 按 英 语 成 绩 排 序\n\n");
printf(" \t\t5 按 总 成 绩 排 序\n\n");
printf(" \t\t6 按 平 均 成 绩 排 序\n\n");
printf(" \t\t0 返 回 上 级 菜 单\n\n");
printf(" ===========================================\n");
printf("\t请选择功能(0—6):");
}
void ModifyData() //修改菜单
{
printf("\n\t 常春藤学生成绩管理系统\n");
printf("\n\t\t 信 息 修 改\n\n");
printf(" ===========================================\n");
printf(" \t\t1 基本信息修改\n\n");
printf(" \t\t2 成 绩 修 改\n\n");
printf(" \t\t0 返回上级菜单\n\n");
printf(" ===========================================\n");
printf("\t请选择功能(0—2):");
}
//****************************用户函数定义结束*****************************
void main() //主程序
{
int flag1,flag2,choice,pchoice; //choice用于主菜单的选择, pchoice用于2个子菜单的选择
//定义学生变量,用于存放学生的信息
if( RLogin() )
{
system("CLS"); //清除屏幕显示信息
InitStudentList(stu); //初始化顺序表
while(1)
{
system("CLS");
flag1 = 1 ,flag2 =1;
MainMenu(); //显示操作界面
scanf("%d", &choice); //用户功能选择
switch(choice)
{
case 1: AddNewStudent(stu); system("pause"); system("CLS"); break; //调用相应的功能
case 2: DelStudent(stu); system("pause"); system("CLS"); break; //调用相应的功能
case 3: AddGrade(stu); system("pause"); system("CLS"); break; //调用相应的功能
case 4: SumGrade(stu); system("pause"); system("CLS"); break; //调用相应的功能
case 5:
{
while(flag1)
{
system("CLS"); //清除屏幕显示信息
SumGrade(stu);
sortMenu(); //显示2级菜单
scanf("%d", &pchoice); //用户功能选择
switch(pchoice)
{
case 1: BubbleSortbyNo(stu); system("pause");system("cls"); break; //功能1 //调用相应的功能
case 2: BubbleSortbyCh(stu); system("pause");system("CLS"); break;
case 3: BubbleSortbyMath(stu); system("pause");system("CLS"); break;
case 4: BubbleSortbyEn(stu); system("pause");system("CLS"); break;
case 5: BubbleSortbyTotal(stu);system("pause");system("CLS"); break;
case 6: BubbleSortbyAver(stu); system("pause");system("CLS"); break;
case 0: flag1 = 0 ; break;//调用相应的功能
//..... //其他功能依次在此增加
}
}
break;
}
case 6:
{
while(flag2 )
{
system("CLS"); //清除屏幕显示信息
ModifyData(); //显示2级菜单
scanf("%d", &pchoice); //用户功能选择
switch(pchoice)
{
case 1: ModifyBasicInfor(stu); system("pause"); system("CLS"); break; //调用相应的功能
case 2: ModifyGrade(stu); system("pause"); system("CLS"); break;
case 0: flag2= 0; break; //调用相应的功能
//..... //其他功能依次在此增加
default:
{
system("CLS");
printf("输入有错误请重新输入:\n");
}
}
}
break;
}
case 7: show(stu); system("pause"); system("CLS"); break;
//如果有其它功能,继续在这里添加
case 0:
{ system("CLS");
printf("\n\n 谢谢使用常春藤学生管理系统!\n");
exit(0);
}
default:
{
system("CLS");
printf("输入有错误请重新输入:\n");
}
}
}
}
else
{
printf("long in failure!\n");
printf("please contact with administrator!\n");
}
}