一次接单的题,档案管理系统,标题是《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,跑路!