疫情人员管理系统

代码部分

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN sizeof(struct building)
#define SUM 25	//总栋数
#define FLOOR 30	//楼层数
#define DOOR 3	//门户数
struct building 
{
	char name[21];
	int stqk;
	char phone[12];
};
struct building home[SUM][FLOOR][DOOR];
void write(FILE* fpw);	//改写数据
void scanmember();	//	查找人员信息
void scanbuiding();	//查找某栋楼情况
void scanll();	//查找感染者情况
void read();	//读取全部数据
void print();	//界面文本
void structnew();	//初始化结构
int main(void)
{	
	char choose;
	int i, j, k;
	FILE* fp;

	fp = fopen("data.txt", "a+");
	structnew();
	for (i = 0; i < SUM; i++)
	{
		for (j = 0; j < FLOOR; j++)
		{
			for (k = 0; k < DOOR; k++)
			{
				fwrite(&home[i][j][k], LEN, 1, fp);
			}
		}
	}
	fclose(fp);	//数据写入
	do
	{
		printf("\n");
		print();
		choose = getchar();
		switch (choose)
		{
		case 'A':
			write(fp);
			break;
		case 'B':
			scanmember();
			break;
		case'C':
			scanbuiding();
			break;
		case 'D':
			scanll();
			break;
		case'E':
			read();
			break;
		case 'F':
			break;
		}
		choose = getchar();
	} while (choose != 'F');	//若为F直接退出

	return 0;
}

void write(FILE *fpw)
{
	int x, y, z;	//结构三维度
	char chname[21];
	int chstqk;
	char chphone[12];
	int place;

	printf("正在执行改写操作:\n");
	printf("请输入目标楼号:");
	scanf("%d",&x);
	printf("\n请输入目标层数");
	scanf("%d", &y);
	printf("\n请输入目标户号");
	scanf("%d", &z);
	place = ((x - 1) * FLOOR * DOOR + (y - 1) * DOOR + (z - 1)) * LEN;
	fpw = fopen("data.txt", "r+");
	fseek(fpw, place, SEEK_SET);
	printf("\n请输入姓名:");
	scanf("%s", chname);
	strcpy(home[x-1][y-1][z-1].name, chname);
	printf("\n请输入身体情况,正常为0 患病为1:");
	scanf("%d", &chstqk);
	home[x-1][y-1][z-1].stqk = chstqk;
	printf("\n请输入电话号码:");
	scanf("%s", chphone);
	strcpy(home[x-1][y-1][z-1].phone, chphone);
	fwrite(&home[x-1][y-1][z-1],LEN,1,fpw);
	fclose(fpw);
	printf("改写完成\n");
	system("Pause");
	printf("\n");
}

void scanmember()
{
	char find[20];
	int i, j, k;
	int i0, j0, k0;

	printf("\n请输入要查找的人员姓名:");
	scanf("%s", find);
	for (i = 0; i < SUM; i++)
	{
		for (j = 0; j < FLOOR; j++)
		{
			for (k = 0; k < DOOR; k++)
			{
				if (strncmp(find, home[i][j][k].name, 20) == 0)
				{
					i0 = i;
					j0 = j;
					k0 = k;
					printf("%s %d %s", home[i0][j0][k0].name, home[i0][j0][k0].stqk, home[i0][j0][k0].phone);
				}
			}
		}
	}
	printf("\n");
	system("Pause");
}

void scanbuiding()
{
	int x;
	int r, t;

	printf("请输入要查找的楼号");
	scanf("%d", &x);
	for(r=0;r<FLOOR;r++)
		for (t = 0; t < DOOR; t++)
		{
			printf("第%d层 第%d户 %s %d %s", r+1, t+1, home[x-1][r][t].name, home[x-1][r][t].stqk, home[x-1][r][t].phone);
			printf("\n");
		}
	system("Pause");
}

void scanll()
{
	int q, w, e;
	for (q = 0; q < SUM; q++)
	{
		for (w = 0; w < FLOOR; w++)
		{
			for (e = 0; e < DOOR; e++)
			{
				if (home[q][w][e].stqk == 1)
					printf("第%d栋 第%d层 第%d户 %s %s\n", q+1, w+1, e+1, home[q][w][e].name, home[q][w][e].phone);
			}
		}
	}
	printf("\n");
	system("Pause");
}

void read()
{
	int b, n, m;
	for (b = 0; b < SUM; b++)
		for (n = 0; n < FLOOR; n++)
			for (m = 0; m < DOOR; m++)
				printf("第%d栋 第%d层 第%d户 %s %s\n", b+1, n+1, m+1, home[b][n][m].name, home[b][n][m].phone);
	printf("\n");
	system("Pause");
}

void print()
{
	printf("请输入要执行操作的序号\n");
	printf("A) 改写数据\n");
	printf("B) 查找人员信息\n");
	printf("C)查找楼栋情况\n");
	printf("D)查找感染者\n");
	printf("E) 读取全部信息\n");
	printf("F)退出系统\n");
	printf("\n");
}

void structnew()
{
	int i, j, k;
	for (i = 0; i < SUM; i++)
	{
		for (j = 0; j < FLOOR; j++)
		{
			for (k = 0; k < DOOR; k++)
			{
				strcpy(home[i][j][k].name,"none");
				strcpy(home[i][j][k].phone, "none");
				home[i][j][k].stqk = 0;
			}
		}
	}
}

出现的问题
1.在do while语句中以getchar获取switch的控制变量并作为出口判断的条件时,由逐步语句分析知当分支运行完后会跳回循环首执行一次print,再进入第二次循环,导致print运行两次。
2.三维结构数组在文本中的指针定位问题。
3.每次进入,文本文件被重新初始化问题。
4.输出数据时的定位问题。
解决方案
1.在switch语句后再加一个个体插入语句可以有效避免。
2.设结构三维度为a,b,c 目标指针位置为x,y,z 则要在x,y,z-1结束的的地方设为指针位置,所以位置为(x-1)*b+(y-1)*c+z-1个结构长度处。
3.暂无解决方案。
4输出数据由二维数组推至三维 与2问题类似。
方案优点
1.设置多个define 有助于代码编写的可读性。
2.结构体定义为全局变量方便函数调用。
3.主函数简洁明了。
4.模块设计便于功能的更改与扩写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值