⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 student.txt

📁 应用c语言写的学生成绩管理系统
💻 TXT
📖 第 1 页 / 共 2 页
字号:
#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 + -