/********************************************************************************
* @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;
}在这里插入代码片