基于C语言的档案管理系统

一次接单的题,档案管理系统,标题是《C++面向过程程序设计》,然而事先没讲好,我就用了C语言,希望这位同学能接受吧 ~

要求:

本系统可基于结构体数组进行设计。录入、显示等功能基于结构体数组中数据的插入和显示等。其中“信息排序”部分的“按单位排序”,只要根据单位名称的大小排序即可,“按单位+部门编号排序”,需要根据,在相同单位的前提下,部门]编号自小到大排序(如单位分别是电子系、计算机系等,部门编号1代表自动化,2代表通信等)。
[基本功能]

  • 信息录入
  • 信息显示
  • 信息查询
    • 按工号查询
    • 按姓名查询
    • 按单位查询
    • 按单位+部门编号查询
  • 信息排序
    • 按工号排序
    • 按姓名排序
    • 按单位排序
    • 按单位+部门编号排序 *
  • 信息修改
  • 信息保存
  • 信息调入(即从文件读取)

[提示部分]
        数据结构:每位的信息(如:工号,姓名,年龄,电话,家庭住址,职业,单位,部门编号)用类型 lnfo 表达,所有信息是结构体数组,如 lnfo infoAll[1000]
        使用结构体中多个字段进行排序的有两种思路:
        思路1:使用2重循环排序的时候,条件判断使用多个条件        

if ( 
    (strcmp(infoAll[i].danwei, infoAll[j].danwei) > 0) || 
    (strcmp(infoAll[i].danwei, infoAll[j].danwei) == 0 && 
    strcmp(infoAll[i].bm, infoAll[j].bm > 0))
)

        思路2:使用qsort函数,通过指针移动实现排序。排序之后的结果仍然被在原数组中。使用qsort函数必须自己写一个比较函数,此函数在stdlib.h中声明。可自行上网找资料。

        要求600+行代码。

代码:

操作系统:Windows10 家庭和学生版。

开发环境:Visual Studio 2019。

下面是我写的代码,懒得写注释了,大家看看就好:

项目结构:

 main.c 

#include "menu.h"
#include "func.h"

Info infoAll[MAXNUM];

int main() 
{
	while (1)
	{
		system("cls");

		printMenu();
		int choose = 0;
		printf("\n输入您的操作选择:");
	inputChoose:
		scanf("%d", &choose);
		setBuf();
		printf("\n");
		switch (choose)
		{
		case 0:
			printf("\n\t\t\t\t=====退出系统====\n\n");
			exit(0);
		case 1:
			appendInfor(infoAll);
			break;
		case 2:
			printAllInfo(infoAll);
			break;
		case 3:
			searchInfor(infoAll);
			break;
		case 4:
			sortInfor(infoAll);
			break;
		case 5:
			modifyInfor(infoAll);
			break;
		case 6:
			saveInforIntoBinFile(infoAll);
			break;
		case 7:
			readInforFromBinFile(infoAll);
			break;
		default:
			printf("输入错误,请重新输入:");
			goto inputChoose;
			break;
		}

		system("pause");
	}
	return 0;
}

 menu.h

// 打印菜单
void printMenu();

menu.c

#include "menu.h"

void printMenu()
{
	printf("\t\t\t\t  学生档案管理系统\n\n");
	printf("\t\t\t\t    0. 退出系统   \n");
	printf("\t\t\t\t    1. 添加信息   \n");
	printf("\t\t\t\t    2. 显示信息   \n");
	printf("\t\t\t\t    3. 查询信息   \n");
	printf("\t\t\t\t    4. 信息排序   \n");
	printf("\t\t\t\t    5. 修改信息   \n");
	printf("\t\t\t\t    6. 保存信息   \n");
	printf("\t\t\t\t    7. 文件读取   \n\n");
	for (int k = 0; k < 50; k++)
		printf("■");
}

func.h

/****************此头文件包含了该项目所使用的结构体定义以及函数的声明***************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXNUM 1000
#define MAXCOL 200

// 学生信息结构体
typedef struct 
{
	char	workID[20];			// 工号,不允许为空!且必须唯一!
	char	name[20];			// 姓名
	short	age;				// 年龄
	char	phone[20];			// 电话
	char	address[50];		// 家庭住址
	char	job[40];			// 职业
	char	unit[20];			// 单位
	short	departmentID;		// 部门编号
}Info;

// 清空缓冲区,请在每次scanf后调用
void setBuf();

// 判断学号是否已存在于信息中
short idIsInInfor(char* workID, Info* infor);

// 添加信息
void appendInfor(Info* infor);

// 显示信息
void printAllInfo(Info* infor);

// 信息查询
void searchInfor(Info* infor);

// 信息排序
void sortInfor(Info* infor);

// 信息修改
void modifyInfor(Info* infor);

// 信息保存至 csv 文件中
void saveInforIntoBinFile(Info* infor);

// 从 csv 文件中读取信息
void readInforFromBinFile(Info* infor);

// 按工号查询,并返回查询到的下标
int searchInforByWorkID(Info* infor);

// 按姓名查询
void searchInforByName(Info* infor);

// 按单位查询
void searchInforByUnit(Info* infor);

// 按单位和部门查询
void searchInforByUnitAndDepartmentID(Info* infor);

// 按工号排序
void sortWithWorkID(Info* infor);

// 按姓名排序
void sortWithName(Info* infor);

// 按单位排序
void sortWithUnit(Info* infor);

// 按单位和部门排序
void sortWithUnitAndDepartmentID(Info* infor);

// 全部修改
void modifyAll(Info* infor);

// 选择单独项修改
void modifyOne(Info* infor);

func.c

/******************此文件包含了"func.h"中函数的定义********************/

#include "func.h"

void setBuf()
{
	while (getchar() != '\n');
}

short idIsInInfor(char* workID, Info* infor)
{
	short isIn = 0;
	for (int i = 0; infor[i].workID[0]; i++)
	{
		if (0 == strcmp(infor[i].workID, workID))
		{
			isIn = 1;
			break;
		}
		else isIn = 0;
	}
	return isIn;
}

void appendInfor(Info* infor)
{
	int i = 0;
	char getID[20] = { 0 };
	printf("\t\t\t\t=====添加信息=====\n");
inputWorkID:
	printf(" 学  号 :"); gets_s(getID, 20);
	if (getID[0] == ' ' || getID[0] == NULL)
	{
		printf("学工号不能为空噢,请再试一次吧~\n");
		goto inputWorkID;
	}
	if (idIsInInfor(getID, infor))
	{
		printf("该学工号已存在,请检查学工号输入!\n");
		goto inputWorkID;
	}
	for (i = 0; infor[i].workID[0]; i++);
	strcpy(infor[i].workID, getID);
	printf(" 姓  名 :"); 
	gets_s(infor[i].name, 20);
	printf(" 年  龄 :"); 
	scanf("%hd", &infor[i].age);
	setBuf();
	printf(" 电  话 :"); 
	gets_s(infor[i].phone, 20);
	printf("家庭住址:"); 
	gets_s(infor[i].address, 50);
	printf(" 职  业 :"); 
	gets_s(infor[i].job, 40);
	printf(" 单  位 :"); 
	gets_s(infor[i].unit, 20);
	printf("部门编号:"); 
	scanf("%hd", &infor[i].departmentID); 
	setBuf();

	printf("\n\t\t\t\t=====添加成功=====\n\n");
}

void printAllInfo(Info* infor)
{
	printf("\n\t\t\t\t=====所有档案信息=====\n\n");
	printf("%15s%10s%6s%15s%15s%15s%15s%10s\n\n", 
		"工号", "姓名", "年龄", "电话", "家庭住址", "职业", "单位", "部门编号");
	for (int i = 0; infor[i].workID[0]; i++)
	{
		printf("%15s%10s%6d%15s%15s%15s%15s%10hd\n", 
			infor[i].workID, infor[i].name, infor[i].age, infor[i].phone, 
			infor[i].address, infor[i].job, infor[i].unit, infor[i].departmentID);
	}
	printf("\n");
}

void searchInfor(Info* infor)
{
	int choose = 0;
	printf("\n\t\t\t\t=====信息查询=====\n");
	printf("选择查询方式:\n");
	printf("0.   返  回\n");
	printf("1. 按工号查询\n");
	printf("2. 按姓名查询\n");
	printf("3. 按单位查询\n");
	printf("4. 按单位和部门编号查询\n>>> ");
inputChoose:
	scanf("%d", &choose);
	setBuf();
	switch (choose)
	{
	case 0:
		return;
	case 1:
		searchInforByWorkID(infor);
		break;
	case 2:
		searchInforByName(infor);
		break;
	case 3:
		searchInforByUnit(infor);
		break;
	case 4:
		searchInforByUnitAndDepartmentID(infor);
		break;
	default:
		printf("输入错误,请重新输入:");
		goto inputChoose;
		break;
	}
}

void sortInfor(Info* infor)
{
	int choose = 0;
	printf("\n\t\t\t\t=====信息排序=====\n");
	printf("选择排序方式:\n");
	printf("0.   返  回\n");
	printf("1. 按工号排序\n");
	printf("2. 按姓名排序\n");
	printf("3. 按单位排序\n");
	printf("4. 按单位和部门编号排序\n>>> ");
inputChoose:
	scanf("%d", &choose);
	setBuf();
	int len = 0;
	for (len = 0; infor[len].workID[0]; len++);	// 确定长度
	switch (choose)
	{
	case 0:
		return;
	case 1:
		sortWithWorkID(infor);
		break;
	case 2:
		sortWithName(infor);
		break;
	case 3:
		sortWithUnit(infor);
		break;
	case 4:
		sortWithUnitAndDepartmentID(infor);
		break;
	default:
		printf("输入错误,请重新输入:");
		goto inputChoose;
		break;
	}
	printf("\n\t\t\t\t=====排序完成=====\n\n");
}

void modifyInfor(Info* infor)
{
	int choose = 0;
	printf("\n\t\t\t\t=====信息修改=====\n\n");
	int sub = searchInforByWorkID(infor);

	printf("选择修改方式:\n");
	printf("0. 返回\n");
	printf("1. 全部修改\n");
	printf("2. 选择修改\n>>> ");
inputChoose:
	scanf("%d", &choose);
	setBuf();

	switch (choose)
	{
	case 0:
		return;
	case 1:
		modifyAll(&infor[sub]);
		break;
	case 2:
		modifyOne(&infor[sub]);
		break;
	default:
		printf("输入错误,请重新输入:");
		goto inputChoose;
		break;
	}

	printf("\n\t\t\t\t=====修改成功=====\n\n");

	printf("\n%15s%10s%6s%15s%15s%15s%15s%10s\n\n",
		"工号", "姓名", "年龄", "电话", "家庭住址", "职业", "单位", "部门编号");
	printf("%15s%10s%6d%15s%15s%15s%15s%10hd\n",
		infor[sub].workID, infor[sub].name, infor[sub].age, infor[sub].phone,
		infor[sub].address, infor[sub].job, infor[sub].unit, infor[sub].departmentID);
}

void saveInforIntoBinFile(Info* infor)
{
	FILE* fp = fopen("学生档案.info", "wb");
	if (!fp)
	{
		printf("文件打开失败");
		return;
	}
	fwrite(infor, sizeof(Info), MAXNUM, fp);
	fclose(fp);
	printf("\n\n\t\t\t\t=====保存成功=====\n\n");
}

void readInforFromBinFile(Info* infor)
{
	FILE* fp = fopen("学生档案.info", "rb");
	if (!fp)
	{
		printf("文件打开失败");
		return;
	}
	
	int k = 0;
	for (k = 0; infor[k].workID[0]; k++);
	fread(infor + k, sizeof(Info), MAXNUM, fp);
	fclose(fp);
	printf("\n\t\t\t\t=====读取成功=====\t\t\t\t\n");
}

int searchInforByWorkID(Info* infor)
{
	char workID[20] = { 0 };
	printf("\n搜索工号:");
	gets_s(workID, 20);

	printf("\n\t\t\t\t=====查询结果=====\n\n");
	printf("%15s%10s%6s%15s%15s%15s%15s%10s\n\n",
		"工号", "姓名", "年龄", "电话", "家庭住址", "职业", "单位", "部门编号");

	for (int i = 0; infor[i].workID[0]; i++)
	{
		if (strcmp(workID, infor[i].workID) == 0)
		{
			printf("%15s%10s%6d%15s%15s%15s%15s%10hd\n\n",
				infor[i].workID, infor[i].name, infor[i].age, infor[i].phone,
				infor[i].address, infor[i].job, infor[i].unit, infor[i].departmentID);
			return i;
		}
	}
	printf("\n");
	return -1;
}

void searchInforByName(Info* infor)
{
	char name[20] = { 0 };
	printf("\n搜索姓名:");
	gets_s(name, 20);

	printf("\n\t\t\t\t=====查询结果=====\n\n");
	printf("%15s%10s%6s%15s%15s%15s%15s%10s\n\n",
		"工号", "姓名", "年龄", "电话", "家庭住址", "职业", "单位", "部门编号");

	for (int i = 0; infor[i].workID[0]; i++)
	{
		if (strcmp(name, infor[i].name) == 0)
		{
			printf("%15s%10s%6hd%15s%15s%15s%15s%10hd\n",
				infor[i].workID, infor[i].name, infor[i].age, infor[i].phone,
				infor[i].address, infor[i].job, infor[i].unit, infor[i].departmentID);
		}
	}
	printf("\n");
}

void searchInforByUnit(Info* infor)
{
	char unit[20] = { 0 };
	printf("\n搜索单位:");
	gets_s(unit, 20);

	printf("\n\t\t\t\t=====查询结果=====\n\n");
	printf("%15s%10s%6s%15s%15s%15s%15s%10s\n\n",
		"工号", "姓名", "年龄", "电话", "家庭住址", "职业", "单位", "部门编号");

	for (int i = 0; infor[i].workID[0]; i++)
	{
		if (strcmp(unit, infor[i].unit) == 0)
		{
			printf("%15s%10s%6hd%15s%15s%15s%15s%10hd\n",
				infor[i].workID, infor[i].name, infor[i].age, infor[i].phone,
				infor[i].address, infor[i].job, infor[i].unit, infor[i].departmentID);
		}
	}
	printf("\n");
}

void searchInforByUnitAndDepartmentID(Info* infor)
{
	char unit[20] = { 0 };
	short departmentID = 0;

	printf("\n搜索单位:");
	gets_s(unit, 20);
	printf("输入部门编号:");
	scanf("%hd", &departmentID); setBuf();

	printf("\n\t\t\t\t=====查询结果=====\n\n");
	printf("%15s%10s%6s%15s%15s%15s%15s%10s\n\n",
		"工号", "姓名", "年龄", "电话", "家庭住址", "职业", "单位", "部门编号");

	for (int i = 0; infor[i].workID[0]; i++)
	{
		if (strcmp(unit, infor[i].unit) == 0 && departmentID == infor[i].departmentID)
		{
			printf("%15s%10s%6hd%15s%15s%15s%15s%10hd\n",
				infor[i].workID, infor[i].name, infor[i].age, infor[i].phone,
				infor[i].address, infor[i].job, infor[i].unit, infor[i].departmentID);
		}
	}
	printf("\n");
}

void sortWithWorkID(Info* infor)
{
	Info tmpInfor;
	int len = 0;
	for (len = 0; infor[len].workID[0]; len++); // 确定长度

	for (int i = 0; i < len; i++)
	{
		for (int j = 0; j < len - i - 1; j++)
		{
			// 比较大小
			if (strcmp(infor[j].workID, infor[j + 1].workID) > 0)
			{
				// 交换
				tmpInfor = infor[j];
				infor[j] = infor[j + 1];
				infor[j + 1] = tmpInfor;
			}
		}
	}
}

void sortWithName(Info* infor)
{
	Info tmpInfor;
	int len = 0;
	for (len = 0; infor[len].workID[0]; len++);

	for (int i = 0; i < len; i++)
	{
		for (int j = 0; j < len - i - 1; j++)
		{
			if (strcmp(infor[j].name, infor[j + 1].name) > 0)
			{
				tmpInfor = infor[j];
				infor[j] = infor[j + 1];
				infor[j + 1] = tmpInfor;
			}
		}
	}
}

void sortWithUnit(Info* infor)
{
	Info tmpInfor;
	int len = 0;
	for (len = 0; infor[len].workID[0]; len++);

	for (int i = 0; i < len; i++)
	{
		for (int j = 0; j < len - i - 1; j++)
		{
			if (strcmp(infor[j].unit, infor[j + 1].unit) > 0)
			{
				tmpInfor = infor[j];
				infor[j] = infor[j + 1];
				infor[j + 1] = tmpInfor;
			}
		}
	}
}

void sortWithUnitAndDepartmentID(Info* infor)
{
	Info tmpInfor;
	int len = 0;
	for (len = 0; infor[len].workID[0]; len++);

	for (int i = 0; i < len; i++)
	{
		for (int j = 0; j < len - i - 1; j++)
		{
			if (strcmp(infor[j].unit, infor[j + 1].unit) > 0)
			{
				tmpInfor = infor[j];
				infor[j] = infor[j + 1];
				infor[j + 1] = tmpInfor;
			}
			else if (strcmp(infor[j].unit, infor[j + 1].workID) == 0)
			{
				if (infor[j].departmentID > infor[j + 1].departmentID)
				{
					tmpInfor = infor[j];
					infor[j] = infor[j + 1];
					infor[j + 1] = tmpInfor;
				}
			}
		}
	}
}

void modifyAll(Info* infor)
{
	char getID[20] = { 0 };
	printf("\n输入修改后的各项信息:\n");

inputWorkID:
	printf(" 学  号 :"); gets_s(getID, 20);
	if (getID[0] == ' ' || getID[0] == NULL)
	{
		printf("学工号不能为空噢,请再试一次吧~\n");
		goto inputWorkID;
	}
	if (idIsInInfor(getID, infor))
	{
		printf("该学工号已存在,请检查学工号输入!\n");
		goto inputWorkID;
	}

	strcpy(infor->workID, getID);
	printf(" 姓  名 :"); 
	gets_s(infor->name, 20);
	printf(" 年  龄 :"); 
	scanf("%hd", &infor->age);
	setBuf();
	printf(" 电  话 :"); 
	gets_s(infor->phone, 20);
	printf("家庭住址:"); 
	gets_s(infor->address, 50);
	printf(" 职  业 :"); 
	gets_s(infor->job, 40);
	printf(" 单  位 :"); 
	gets_s(infor->unit, 20);
	printf("部门编号:"); 
	scanf("%hd", &infor->departmentID); 
	setBuf();
}

void modifyOne(Info* infor)
{
	printf("选择您想修改的项:\n");
	printf("1. 工号\n");
	printf("2. 姓名\n");
	printf("3. 年龄\n");
	printf("4. 电话\n");
	printf("5. 家庭住址\n");
	printf("6. 职业\n");
	printf("7. 单位\n");
	printf("8. 部门编号\n>>> ");

	int choose = 0;
	scanf("%d", &choose);
	setBuf();

	switch (choose)
	{
	case 1:
		printf("输入修改后的工号:");
		gets_s(infor->workID, 20);
		break;

	case 2:
		printf("输入修改后的姓名:");
		gets_s(infor->name, 20);
		break;

	case 3:
		printf("输入修改后的年龄:");
		scanf("%hd", &infor->age);
		setBuf();
		break;

	case 4:
		printf("输入修改后的电话:");
		gets_s(infor->phone, 20);
		break;

	case 5:
		printf("输入修改后的家庭住址:");
		gets_s(infor->address, 50);
		break;

	case 6:
		printf("输入修改后的职业:");
		gets_s(infor->job, 40);
		break;

	case 7:
		printf("输入修改后的单位:");
		gets_s(infor->unit, 20);
		break;

	case 8:
		printf("输入修改后的部门编号:");
		scanf("%hd", &infor->departmentID);
		setBuf();
		break;
	}
}

 88,跑路!

 

 

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值