一个源文件完成C语言学生信息管理系统(含文件操作)

知识要点

	C语言(基本语法,程序结构,数据类型等)
	模块化编程

设计思路

	增、删、改、查以及文件操作

功能模块

	菜单:列出功能选项;
	添加内容:添加学生信息
	删除内容:删除学生信息
	修改内容:修改学生信息
	查看内容:查看学生信息
	所有内容:列出所有学生信息
	排序功能:按成绩排序
	退出程序。

实际代码

头文件和源文件代码内容我整合在一个源文件了,可以直接跑。
如果有兴趣也可以拆开并在这个基础上添加一些有趣的内容。

//#define _CRT_SECURE_NO_WARNINGS
//如果你使用的是vscode或者vs(Visual Studio)报错“error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.”的话,在代码最前面加一句“#define _CRT_SECURE_NO_WARNINGS”。
#include <stdio.h>
#include <io.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 200

/*//如果mian函数写在被调用函数前则需要提前声明被调用函数
void Menu();
void reMenu();
void showall();
void saveBinary();
void saveCorrespondingFormat();
void add();
void readFile();
void delate();
void edit();
void search();
void sort(struct data Buff);
*/

typedef struct Student
{
	char id[20];
	char name[50];
	char sex[10];
	int age;
	float score;
}Stu; //Stu 等同于 struct Student.

struct data
{
	int count; //当前学生数组中的学生数
	struct Student stu[MAX]; //学生数组
}d;
//Menu目录
void Menu()
{
	system("cls");//clear screen
	printf("\n\n\n");
	printf("%*s\n", 30, "选项菜单");
	printf("%*s\n", 30, "1、添加内容");
	printf("%*s\n", 30, "2、删除内容");
	printf("%*s\n", 30, "3、修改内容");
	printf("%*s\n", 30, "4、查找内容");
	printf("%*s\n", 30, "5、所有内容");
	printf("%*s\n", 30, "6、排序内容");
	printf("%*s\n", 30, "7、退出程序");
	printf("请输入您的选择!\n");
}

//等待用户按Enter键返回主菜单
void reMenu()
{
	char c1, c2;
	printf("\n按Enter键返回主菜单...");
	scanf("%c%c", &c1, &c2);//第一个字符吸收上次的确认回车键 
	//while (getchar() != '\n')
	//		continue;//不可用
	Menu();
}

//显示所有学生信息
void showall()
{
	int i;
	printf("\n学号\t姓名\t性别\t年龄\t成绩\n");
	for (i = 0; i < d.count; i++)
		printf("%s\t%s\t%s\t%d\t%f\n", d.stu[i].id, d.stu[i].name, 
			d.stu[i].sex,d.stu[i].age, d.stu[i].score);
	printf("Above is all\n");

}

//将数据从结构数组保存到文件
void saveBinary()
{
	FILE *fp; //file point
	int i, j;
	j = d.count;
	fp = fopen("dataBinary.txt", "w"); //File storage location: current folder
	fwrite(&j, sizeof(int), 1, fp);
	//fprintf(fp, "%d", j);
	for (i = 0; i < d.count; i++)
	{
		fwrite(&d.stu[i], sizeof(Stu), 1, fp);
		//fprintf(fp,"%s\t%s\t%s\t%d\t%f\n", d.stu[i].id, d.stu[i].name, d.stu[i].sex, d.stu[i].age, d.stu[i].score);
	}
		fclose(fp);
	
}
//按照对应格式保存数据(非二进制流)
void saveCorrespondingFormat()
{
	FILE *fp; //file point
	int i, j;
	j = d.count;
	fp = fopen("dataCorrespondingFormat.txt", "w"); //File storage location: current folder
	for (i = 0; i < d.count; i++)
	{
		fprintf(fp,"%s\t%s\t%s\t%d\t%f\n", d.stu[i].id, d.stu[i].name, d.stu[i].sex, d.stu[i].age, d.stu[i].score);
	}//fprintf()函数根据指定的格式(format),向输出流(stream)写入数据(argument)。
	fclose(fp);
}
//输出一个排序文件
void saveSort()
{
	FILE *fp; //file point
	int i, j;
	j = d.count;
	fp = fopen("dataSort.txt", "w"); //File storage location: current folder
	for (i = 0; i < d.count; i++)
	{
		fprintf(fp, "%s\t%s\t%s\t%d\t%f\n", d.stu[i].id, d.stu[i].name, 
			d.stu[i].sex, d.stu[i].age, d.stu[i].score);
	}
	fclose(fp);
}

//添加信息
void add()
{
	int b;
	int j = d.count;
	while (j < MAX)
	{
		printf("请输入学生学号:");
		scanf("%s", d.stu[j].id);
		printf("请输入学生姓名:");
		scanf("%s", d.stu[j].name);
		printf("请输入学生性别:");
		scanf("%s", d.stu[j].sex);
		printf("请输入学生年龄:");
		scanf("%d", &d.stu[j].age);
		printf("请输入学生成绩:");
		scanf("%f", &d.stu[j].score);

		d.count++; //Need to set 0 in the main function in advance
		j = d.count;
		printf("\n是否继续添加学生信息(0-否,1-是):");
		scanf("%d", &b);
		if (b == 0)break;
	}
	saveBinary();//二进制存储,用于系统读取
	saveCorrespondingFormat();//文字对应格式存储,用于打卡文件查看
}

//从文件读取数据到结构数组
void readFile()
{
	FILE *fp;
	int i, j;
	j = 0;
	if ((fp = fopen("dataBinary.txt", "r")) == NULL) //If the file does not exist
	{
		d.count = 0;
	}
	else
	{
		fread(&j, sizeof(int), 1, fp);
		d.count=j;
		for (i = 0; i < j; i++)
		{
			fread(&d.stu[i], sizeof(Stu), 1, fp);
			//fscanf(fp,"%s", d.stu[j].id);
			//fscanf(fp,"%s", d.stu[j].name);
			//fscanf(fp,"%s", d.stu[j].sex);
			//fscanf(fp,"%d", &d.stu[j].age);
			//fscanf(fp,"%f", &d.stu[j].score);
		}
		fclose(fp);
	}
}

//删除功能
void delate()
{
	int i, j;
	char id[20];
	printf("\n请输入需要删除的学生的学号:");
	scanf("%s", id);
	j = -1;
	for (i = 0; i < d.count; i++)
	{
		if (strcmp(d.stu[i].id, id) == 0)
		{
			j = i;
			break;
		}
	}
	if (j == -1)
	{
		printf("\n没有找到该学生(学号:%s)。", id);
	}
	else
	{
		for (i = j; i < d.count - 1; i++) //将以下数据向前移动一位
			d.stu[i] = d.stu[i + 1];
		memset(&d.stu[d.count - 1], 0, sizeof(struct Student)); //将 d.stu[d.count - 1] 数据置零
		d.count--;
		saveBinary();
		saveCorrespondingFormat();
		printf("\n成功删除学生(学号:%s)信息!", id);
	}
}

//修改功能
void edit()
{
	int i, j;
	char id[20];
	printf("\n请输入需要修改的学生的学号:");
	scanf("%s", id);
	j = -1;
	for (i = 0; i < d.count; i++)
	{
		if (strcmp(d.stu[i].id, id) == 0)
		{
			j = i;
			//break;
		}
	}
	if (j == -1)
	{
		printf("\n没有找到该学生(学号:%s)!", id);
	}
	else
	{
		printf("请输入学生学号:");
		scanf("%s", d.stu[j].id);
		printf("请输入学生姓名:");
		scanf("%s", d.stu[j].name);
		printf("请输入学生性别:");
		scanf("%s", d.stu[j].sex);
		printf("请输入学生年龄:");
		scanf("%d", &d.stu[j].age);
		printf("请输入学生成绩:");
		scanf("%f", &d.stu[j].score);
		saveBinary();
		saveCorrespondingFormat();
		printf("\n修改学生(学号:%s)信息成功", id);
	}
}

//查询功能
void search()
{
	int i, j;
	char id[20];
	printf("请输入需要查询的学生学号:");
	scanf("%s", id);
	j = -1;
	for (i = 0; i < d.count; i++)
	{
		if (strcmp(d.stu[i].id, id) == 0)
		{
			printf("\n学号\t姓名\t性别\t年龄\t分数\n");

			j = i;
			printf("%s\t%s\t%s\t%d\t%f\n", d.stu[i].id, d.stu[i].name, 
				d.stu[i].sex,d.stu[i].age, d.stu[i].score);
			break;
		}
	}
	if (j == -1)
	{
		printf("\n没有找到该学生(学号:%s)", id);
	}
}

//排序功能
void sort(struct data Buff)
{
	int i, j;
	Stu temp;
	FILE *fp;
	if ((fp = fopen("dataBinary.txt", "r")) == NULL)
	{
		printf("cannot open file!\n");
		exit(0);
	}
	for (i = 0; i < Buff.count - 1; i++)//选择排序
	{
		for (j = i + 1; j < Buff.count; j++)
		{
			if (Buff.stu[j].score > Buff.stu[i].score)
			{
				temp = Buff.stu[j];
				Buff.stu[j] = Buff.stu[i];
				Buff.stu[i] = temp;
			}
		}
	}
	saveSort();
	printf("\n名次\t学号\t姓名\t分数\n");
	for (i = 0; i < Buff.count; i++)
	{
		printf("%d\t%s\t%s\t%f\n",i+1, Buff.stu[i].id, Buff.stu[i].name, Buff.stu[i].score);
	}
	fclose(fp);
}


int main()
{
	int f;
	d.count = 0;
	readFile(); //读取二进制文件中的内容
	Menu();	//菜单目录
	while (1)
	{
		scanf("%d", &f);
		switch (f)
		{
		case 1:add();		//添加
			break;
		case 2:delate();	//删除
			break;
		case 3:edit();		//修改
			break;
		case 4:search();	//查找
			break;
		case 5:showall();	//所有
			break;
		case 6:sort(d);		//排序
			break;
		case 7:				//退出
			break;
		}
		if (f == 7) break;
		reMenu();			//重新加载目录
	}
	return 0;
}

运行效果

添加内容
在这里插入图片描述
所有内容(上一步添加的)
在这里插入图片描述
修改内容(修改了学号为6的学生信息)
在这里插入图片描述
查找内容
在这里插入图片描述
再看一下此时的所有内容,修改成功
在这里插入图片描述
删除内容(删除结果图拼接在一起)
在这里插入图片描述
排序内容
在这里插入图片描述
看一下生成的文件,这里用记事本展示。

在这里插入图片描述
在这里插入图片描述
总的来讲,这个系统涉及C语言的知识还是挺多的,比较适合总体学习后用于归纳总结的练习来做。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值