📄 student.txt
字号:
#ifndef H_STUDENT_HH
#define H_STUDENT_HH
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define INITIAL_SIZE 100 //数组初始大小
#define INCR_SIZE 50 //数组每次增加的大小
#define NUM_SUBJECT 5 //科目数
struct student_info
{
char number[15]; //学号
char name[20]; //姓名
char gender[4]; //性别
float score[NUM_SUBJECT]; //分别为该学生5门课的成绩
float sum; //总分
float average; //平均分
int index; //名次
};
typedef struct student_info StuInfo;
extern int numStus; //记录的学生数
extern StuInfo* records; //记录学生信息的数组
extern char savedTag; //信息是否已保存的标志,0为已保存,1为未保存
extern int arraySize; //数组大小
extern char* subject[];
void handle_menu(void);
int menu_select(void);
void addRecord(void);
void modifyRecord(void);
void display();
void queryInfo(void);
void removeRecord(void);
void sortInfo(void);
int saveRecords(void);
int loadRecords(void);
void newRecords(void);
void quit();
void showTable(void);
int findRecord(char *target,int targetType,int from);
int getIndex(float sum);
void copyRecord(StuInfo* src,StuInfo* dest);
#endif // H_STUDENT_HH
//初始化
int numStus=0; //记录的学生数
StuInfo *records=NULL; //记录学生信息的数组
char savedTag=0; //信息是否已保存的标志,0为已保存,1为未保存
int arraySize; //数组大小
char* subject[]={"数学","英语","政治","物理","化学"};
//主函数
void main()
{
//初始化数组
records=(StuInfo*)malloc(sizeof(StuInfo)*INITIAL_SIZE);
if(records==NULL)
{
printf("memory fail!");
exit(-1);
}
arraySize=INITIAL_SIZE;
printf("\n");
printf("\t******************************\n");
printf("\t* 这是一个 *\n");
printf("\t* 学生成绩管理程序 *\n");
printf("\t* 可以对学生成绩进行管理 *\n");
printf("\t* 欢迎使用管理程序 *\n");
printf("\t******************************\n");
printf("\n");
handle_menu();
}
//菜单处理函数
void handle_menu(void)
{
for( ; ; )
{
switch(menu_select())
{
case 0:
addRecord();
break;
case 1:
modifyRecord();
break;
case 2:
display();
break;
case 3:
queryInfo();
break;
case 4:
removeRecord();
break;
case 5:
sortInfo();
break;
case 6:
saveRecords();
break;
case 7:
loadRecords();
break;
case 8:
newRecords();
break;
case 9:
quit();
}
}
}
//
int menu_select()
{
char s[2];
int cn=0;
printf("\n");
printf("\t0.增加学生信息\n");
printf("\t1.修改学生信息\n");
printf("\t2.显示学生信息\n");
printf("\t3.查询学生信息\n");
printf("\t4.删除学生信息\n");
printf("\t5.对学生信息进行排序\n");
printf("\t6.保存学生信息至记录文件\n");
printf("\t7.从记录文件读取学生信息\n");
printf("\t8.新建学生信息文件\n");
printf("\t9.结束运行\n");
printf("\n\t左边数字对应功能选择,请选0-9:");
for( ; ; )
{
gets(s);
cn=atoi(s);
//处理键入的非数字键,过滤出数字0
if(cn==0&&(strcmp(s,"0")!=0))
cn=11;
if(cn<0||cn>9)
printf("\n\t,0-9:");
else
break;
}
return cn;
}
//新建学生信息记录
//结果:若原来信息没有保存,则保存原来的信息,然后重新输入信息记录
void newRecords(void)
{
char str[5];
if(numStus!=0)
{
if(savedTag==1)
{
printf("现在已经有记录,选择处理已有记录的方法\n");
printf("是否保存原来的记录?(Y/n)");
gets(str);
if(str[0]!='n' &&str[0]!='N')
saveRecords();
}
}
numStus=0;
addRecord();
}
//结束运行,退出
//参数 void
void quit(void)
{
char str[5];
if(savedTag==1)
{
printf("是否保存原来的记录?(Y/n)");
gets(str);
if(str[0]!='n'&&str[0]!='N')
saveRecords();
}
free(records);
exit(0);
}
//打印表头
void showTable(void)
{
int j;
printf("学号\t姓名\t性别");
for(j=0;j<NUM_SUBJECT;j++)
printf("\t%s",subject[j]);
printf("\t总分\t平均分\t名次\n");
}
//显示所有的学生信息
void display(void)
{
int i,j;
if(numStus==0)
{
printf("没有可供显示的记录!");
return;
}
showTable();
for(i=0;i<numStus;i++)
{
//打印学生信息
printf("%s\t%s\t%s",records[i].number,records[i].name,records[i].gender);
for(j=0;j<NUM_SUBJECT;j++)
printf("\t%.1f",records[i].score[j]);
printf("\t%.1f\t%.1f\t%d\n",records[i].sum,records[i].average,records[i].index);
//打印满20个记录后停下来
if(i%20==0 && i!=0)
{
printf("...\n");
getch();
printf("\n\n");
showTable();
}
}
}
//在当前表的末尾增加新的信息
//结果---records中将记录新的信息
//如果数组大小不够,会重新申请数组空间
void addRecord(void)
{
char str[10];
int j;
float mark,sum;
if(numStus==0)
printf("原来没有记录,现在建立新表\n");
else
printf("下面在当前表的末尾增加新的信息\n");
while(1)
{
printf("您将要添加一组信息,确定吗?(Y/n)");
gets(str);
if(str[0]=='n'||str[0]=='N') //不再添加新的信息
break;
if(numStus>=arraySize) //数组空间不足,需要重新申请空间
{
records=(StuInfo *)realloc(records,(arraySize+INCR_SIZE)*sizeof(StuInfo));
if(records==NULL)
{
printf("memory fail!");
exit(-1);
}
arraySize=arraySize+INCR_SIZE;
}
printf("请输入学号:");
gets(records[numStus].number);
printf("请输入姓名:");
gets(records[numStus].name);
printf("请输入性别(0为女,1为男):");
gets(str);
if(str[0]=='0')
strcpy(records[numStus].gender,"女");
else
strcpy(records[numStus].gender,"男");
sum=0;
for(j=0;j<NUM_SUBJECT;j++)
{
printf("请输入%s成绩:",subject[j]);
gets(str);
mark=(float)atof(str);
records[numStus].score[j]=mark;
sum+=mark;
}
records[numStus].sum=sum;
records[numStus].average=sum/NUM_SUBJECT;
records[numStus].index=getIndex(sum);
numStus++;
}
printf("现在一共有%d条信息\n",numStus);
savedTag=1;
}
//找出总分为sum在第0至numStus-1个记录中按升序排序的位置
//参数 : sum欲找出其位置的总分
//返回 : sum在第0至numStus-1个记录中按升序排序的位置
//结果 : 第0至numStus-1个记录中名次一项也会以需要相应改变
int getIndex(float sum)
{
int i;
int count=0; //总分大于sum的人数
for(i=0;i<numStus;i++)
{
if(records[i].sum<sum)
{
records[i].index++; //总分小于sum的记录名次增1
}
else if(records[i].sum>sum)
{
count++;
}
}
return count+1;
}
//文件存储操作函数
//结果 数组records被保存至指定文件
//返回 成功0,失败-1
int saveRecords()
{
FILE *fp;
char fname[30];
if(numStus==0)
{
printf("没有记录可存!");
return -1;
}
printf("请输入要存入的文件名(直接回车选择文件stu_info):");
gets(fname);
if(strlen(fname)==0)
strcpy(fname,"stu_info");
if((fp=fopen(fname,"wb"))==NULL)
{
printf("不能存入文件!\n");
return -1;
}
printf("\n存文件...\n");
fwrite(records,sizeof(StuInfo)*numStus,1,fp);
fclose(fp);
printf("%d条记录已经存入文件,请继续操作\n",numStus);
savedTag=0; //更新是否已保存的标记
return 0;
}
//文件读取操作函数
//结果 records将为从指定文件中读取出的记录
//返回 成功0 失败-1
int loadRecords(void)
{
FILE *fp;
char fname[30];
char str[5];
if(numStus!=0&&savedTag==0)
{
printf("请选择您是要覆盖现有记录(Y),还是要将");
printf("读取的记录添加到现有记录之后(n)?\n");
printf("直接回车则覆盖现有记录\n");
gets(str);
if(str[0]=='n'||str[0]=='N')
{
//将读取的记录添加到现有记录之后
savedTag=1;
}
else
{
if(savedTag==1)
{
//覆盖现有记录
printf("读取文件将会更改原来的记录");
printf("是否保存原来的记录?(Y/n)");
gets(str);
if(str[0]!='n'&&str[0]!='N')
saveRecords();
}
numStus=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -