/*程序名称:学生成绩管理系统*/
/*程序设计者:致远          */
/*设计时间:2013-3-15       */


/**************************************************************************************************/
#include <stdio.h>
#include <string.h>
#define N  150
int temp;
struct student
{
    char num[15];
    char name[20];
    int score[3];
    float av;
}stu[N];




/**************************************************************************************************/
save(int n)   
{
    FILE *p;
    int i;
    p=fopen("stud","wb");
    for (i=0;i<n;i++)
        fwrite(&stu[i],sizeof(struct student),1,p);
    fclose(p);
    return (n);
}




/**************************************************************************************************/
count()
{
    FILE *p;
    int i;
    p=fopen("stud","rb");
    for(i=0;!feof(p);i++)
        fread(&stu[i],sizeof(struct student),1,p);
    fclose(p);
    return(i-1);
}




/**************************************************************************************************/
void average(int n)
{
    int i,j,sum;
    for(i=0;i<n;i++)
    {
        sum=0;
        for(j=0;j<3;j++)
            sum+=stu[i] .score[j];
        stu[i].av=sum/3.0;
    }
}



/**************************************************************************************************/
void creat()
{
    int i,j,n;
    if(temp!=0)
    {printf("\n亲! 已录入学生的记录,是否要添加记录?\n\t是,请选择“2”!\n\n");}
    else
    {
        printf("请输入首次录入的数量:");
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            printf("\n请输入第%d个学生数据:\n",i+1);
            printf("学号:");
            scanf("%s",&stu[i] .num );
            printf("姓名:");
            scanf("%s",&stu[i] .name );
            for(j=0;j<3;j++)
            {
                printf("成绩%d:",j+1);
                scanf("%d",&stu[i].score[j]);
            }            
        }
    average (n);
    save (n);
	temp=1;
    }
}



/**************************************************************************************************/
void add()
{
    int i,j,n,k,sum=0;
n=count();
printf("请输入添加记录的个数:");
scanf("%d",&k);
for(i=0;i<k;i++)
    {
        printf("\n请输入需添加的第%d个学生数据:\n",i+1);
        printf("学号:");
        scanf("%s",&stu[n+i].num );
        printf("姓名:");
        scanf("%s",&stu[n+i].name );
        for(j=0;j<3;j++)
        {
            printf("成绩%d:",j+1);
            scanf("%d",&stu[n+i].score[j]);
            sum+=stu[n+i].score[j];            
        }
    stu[n+i].av =sum/3.0;
    sum=0;
    }
    save (n+k);
}



/**************************************************************************************************/
void modify()
{
    int i,j,n,k=-1;
    struct student s;
    n=count();
    printf("请输入要修改学生的学号:");
    scanf("%s",&s .num);
    for(i=0;i<n;i++)
        if(strcmp(s .num,stu[i].num)==0)
        {k=i;break;}
        if(k==-1) printf("该学号不存在\n");
        else
        {
            printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");
            printf("%s\t%s\t",stu[k].num,stu[k].name);
            for(j=0;j<3;j++)
                printf("%d\t",stu[k].score[j]);
            printf("%.2f\n",stu[k].av );
            printf("\n");
            printf("\n请重新输入该学生数据:\n");
            printf("学号:");
            scanf("%s",&stu[k].num);
            printf("姓名:");
            scanf("%s",&stu[k].name);
            for(j=0;j<3;j++)
            {
                printf("成绩%d:",j+1);
                scanf("%d",&stu[k].score[j]);
            }
            stu[k].av =(stu[k].score[0]+stu[k].score[1]+stu[k].score[2])/3.0;
        }
        save(n);
}



/**************************************************************************************************/
void del()
{
    int i,j,k,n;
    struct student s;
    n=count( );
	if(n==0) {temp=0;printf("\n\t还没学生记录不能执行删除操作!\n\t选择“1”录入学生记录\n\n");}
	else
	{
		printf("\n\n--------------学生信息表--------------\n\n");
		printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");
		for(i=0;i<n;i++)
		{
			printf("%s\t%s\t",stu[i].num ,stu[i].name);
			for(j=0;j<3;j++)
				printf("%d\t",stu[i].score[j]);
			printf("%.2f\n",stu[i].av);
			printf("\n");
		}
    printf("请输入要删除的学生的学号:");
    scanf("%s",&s.num);
    for(i=0;i<n;i++) 
        if(strcmpi(s.num,stu[i].num)==0)
        {k=i;break;}
    if(k==-1) printf("数据不存在\n");
    else
		{
			printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");
			printf("%s\t%s\t",stu[k].num ,stu[k].name );
			for(j=0;j<3;j++)
				printf("%d\t",stu[k].score [j]);
			printf("%.2f\n",stu[k].av);
			printf("\n");
			for(i=k;i<n-1;i++)
				stu[i]=stu[i+1];
			n=n-1;
			save(n);
			if(count()==0) temp=0;
		}
	}
}



/**************************************************************************************************/
void show()
{
    int i,j,n;
    n=count();
    if(n==0) printf("\n\t还没学生记录\n\t选择“1”录入学生记录\n\n");
    else
    {
        printf("\n\n----------------------学生信息表---------------------\n\n");
        printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");
        for(i=0;i<n;i++)
            {
                printf("%s\t%s\t",stu[i].num ,stu[i].name );
                for(j=0;j<3;j++)
                printf("%d\t",stu[i].score[j]);
            printf("%.2f\n",stu[i].av);
            //printf("\n");
            }
    }
}



/**************************************************************************************************/
void search()
{
    int i,j,n,k=-1;
    struct student s;
    n=count();
    printf("请输入要查找的学生的学号:");
    scanf("%s",&s.num);
    for(i=0;i<n;i++)
        if(strcmpi(s.num,stu[i].num)==0)
        {k=i;break;}
        if(k==-1) printf("数据不存在\n");
        else
        {
            printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");
            printf("%s\t%s\t",stu[k].num ,stu[k].name );
            for(j=0;j<3;j++)
                printf("%d\t",stu[k].score[j]);
            printf("%.2f\n",stu[k].av);
            //printf("\n");
        }
}



/**************************************************************************************************/
void sort()
{
    int i,j,n;
    struct student temp;
    n=count();
    for(i=0;i<n-1;i++)
        for(j=i+1;j<n;j++)
            if(stu[i].av <stu[j].av)
            {
                temp=stu[i];
                stu[i]=stu[j];
                stu[j]=temp;
            }
        printf("-------------------学生信息表--------------------\n");
        printf("学号\t姓名\t成绩1\t成绩2\t成绩3\t平均成绩\n");
        for(i=0;i<n;i++)
        {
            printf("%s\t%s\t",stu[i].num ,stu[i].name);
            for(j=0;j<3;j++)
                printf("%d\t",stu[i].score[j]);
            printf("%.2f\n",stu[i].av);
        }
        //printf("\n\n");        
}



/**************************************************************************************************/
void showmenu()
{
    printf("            学生成绩管理系统            \n");
    printf("========================================\n");
    printf("               1.录入信息               \n");
    printf("               2.添加记录               \n");
    printf("               3.修改记录               \n");
    printf("               4.删除记录               \n");
    printf("               5.显示记录               \n");
    printf("               6.查找记录               \n");
    printf("               7.成绩排序               \n");
    printf("               0.退出系统               \n");
    printf("========================================\n");
    printf("\n请输入您的选择(0-7):");}




/**************************************************************************************************/
int main ()
{
    int choice,temp=0;
    showmenu();
    scanf("%d",&choice);
    while (choice!=0)
    {
        switch(choice)
        {
            case 1:creat();temp=count();printf("———————————————————\n");break;
            case 2:add();printf("———————————————————————\n");break;
            case 3:modify();printf("————————————————————————\n");break;
            case 4:del();printf("————————————————————————\n");break;
            case 5:show();printf("————————————————————————\n");break;
            case 6:search();printf("————————————————————————\n");break;
            case 7:sort();printf("—————————————————————————\n");break;
        }
        showmenu();
        scanf("%d",&choice);
    }
return 0;
}