学生管理系统(文件存储并生成索引文件)

编写的是一个学生管理系统,未使用链表存储。直接将数据写入文件。
索引文件作用:将输入的学生信息按照成绩降序排序,将排好的序号存入一个文件中,当需要按照成绩输出学生信息时,读出索引文件中的序号作为学生数组的下标,直接输出该下标所对应的学生信息。
头文件及数据类型定义部分:定义的char *Menu[]为界面内容,目的是为当界面功能有所变化时,对界面能够方便快捷的改动。

#include
#include
#include
#include
#include

#define COLS 80

typedef struct Dex {
	int orderid;//序号
	char indexid[11];//学号
}Dex;

typedef struct Stu {
	int sign;//是否需要删除的标志
	/*
		该标志为逻辑删除标志。当学生信息存在时,该标志为1,当需要删除一学生信息时,先不进行物理删除(物理删除即从文件中真正删除该学生信息),应根据删除条件找到需要删除的学生信息,将该标志该为0。之后的操作(增删改查,打印学生信息)照常进行,当遇到标志==0时(该学生信息已进行逻辑删除),跳过该信息。
	*/
	char name[21];
	int sex;//1为男生,0为女生
	char id[11];
	double grade;
}Stu;


char *Menu[] = {
	"--------学生管理系统--------\n",
	"1.信息录入         (A)\n",
	"2.信息修改         (B)\n",
	"3.信息查询         (C)\n",
	"4.添加信息         (D)\n",
	"5.删除信息         (E)\n",
	"6.学生信息打印     (F)\n",
	"0.退出             (G)\n",
};

学生信息录入
学生信息录入编写了两个函数,因为我将学生信息录入分为两个部分,一个为信息初始化录入(即在文件中什么都没有时录入信息),另一个是当信息已初始化录入后再次添加信息,信息从键盘录入这一部分没有必要重复书写,因此把它整体写成一个函数调用。
学生信息录入功能:将学生信息存入结构体数组中,当录入完成时将整个数组写入文件

int writeFile() {
	FILE *fp;
	int n;

	fp = fopen("studentMessage.txt","w+");
	if(NULL == fp) {
		printf("打开文件失败!");
		return 0;
	}
	n = fwriteFile(fp);
	printf("\n\n录入完成!\n");

	fclose(fp);
	//system("cls");
	showMainMenu();
	return n;
}

返回学生人数

int fwriteFile(FILE *fp) {
	Stu student[50];
	int n;
	int i;
	char name[21];
	char id[11];
	double g;

	printf("输入信息的学生个数:");
	scanf("%d",&n);
	printf("\n请输入学生信息:\n");
	for(i=0;i

学生信息添加:

void addFile(int m) {
	FILE *fp;
	int n;
	int s;

	fp = fopen("studentMessage.txt","a");
	if(NULL == fp) {
		printf("打开文件失败!");
		return;
	}
	printf("\n请输入要加入的学生信息:\n\n");
	n = fwriteFile(fp);
	s = n+m;
	printf("\n\n添加学生信息成功!\n");

	fclose(fp);
	//system("cls");
	showMainMenu();
}

学生信息查询:利用学号查询学生信息,返回位置下标。

int searchFile() {
	FILE *fp;
	Stu student[50];
	int i=0,k=0;
	char id[11];

	fp = fopen("studentMessage.txt","rb");
	if(NULL == fp) {
		printf("打开文件失败!");
		return 0;
	}
	while(fread(&student[k],sizeof(Stu),1,fp)) {
		k++;
	}
	printf("\n请输入要查找的学生学号:");
	flushall();
	gets(id);
	for(i=0;i

学生信息修改:
调用信息查找函数,利用返回的下标修改信息。

void exchangeFile() {
	FILE *fp;
	Stu student[50];
	char name[21];
	char exid[11];
	char id[11];
	int i=0,k=0;
	double g;

	fp = fopen("studentMessage.txt","r+");
	if(NULL == fp) {
		printf("打开文件失败!");
		return ;
	}
	printf("\n\n请输入要修改的学生学号:");
	flushall();
	gets(exid);
	while(fread(&student[k],sizeof(Stu),1,fp)) {
		k++;
	}
	fclose(fp);
	fp = fopen("studentMessage.txt","w+");
	for(i=0;i

学生信息删除
学生信息删除时将文件中的数据读取到结构体数组中,根据学号查找到要修改的信息,先进行逻辑删除,修改标志,然后在数组中删除该组数据。由于删除了一组数据,长度不够,写入文件中时最后一组数据无法覆盖,因此选择使用remove()删除原文件,重新生成与原文件同名的新文件,将删除后的数组写入新文件。

void deleteFile() {
	FILE *fp;
	Stu student[50];
	char id[11];
	int i=0,k=0;

	fp = fopen("studentMessage.txt","rb");
	if(NULL == fp) {
		printf("打开文件失败!");
		return ;
	}
	while(fread(&student[k],sizeof(Stu),1,fp)) {
		k++;
	}
	printf("\n请输入要删除的学生学号:");
	flushall();
	gets(id);
	//逻辑删除
	for(i=0;i

学生信息读取:

void readFile() {
	FILE *fp;
	int i = 0,k = 0;
	Stu student[50];

	fp = fopen("studentMessage.txt","rb");
	if(NULL == fp) {
		printf("打开文件失败!");
		return ;
	}
	while(fread(&student[k],sizeof(Stu),1,fp)) {
		k++;
	}
	for(i=0;i

系统菜单:

void showMainMenu() {
	int i=0;
	int n;
	char ch;

	if(!access("studentMessage.txt",0)) {
		while(Menu[i]){
			showMessageCenter(Menu[i]);
			i++;
			if(8 == i) {
				break;
			}
		}
		printf("请输入选择:");
		flushall();
		scanf("%c",&ch);
		switch(ch) {
			case '1':n = writeFile();break;
			case 'A':n = writeFile();break;
			case '2':exchangeFile();break;
			case 'B':exchangeFile();break;
			case '3':i = searchFile();break;
			case 'C':i = searchFile();break;
			case '4':addFile(n);break;
			case 'D':addFile(n);break;
			case '5':deleteFile();break;
			case 'E':deleteFile();break;
			case '6':readFile();break;
			case 'F':readFile();break;
			case '0':break;
			case 'G':break;
			default:printf("\n没有该选项!请重新输入选择:\n\n");showMainMenu();
		}
	}
	i = 0;
	while(i<8){
		if(1 == i||7 == i) {
			showMessageCenter(Menu[i]);
			i++;
		}
		i++;
	}
	printf("请输入选择:");
	flushall();
	scanf("%c",&ch);
	switch(ch) {
		case '1':n = writeFile();break;
		case 'A':n = writeFile();break;
		case '0':break;
		case 'G':break;
		default:printf("\n学生信息未录入!请录入信息\n\n");showMainMenu();
	}
}

字符串居中函数:
将菜单的字符屏幕居中输出。

void showMessageCenter(char *str) {
	int i;
	int lenth;

	lenth = (COLS - strlen(str)) / 2;
	for(i = 0; i < lenth; i++) 
		printf(" ");
	printf("%s\n", str);
}

排序生成索引文件(!!并未写入系统代码中!!)

void useIndexFile() {
	FILE *fp;
	int number[50];
	int k=0;
	int i=0;
	Stu student[50];

	fp = fopen("indexFile.txt","rb");
	if(NULL == fp) {
		printf("打开文件失败!");
		return ;
	}
	while(fread(&number[k],sizeof(int),1,fp)) {
		k++;
	}

	fclose(fp);

	fp = fopen("orderMessage.txt","rb");
	if(NULL == fp) {
		printf("打开文件失败!");
		return ;
	}
	printf("\n按索引文件顺序输出!\n");
	for(i=0;i

系统代码如下(不包括生成索引文件代码):

#include
#include
#include
#include
#include

#define COLS 80

typedef struct Dex {
	int orderid;//序号
	char indexid[11];//学号
}Dex;

typedef struct Stu {
	int sign;//是否需要删除的标志
	char name[21];
	int sex;//1为男生,0为女生
	char id[11];
	double grade;
}Stu;


char *Menu[] = {
	"--------学生管理系统--------\n",
	"1.信息录入         (A)\n",
	"2.信息修改         (B)\n",
	"3.信息查询         (C)\n",
	"4.添加信息         (D)\n",
	"5.删除信息         (E)\n",
	"6.学生信息打印     (F)\n",
	"0.退出             (G)\n",
};

void showMessageCenter(char *str);
void showMainMenu();
int fwriteFile(FILE *fp);
int writeFile();
void exchangeFile();
int searchFile();
void addFile(int m);
void deleteFile();
void readFile();


void readFile() {
	FILE *fp;
	int i = 0,k = 0;
	Stu student[50];

	fp = fopen("studentMessage.txt","rb");
	if(NULL == fp) {
		printf("打开文件失败!");
		return ;
	}
	while(fread(&student[k],sizeof(Stu),1,fp)) {
		k++;
	}
	for(i=0;i

你可能感兴趣的:(demo)