C语言实现简易的学生管理系统

一、使用数组的方法

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct SUser
{
	int nNumb;//学号
	char sName[20];//姓名
	float fScore;//成绩
};
//定义全局数组
SUser g_user[2000];
//函数声明
//打印
void Print();
//增删改查
void Add();
void Delete();
void Modify();
void Find();
//学号查重
int CheckUser(SUser user);
//保存和加载
void Save();
void Load();
//排序
void Sort(int nIndex);
int Judge(int nIndex, SUser* p);
//菜单
int Menu();
int DisplayMenu();

void Save()
{
	FILE* fp = fopen("data.li", "wb");
	if (!fp)
	{
		puts("打开文件失败!");
		return;
	}
	int i = 0;
	while (g_user[i].nNumb)
	{
		if (g_user[i].nNumb != -1)
		{
			fwrite(&g_user[i], 1, sizeof(g_user[i]), fp);
		}
		++i;
	}
	fclose(fp);
}
void Load()
{
	FILE* fp = fopen("data.li", "rb");
	if (!fp)
		return;
	int i = 0;
	while (sizeof(g_user[i]) == fread(&g_user[i], 1, sizeof(g_user[i]), fp))
		++i;
	fclose(fp);
}
//打印信息
void Print()
{
	int i = 0,sum = 0;
	puts("******************************");
	printf("学号\t姓名\t成绩\n");
	puts("------------------------------");
	while (g_user[i].nNumb)
	{
		if (g_user[i].nNumb != -1)
		{
			printf("%d\t%s\t%.1f\n", g_user[i].nNumb, g_user[i].sName, g_user[i].fScore);
			++sum;
		}
		++i;
	}
	puts("------------------------------");
	printf("\t共有%d条学生信息\n", sum);
	puts("******************************");
}
//添加信息
void Add()
{
	SUser user;
	int i = 0;
	while (g_user[i].nNumb&&g_user[i].nNumb!=-1)
		++i;
	printf("请输入学号、姓名以及成绩[空格隔开]:");
	scanf_s("%d%s%f", &user.nNumb, user.sName, sizeof(user.sName), &user.fScore);
	if (!CheckUser(user))
	{
		g_user[i] = user;
		Save();
		printf("添加成功!\n");
	}	
	else
		printf("添加失败!次学号已存在!\n");
}
int CheckUser(SUser user)
{
	int i = 0;
	int sum = 0;
	while (g_user[i].nNumb)
	{
		if (g_user[i].nNumb == user.nNumb)
			++sum;
		++i;
	}	
	return sum;
}
//删除信息
void Delete()
{
	printf("请输入要删除的学号:");
	int i = 0,sno = 0;
	scanf_s("%d", &sno);
	while (g_user[i].nNumb)
	{
		if (g_user[i].nNumb == sno)
		{
			g_user[i].nNumb = -1;
			Save();
			printf("删除成功!\n");
			return;
		}
		++i;
	}
	printf("没有找到指定学号!\n");
}
//查找信息
void Find()
{
	printf("请输入要查找的学号: ");
	int sno = 0;
	scanf_s("%d", &sno);
	puts("******************************");
	printf("学号\t姓名\t成绩\n");
	puts("------------------------------");
	int i = 0;
	while (g_user[i].nNumb)
	{
		if (g_user[i].nNumb == sno)
		{
			printf("%d\t%s\t%.1f\n", g_user[i].nNumb, g_user[i].sName, g_user[i].fScore);
			puts("------------------------------");
			printf("\t查询到1条学生信息\n");
			puts("******************************");
			return;
		}
		++i;
	}
	printf("没有找到!\n");
	puts("------------------------------");
	printf("\t查询到0条学生信息\n");
	puts("******************************");
}
//修改
void Modify()
{
	printf("请输入要修改的学号: ");
	int sno = 0;
	scanf_s("%d", &sno);
	int i = 0;
	while (g_user[i].nNumb)
	{
		if (g_user[i].nNumb == sno)
		{
			SUser user;
			printf("查询到信息:\n");
			printf("学号:%d\t姓名:%-8s成绩:%.1f\n", g_user[i].nNumb, g_user[i].sName, g_user[i].fScore);
			printf("请输入修改的学号、姓名以及成绩[空格隔开]:");
			scanf_s("%d%s%f", &user.nNumb, user.sName, sizeof(g_user[i].sName), &user.fScore);
			if (user.nNumb!=g_user[i].nNumb && CheckUser(user)>0)
			{
				printf("修改失败!此学号已存在!\n");
				return;

			}
			g_user[i] = user;
			Save();
			printf("修改成功!\n");
			return;
		}
		++i;
	}
	printf("没有找到!\n");
}
int Judge(int nIndex, SUser* p)
{
	if (nIndex == 1)
		return p[0].nNumb > p[1].nNumb;
	if (nIndex == 2)
		return strcmp(p[0].sName, p[1].sName) > 0;
	if(nIndex==3)
		return p[0].fMath < p[1].fScore;
	return 0;
}
void Sort(int nIndex)
{
	int num = 0;
	while (g_user[num].nNumb)
	{
		++num;
	}
	for (int i = 0; i<num - 1; ++i)
		for (int j = 0; j < num - i - 1; ++j)
		{
			if (Judge(nIndex, &g_user[j]))
			{
				SUser user = g_user[j];
				g_user[j] = g_user[j + 1];
				g_user[j + 1] = user;
			}
		}
}
int DisplayMenu()
{
	puts("1. 按学号排序");
	puts("2. 按姓名排序");
	puts("3. 按成绩排序");
	puts("0. 返回主菜单o");
	printf("请选择:");
	int i = 0;
	scanf_s("%d", &i);
	switch (i)
	{
	case 1:
	case 2:
	case 3:
		Sort(i);
		Print();
		break;
	}
	return i;
}
int Menu()
{
	puts("");
	puts("1. 浏览所有信息");
	puts("2. 添加信息");
	puts("3. 删除信息");
	puts("4. 修改信息");
	puts("5. 查找信息");
	puts("0. 退出");
	printf("请选择:");
	int i = 0;
	scanf_s("%d", &i);
	switch (i)
	{
	case 1:
		while (DisplayMenu())
			;
		break;
	case 2:
		Add();
		break;
	case 3:
		Delete();
		break;
	case 4:
		Modify();
		break;
	case 5:
		Find();
		break;
	}
	return i;
}
int main()
{
	Load();
	while (Menu())
		;
	return 0;
}

二、使用链表的方法

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct SUser
{
	int nNumb;
	char sName[20];
	float fScore;
};
typedef SUser DATA;
struct SNode
{
	DATA data;
	SNode* pNext;
};
SNode* g_pHead = NULL;

int AddTail(DATA data);
int AddHead(DATA data);
int CheckUser(int);

void Save()
{
	FILE* fp = fopen("data.info", "wb");
	if (!fp)
	{
		puts("读写文件失败!");
		return;
	}
	SNode* p = g_pHead;
	while (p)
	{
		fwrite(&p->data, 1, sizeof(p->data), fp);
		p = p->pNext;
	}
	fclose(fp);
}
void Load()
{
	FILE* fp = fopen("data.info", "rb");
	if (!fp)
		return;

	SNode* p = g_pHead;
	DATA data;
	int n = 0;
	while ((n=fread(&data,1,sizeof(DATA),fp))>0)
	{
		AddTail(data);
	}
	fclose(fp);
}
void Print()
{
	puts("******************************");
	printf("学号\t姓名\t成绩\n");
	puts("------------------------------");
	SNode* p = g_pHead;
	int sum = 0;
	while (p)
	{
		printf("%d\t%s\t%0.1f\n", p->data.nNumb,p->data.sName,p->data.fScore);
		p = p->pNext;
		++sum;
	}
	puts("------------------------------");
	printf("\t共有%d条学生信息\n", sum);
	puts("******************************");
}
int Input(int nIndex)
{
	DATA data;
	int flag = 0;
	do 
	{
		printf("请输入学号:");
		scanf_s("%d", &data.nNumb);
		if (!data.nNumb)
			return 0;
		if (flag = CheckUser(data.nNumb))
			puts("此学号以及存在!");

	} while (flag);

	printf("请输入姓名:");
	scanf_s("%s", data.sName, sizeof(data.sName));
	printf("请输入成绩:");
	scanf_s("%f", &data.fScore);
	if (nIndex == 1)
	{
		return AddHead(data);
	}	
	else
	{
		return AddTail(data);
	}		
}
//增加头
int AddHead(DATA data)
{
	SNode* p = (SNode*)malloc(sizeof(SNode));
	p->data = data;
	p->pNext = g_pHead;
	g_pHead = p;
	return 1;
}
int AddTail(DATA data)
{
	SNode* p = (SNode*)malloc(sizeof(SNode));
	p->data = data;
	p->pNext = NULL;
	if (!g_pHead)
	{
		g_pHead = p;
		return 1;
	}
	SNode* q = g_pHead;
	while (q->pNext)
		q = q->pNext;
	q->pNext = p;
	return 1;
}

//删除节点
int Delete()
{
	printf("请输入要删除的学号:");
	int i = 0, nNumb = 0;
	scanf_s("%d", &nNumb);
	if (!g_pHead)
		return 0;
	if (g_pHead->data.nNumb == nNumb)
	{
		SNode* q = g_pHead;
		g_pHead = g_pHead->pNext;
		free(q);
		Save();
		return 1;
	}
	SNode* pHead = g_pHead;
	SNode* p = g_pHead->pNext;
	while (p)
	{
		if (p->data.nNumb == nNumb)
			break;
		pHead = p;
		p = p->pNext;
	}
	if (p)
	{
		pHead->pNext = p->pNext;
		free(p);
		Save();
		return 1;
	}
	printf("没有找到指定学号!\n");
	return 0;
}
//修改
void Modify()
{
	printf("请输入要修改的学号: ");
	int nNumb = 0;
	scanf_s("%d", &nNumb);
	SNode* p = g_pHead;
	while (p)
	{
		if (nNumb == p->data.nNumb)
		{
			DATA data;
			printf("查询到信息:\n");
			printf("学号:%d\t姓名:%-8s成绩:%.1f\n", p->data.nNumb, p->data.sName, p->data.fScore);
			printf("请输入修改的学号、姓名以及成绩[空格隔开]:");
			scanf_s("%d%s%f", &data.nNumb, data.sName, sizeof(data.sName), &data.fScore);
			if (data.nNumb != p->data.nNumb && CheckUser(data.nNumb) > 0)
			{
				puts("此学号已存在!");
				return;
			}
			p->data = data;
			Save();
			puts("修改成功!");
			return;
		}	
		p = p->pNext;
	}
	puts("没有找到次学号!");
}
void Find()
{
	printf("请输入要查找的学号: ");
	int nNumb = 0;
	scanf_s("%d", &nNumb);
	puts("******************************");
	printf("学号\t姓名\t成绩\n");
	puts("------------------------------");
	SNode* p = g_pHead;
	while (p)
	{
		if (p->data.nNumb == nNumb)
		{
			printf("%d\t%s\t%.1f\n", p->data.nNumb, p->data.sName, p->data.fScore);
			puts("------------------------------");
			printf("\t查询到1条学生信息\n");
			puts("******************************");
			return;
		}
		p = p->pNext;
	}
	printf("没有找到!\n");
	puts("------------------------------");
	printf("\t查询到0条学生信息\n");
	puts("******************************");
}
int AddMenu()
{
	puts("1. 头部添加");
	puts("2. 尾部添加");
	puts("0. 返回主菜单");
	printf("请选择:");
	int i = 0;
	scanf_s("%d", &i);
	switch (i)
	{
	case 1:
	case 2:
	{
		if (Input(i))
		{
			Save();
			puts("添加成功!");
		}	
		break;
	}
	}
	return i;
}
int Judge(SNode* p, SNode* pMin, int nIndex)
{
	switch (nIndex)
	{
	case 1:
		return p->data.nNumb < pMin->data.nNumb;
	case 2:
		return strcmp(p->data.sName, pMin->data.sName) < 0;
	case 3:
		return p->data.fScore > pMin->data.fScore;
	}
}
void Sort(int nIndex)
{
	SNode* pHead = g_pHead;
	while (pHead)
	{
		SNode* pMin = pHead;
		SNode* p = pHead->pNext;
		while (p)
		{
			if (Judge(p,pMin, nIndex))
				pMin = p;
			p = p->pNext;
		}
		if (pMin != pHead)
		{
			DATA data = pHead->data;
			pHead->data = pMin->data;
			pMin->data = data;
		}
		pHead = pHead->pNext;
	}
}

int PrintMenu()
{
	puts("1. 按学号排序");
	puts("2. 按姓名排序");
	puts("3. 按成绩排序");
	puts("0. 返回主菜单");
	printf("请选择:");
	int i = 0;
	scanf_s("%d", &i);
	switch (i)
	{
	case 1:
	case 2:
	case 3:
		Sort(i);
		Print();
		break;
	}
	return i;
}
int Menu()
{
	puts("");
	puts("1. 浏览所有信息");
	puts("2. 添加信息");
	puts("3. 删除信息");
	puts("4. 修改信息");
	puts("5. 查找信息");
	puts("0. 退出");
	printf("请选择:");
	int i = 0;
	scanf_s("%d", &i);
	switch (i)
	{
	case 1:
		while (PrintMenu())
			;
		break;
	case 2:
		while (AddMenu())
			;
		break;
	case 3:
	{
		int res = Delete();
		if (res)
			puts("删除成功!");
		break;
	}
	case 4:
	{
		Modify();
		break;
	}
	case 5:
	{
		Find();
		break;
	}
	}
	return i;
}
int CheckUser(int nNumb)
{
	SNode* p = g_pHead;
	int sum = 0;
	while (p)
	{
		if (p->data.nNumb == nNumb)
			++sum;
		p = p->pNext;
	}
	return sum;
}

int main()
{
	Load();
	while (Menu())
		;
	return 0;
}
发布了21 篇原创文章 · 获赞 20 · 访问量 2984

猜你喜欢

转载自blog.csdn.net/weixin_42844163/article/details/104092925