/********************************************************************************
* @File name: main.c
* @Description: 用于详细说明此程序文件完成的主要功能
* @ Function List: struct Student                 //构造学生结构体
                   void welcomePage( )           //欢迎页面的初始化
                   void getxy(int x, int y)     //从控制台移动光标
                   void creatInterface( )       //创建旁功能菜单说明
                   void tianjia()              //添加新的学生
                   void xianshi()              //显示所有的学生数据
                   void shanchu()             //删除(以学号)
                   void xiugai_number()       //用学号修改学生数据
				   void xiugai_name()        //用姓名修改学生数据 
                   void chaxun()             //查询数据(以学号)
                   void chaxun_name()       //查询数据(以姓名)
                   void paixu()             //排序从高到低,运用了选择排序
* @Author: 王成军
* @Version: 1.1
* @Date: 2019-12-23
* @History: 修改历史记录列表,应包括修改日期、修改者及修改内容简述(可有可无)。
********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<Windows.h>
#include <graphics.h>
#include<time.h>
#include<conio.h>

#define mapheigt 26     
#define mapwidth  75  

/*******************************************************
*
* struct student
* Description   :定义学生结构体,定义学生结构体,和相关变量
* Parameter     :文件读写操作说明
*fd = fopen("1.txt","r");尝试打开同目录下的1.txt文件,参数"r"代表以只读方式打开。
*fread(&std[i],sizeof(struct Student),1,fd) == 1 从文件指针fd读取一个size为sizeof(struct student)的数据,存入std[i]
*fwrite(&std[j],sizeof(struct Student),1,fd); 将&stud[i]这个指针所指向的内容输出到fp这个文件中,每次输出的数据单元占sizeof(struct student_)个字节,总共输出1次
*fclose(fd);  关闭fd指向的文件
**********************************************************/
struct Student                 //定义学生结构体
{
    int id;                   //学号
    char name[60];            //姓名
	char clas[60];            //班级
	int math;                 //高数成绩
	int chinese;              //语文成绩
	int english;              //英语成绩
	int wuli;                 //物理成绩
    float s;;
}std[100];

/*******************************************************
*
* Function name : getxy()
* Description   : 函数功能描述
* Parameter         :int x,int y
*        @x         表示光标的x坐标值
*        @y         表示光标的y坐标值 
*       
* Return          :无
*COORD是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标。
其定义为:
typedef struct _COORD {
SHORT X; // horizontal coordinate
SHORT Y; // vertical coordinate
} COORD;
**********************************************************/
void getxy(int x,int y)
{
	COORD get;
	get.X=x;
	get.Y=y;
    GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), get);
}
/*******************************************************
*
* Function name :set_color(int x) 
* Description   : 修改颜色
* Parameter     :      
*        @STD_OUTPUT_HANDLE     标准输出的句柄     
* Return        :无
SetConsoleTextAttribute是一个可以在API(应用程序编程接口)中设置控制台窗口字体颜色和背景色的计算机函数
该函数被广泛应用于电脑编程与软件开发中。
**********************************************************/
void set_color(int x)
{
    HANDLE winHandle;
    winHandle = GetStdHandle((STD_OUTPUT_HANDLE)) ;//用来修改命令行窗口的颜色
    SetConsoleTextAttribute(winHandle,x) ;
}

/*******************************************************
*
* Function name :welcomePage( ) 
* Description   :学生管理系统的进入菜单
* Parameter     :
*        @ 无   用getxy()获取要操作的位置
*        @ 无   printf完成打印工作
* Return        :无
**********************************************************/
void welcomePage( )
{   
	getxy(20,1);
	printf("******************************************************************************\n");
    getxy(45,2);
    printf("****大学学生管理系统");
	set_color(1);
    getxy(25, 5);
    printf("本系统有如下几项功能");
	set_color(2);
    getxy(25, 7);
    printf("1. 添加学生信息");
	set_color(3);
    getxy(25, 9);
    printf("2. 删除学生信息");
	set_color(11);
    getxy(25, 11);
    printf("3.查询学生信息");
	set_color(4);
    getxy(25, 13);
    printf("4.显示系统所有学生信息");
	set_color(4);
    getxy(25, 15);
    printf("5.排序(按照总成绩由高到低)");
	set_color(10);
	getxy(20,20);
	printf("*****************************************************************************\n");
    getxy(30, 23);
    printf("Press any key to continue...");
    getxy(0, 28);                                          
    getchar();
    system("cls");     //system("CLS") 是在C语言程序中,调用系统命令cls完成清屏操作。                 
}

/*******************************************************
*
* Function name :creatInterface()
* Description   : 绘制游戏旁菜单
* Parameter     :
*        @ str_title        游戏标题 
*        @ title_pos        光标起始位置
* Return        :无
**********************************************************/
void creatInterface( )
{
  
	getxy(78, 2);
    printf("请输入选项进入功能:");
	set_color(1);
    getxy(78, 4);
    printf("1.添加学生\n");
	set_color(3);
    getxy(78, 6);
    printf("2.删除学生");
	set_color(3);
    getxy(78,8);
    printf("3.用学号修改学生信息");
	set_color(4);
    getxy(78,10);
    printf("4.用姓名修改学生信息\n");
	set_color(12);
    getxy(78,12);
    printf("5.用学号查询学生信息\n");
    getxy(78,14);
    printf("6.用姓名查询学生信息\n");
	set_color(15);
    getxy(78,16);
   printf("7.显示同一班级学生信息\n");
   	set_color(3);
    getxy(78, 18);
    printf("8.显示所有学生的信息\n");
	set_color(11);
	getxy(78, 20);
    printf("9.排序(按照成绩由高到低)\n");
    set_color(10);
    getxy(78, 22);
 printf("10.退出系统\n");
	set_color(12);
   getxy(78, 24);
 printf("@王成军\n");
	set_color(15);
	getxy(1,1);               //修改光标位置,方便操作
}


/*******************************************************
*
* Function name :tianjia() 
* Description   : 添加新的学生
* Parameter     :
*        @ fd      定义一个文件指针
*        @ 无
* Return        :无
**********************************************************/
void tianjia() 
{
    FILE *fd;
    fd = fopen("1.txt","a+");                   //打开一个名为1的文件
    printf("请输入学生学号:\n");
    scanf("%d",&std[0].id);
    printf("请输入学生姓名:\n");
    scanf("%s",std[0].name);
    printf("请输入学生的班级:\n");
    scanf("%s",std[0].clas);
    printf("请输入学生的高数成绩:\n");
    scanf("%d",&std[0].math);
    printf("请输入学生的语文成绩:\n");
    scanf("%d",&std[0].chinese);
	printf("请输入学生的英语成绩:\n");
    scanf("%d",&std[0].english);
    printf("请输入学生的物理成绩:\n");
    scanf("%d",&std[0].wuli);                         //初始化文件内容的写法,写第一个学生
    fwrite(&std[0],sizeof(struct Student),1,fd);      //将&stud[i]这个指针所指向的内容输出到fp这个文件中,每次输出的数据单元占sizeof(struct student_type)个字节,总共输出1次
    fclose(fd);                                       //释放文件指针和有关的缓冲区
    printf("添加成功!\n");

}
/*******************************************************
*
* Function name :xianshi()   
* Description   : 显示所有的学生数据
* Parameter     :fd,i
*        @ fd      定义一个文件指针
*        @ i       用于循环体显示学生的信息
* Return        :无
**********************************************************/
void xianshi()  
{
    FILE *fd;
    int i ;
    fd = fopen("1.txt","r");
    for(i = 0; fread(&std[i],sizeof(struct Student),1,fd) == 1;i++)
    {
        printf("学号:%d\n",std[i].id);
        printf("姓名:%s\n",std[i].name);
        printf("班级: %s\n",std[i].clas);
		printf("高数: %d\n",std[i].math);
        printf("语文: %d\n",std[i].chinese);
		printf("英语: %d\n",std[i].english);
		printf("物理: %d\n",std[i].wuli);
        printf("*******************************\n");
    }
    fclose(fd);
}

/*******************************************************
*
* Function name :shanchu() 
* Description   ://删除学生(以学号)
* Parameter     :fd,id,a,i,j
*        @fd      文件指针
*        @id      从键盘上获取要查询学生的学号
*        @i       用于循环体查询学生的学号
*        @a       标记要删除的学生
*        @j       用于重写不需删除学生的信息
* Return        :无
**********************************************************/
void shanchu() 
{
    FILE *fd;
    int id;
    int i,a,j;
    fd = fopen("1.txt","r");            //尝试打开同目录下的1.txt文件,参数"r"代表以只读方式打开。
    printf("请输入要删除学生的学号:\n");
    scanf("%d",&id);
    for(i =0;fread(&std[i],sizeof(struct Student),1,fd) == 1;i++)
    {
        if(std[i].id == id)           //找到要删除学生的信息
            {

                printf("删除成功!\n");
                printf("删除的学生为:%s\n",std[i].name);
                a = i;               //将他的坐标赋值给a

            }
    }
    fclose(fd);
    fd = fopen("1.txt","w");       //尝试打开同目录下的1.txt文件,参数"w"代表以只写方式打开
    for(j=0;j<i;j++)              //重写一次文件,跳过坐标为a的学生
    {
         if(j!=a)
         fwrite(&std[j],sizeof(struct Student),1,fd);
    }
    fclose(fd);
}
/*******************************************************
*
* Function name :xiugai_number() 
* Description   : 用学号修改学生数据
* Parameter     :
*        @ id   待修改的学生的学号
*        @ i    用于循环查找学生的信息
*        @j     用于重写学生的信息
* Return        :无
**********************************************************/
void xiugai_number() 
{
    FILE *fd;
    int id;
    int n=-1;
    int i,j;
    fd = fopen("1.txt","r");
    printf("请输入要修改学生的学号:\n");
    scanf("%d",&id);
   for( i = 0;fread(&std[i],sizeof(struct Student),1,fd) == 1;i++)
    {
       if(std[i].id == id)
       {
            printf("要修改的学生资料如下:\n");
            printf("学号:%d\n",std[i].id);
            printf("姓名:%s\n",std[i].name);
			printf("班级: %s\n",std[i].clas);
	      	printf("高数: %d\n",std[i].math);
            printf("语文: %d\n",std[i].chinese);
	    	printf("英语: %d\n",std[i].english);
	    	printf("物理: %d\n",std[i].wuli);
            n = i;
       }
   }
    if(n==-1)               //返回值为-1,表示没找到所查询的学生
    {
        printf("改学生不存在,请重新选择功能!\n");
        return;
    }
   fclose(fd);


    printf("请输入新的学号:\n");        //重新输入修改后学生的信息
    scanf("%d",&std[n].id);
    printf("请输入新的姓名:\n");
    scanf("%s",&std[n].name);
    printf("输入输入新的班级\n");
    scanf("%s",&std[n].clas);
    printf("输入新的高数成绩\n");
	scanf("%d",&std[n].math);
    printf("输入新的语文成绩\n"); 
    scanf("%d",&std[n].chinese);
	printf("输入新的英语成绩\n"); 
    scanf("%d",&std[n].english);
    printf("输入新的物理成绩\n");
    scanf("%d",&std[n].wuli);

    fd = fopen("1.txt","w");           //写入修改后的信息
    for(j=0;j<i;j++)
    fwrite(&std[j],sizeof(struct Student),1,fd);
    fclose(fd);

    printf("修改后改的资料为:\n");   //展示输入修改后学生的信息
    printf("学号:%d\n",std[n].id);
    printf("姓名:%s\n",std[n].name);
    printf("班级: %s\n",std[n].clas);
	printf("高数: %d\n",std[n].math);
    printf("语文: %d\n",std[n].chinese);
	printf("英语: %d\n",std[n].english);
	printf("物理: %d\n",std[n].wuli);

}

/*******************************************************
*
* Function name :xiugai_name() 
* Description   : 用学生的姓名修改
* Parameter     :
*        @d[10]    用于存储输入学生的姓名  
*        @n=-1     处理所查学生不存在时的情况
*        @j        用于重写学生的信息
* Return        :无
**********************************************************/
 void xiugai_name()
{
    FILE*fd;
	char d[10];
    int n=-1;
    int j;
    fd = fopen("1.txt","r");
    printf("请输入要修改学生的姓名:\n");
    scanf("%s",d);
    for(int i =0;fread(&std[i],sizeof(struct Student),1,fd) ==1;i++)
    {
        if(strcmp(d,std[i].name)==0)         //strcmp比较字符串,用于查找输入的姓名
        {
		    printf("要修改的学生资料如下:\n");
            printf("姓名为%s的学生资料为:\n",d);
            printf("学号:%d\n",std[i].id);
            printf("姓名:%s\n",std[i].name);
           	printf("班级: %s\n",std[i].clas);
	      	printf("高数: %d\n",std[i].math);
            printf("语文: %d\n",std[i].chinese);
	    	printf("英语: %d\n",std[i].english);
	    	printf("物理: %d\n",std[i].wuli);
			n=i;
        }
    }

  if(n==-1)
    {
        printf("改学生不存在,请重新选择功能!\n");
        return;
    }
   fclose(fd);

   printf("请输入新的学号:\n");
    scanf("%d",&std[n].id);
    printf("请输入新的姓名:\n");
    scanf("%s",&std[n].name);
    printf("输入输入新的班级\n");
    scanf("%s",&std[n].clas);
    printf("输入新的高数成绩\n");
	scanf("%d",&std[n].math);
    printf("输入新的语文成绩\n"); 
    scanf("%d",&std[n].chinese);
	printf("输入新的英语成绩\n"); 
    scanf("%d",&std[n].english);
    printf("输入新的物理成绩\n");
    scanf("%d",&std[n].wuli);
    fd = fopen("1.txt","w");
    for(j=0;j<i;j++)
    fwrite(&std[j],sizeof(struct Student),1,fd);
    fclose(fd);


    printf("修改后改的资料为:\n");
    printf("学号:%d\n",std[n].id);
    printf("姓名:%s\n",std[n].name);
    printf("班级: %s\n",std[n].clas);
	printf("高数: %d\n",std[n].math);
    printf("语文: %d\n",std[n].chinese);
	printf("英语: %d\n",std[n].english);
	printf("物理: %d\n",std[n].wuli);


}  

/*******************************************************
*
* Function name :chaxun() 
* Description   :查询学生的信息(以学号)
* Parameter     :
*        @ id   待查询的学生的学号
*        @ 无
* Return        :无
**********************************************************/
void chaxun() 
{
    FILE*fd;
    int id;
    fd = fopen("1.txt","r");
    printf("请输入要查询学生的学号:\n");
    scanf("%d",&id);
    for(int i =0;fread(&std[i],sizeof(struct Student),1,fd) ==1;i++)
    {
        if(std[i].id == id)
        {
            printf("学号为%d的学生资料为:\n",id);
            printf("学号:%d\n",std[i].id);
            printf("姓名:%s\n",std[i].name);
           	printf("班级: %s\n",std[i].clas);
	      	printf("高数: %d\n",std[i].math);
            printf("语文: %d\n",std[i].chinese);
	    	printf("英语: %d\n",std[i].english);
	    	printf("物理: %d\n",std[i].wuli);
        }
    }
    fclose(fd);
}



/*******************************************************
*
* Function name :chaxun() 
* Description   :查询学生的信息(以姓名)
* Parameter     :
*        @d[10]   待查询的学生的姓名
*        @ 无
* Return        :无
**********************************************************/
void chaxun_name()
{
   FILE*fd;
    char d[10];
    fd = fopen("1.txt","r");
    printf("请输入要查询学生的姓名:\n");
    scanf("%s",d);
    for(int i =0;fread(&std[i],sizeof(struct Student),1,fd) ==1;i++)
    {
        if(strcmp(d,std[i].name)==0)
        {
            printf("姓名为%s的学生资料为:\n",d);
            printf("学号:%d\n",std[i].id);
            printf("姓名:%s\n",std[i].name);
           	printf("班级: %s\n",std[i].clas);
	      	printf("高数: %d\n",std[i].math);
            printf("语文: %d\n",std[i].chinese);
	    	printf("英语: %d\n",std[i].english);
	    	printf("物理: %d\n",std[i].wuli);
        }
    }
    fclose(fd);
}

/*******************************************************
*
* Function name :chaxun() 
* Description   :查询同一班级学生的信息
* Parameter     :
*        @d[10]   待查询的班级
*        @ 无
* Return        :无
**********************************************************/
void chaxun_clas()
{
   FILE*fd;
    char d[10];
    fd = fopen("1.txt","r");
    printf("请输入要查询班级:\n");
    scanf("%s",d);
    for(int i =0;fread(&std[i],sizeof(struct Student),1,fd) ==1;i++)
    {
        if(strcmp(d,std[i].clas)==0)
        {
            printf("班级为%s的学生资料为:\n",d);
            printf("学号:%d\n",std[i].id);
            printf("姓名:%s\n",std[i].name);
           	printf("班级: %s\n",std[i].clas);
	      	printf("高数: %d\n",std[i].math);
            printf("语文: %d\n",std[i].chinese);
	    	printf("英语: %d\n",std[i].english);
	    	printf("物理: %d\n",std[i].wuli);
        }
    }
    fclose(fd);
}

/*******************************************************
*
* Function name :paixu()
* Description   :按学生所有科目的平均成绩,进行排序
* Parameter     :i,j,k
*        @i       遍历查找所有的学生 
*        @j       用于循环,选择排序
*        @k       比较大小,交换坐标
* Return        :无
**********************************************************/
void paixu()//排序从高到低,运用了选择排序
{
    FILE *fd;
    int i,j,k;
    struct Student t;
    fd = fopen("1.txt","r");
    for(i = 0;fread(&std[i],sizeof(struct Student),1,fd) ==1;i++);
    
     for(j=0;j<i-1;j++)
        for(k=j+1;k<i;k++)
    {
        if((std[j].math+std[j].english+std[j].wuli+std[j].chinese)<(std[k].math+std[k].english+std[k].wuli+std[k].chinese)) 
        {
            t = std[j];
            std[j] = std[k];
            std[k] = t;
        }
    }
    fclose(fd);
    fd = fopen("1.txt","w");
    for(j=0;j<i;j++)
    fwrite(&std[j],sizeof(struct Student),1,fd);
    fclose(fd);
    printf("排序成功\n");
	xianshi();

}

/*******************************************************
*
* Function name :main()
* Description   : 驱动整个程序
* Parameter     :n
*        @n     选择相应的操作         
*        @无        
* Return        :0
**********************************************************/
int main()
{
    int n;
    welcomePage( );
    creatInterface( );
    while(1)
    {
        scanf("%d",&n);
        switch(n)
        {
        case 1:
         tianjia();
            break;
        case 2:
            shanchu();
            break;
        case 3:
		    xiugai_number(); 
            break;
        case 4:
            xiugai_name();
			break;
        case 5:
            chaxun();
            break;
        case 6:
            chaxun_name();
            break;
        case 7:
			chaxun_clas();
            break;
        case 8:
			xianshi();
		case 9:
          paixu();
		case 10:
			exit(-1);
            break;
        default:
            printf("输入错误!\n");
        }
        printf("*******************************\n\n\n");
    }
    return 0;
}在这里插入代码片