C语言实现血型查询系统

1、题目:根据血型遗传关系,编程实现:(1)输入父亲或母亲一个人的血型时,输出子女可能的血型;(2)输入子女的血型时,输出其父母可能的血型;(3)同时输入父亲和母亲的血型时,输出子女可能的血型;(4)同时输入父母和子女血型时能判断是否具有血型血缘关系。

2、设计要求:(1)程序运行时有友好的操作提示界面;(2)可进行多人次输入,将血型关系总表输入文件保持,在主菜单中能选择查看血型关系总表;(3)有输入错误检查,并限制出错次数,如:应输入字母时输入其它内容,能提示错误并要求重新输入;(4)程序中有详细的注释说明;

3、设计思路:本设计基于血型对照表,血型对照表如下图所示。血型有A、B、AB和O型血四种,四种血型两两组合共有十六种情况。根据血型组合表,可以将这十六中组合存储到一个数组table当中,然后根据需要来设计不同功能如何读取数组、读取哪一个单元。

4、流程图

5、完整源程序

#include<stdio.h>

//从键盘中接收用户的选择,若输入不和发给出提示,让用户重新输入。 
int receive()	
{
	int in;
	int count = 4;
	while(count>0)
	{
		scanf("%d",&in);
		if(in>0 && in<5) break;	//合法输入,跳出循环 
		else	//非法输入,提示用户重新输入,并且记录输入次数 
		{
			count--;
			printf("\t\t输入错误!!!您还有%d次输入机会!\n\t\t请输入1、2、3或4:",count);
		}
	}
	return in;
}
//输入父亲或母亲一个人的血型时,输出子女可能的血型;
void func1(int bloodType[][6])	
{
	int in, i, j;
	int subTable[4] = {0,0,0,0};
	printf("\t\t++++++++++++++++++++++++++++++++++++++\n");
	printf("\t\t+ 父亲或母亲血型如下:\n");
	printf("\t\t+ 1、A型血\n");
	printf("\t\t+ 2、B型血\n");
	printf("\t\t+ 3、AB型血\n");
	printf("\t\t+ 4、O型血\n");
	printf("\t\t++++++++++++++++++++++++++++++++++++++\n");
	printf("\t\t输入:");
	in = receive();
	for(i=0; i<16; i++)
	{
		if(bloodType[i][0] == in)
		{
			for(j=2; j<6; j++)
			{
				if(bloodType[i][j] == 1)
					subTable[j-2] = 1;
			}
		}
	}
	printf("\t\t子女可能出现的血型为:");
	if(subTable[0] == 1) printf("\tA型 ");
	if(subTable[1] == 1) printf("\tB型 ");
	if(subTable[2] == 1) printf("\tAB型 ");
	if(subTable[3] == 1) printf("\tO型 ");
	printf("\n");
}
//输入子女的血型时,输出其父母可能的血型;
void func2(int bloodType[][6])
{
	int in, i, j;
	char subTable[3] = {'A','B','O'};

	printf("\t\t++++++++++++++++++++++++++++++++++++++\n");
	printf("\t\t+ 子女血型如下:\n");
	printf("\t\t+ 1、A型血\n");
	printf("\t\t+ 2、B型血\n");
	printf("\t\t+ 3、AB型血\n");
	printf("\t\t+ 4、O型血\n");
	printf("\t\t++++++++++++++++++++++++++++++++++++++\n");
	printf("\t\t输入:");
	in = receive();
	
	printf("\t\t父母可能的血型为:\n");
	for(i=0; i<10; i++)
	{
		if(bloodType[i][in+1] == 1)
		{
			if(bloodType[i][0] == 1) printf("\t\t\tA型 ");
			else if(bloodType[i][0] == 2) printf("\t\t\tB型 ");
			else if(bloodType[i][0] == 3) printf("\t\t\tAB型 ");
			else printf("\t\t\tO型");
			if(bloodType[i][1] == 1) printf("+ A型 \n");
			else if(bloodType[i][1] == 2) printf("+ B型 \n");
			else if(bloodType[i][1] == 3) printf("+ AB型 \n");
			else printf("+ O型 \n");
		}
	}
	printf("\n");
}
//同时输入父亲和母亲的血型时,输出子女可能的血型;
void func3(int bloodType[][6])
{
	int in1, in2;
	int i, j;

	printf("\t\t++++++++++++++++++++++++++++++++++++++\n");
	printf("\t\t+ 血型如下:\n");
	printf("\t\t+ 1、A型血\n");
	printf("\t\t+ 2、B型血\n");
	printf("\t\t+ 3、AB型血\n");
	printf("\t\t+ 4、O型血\n");
	printf("\t\t++++++++++++++++++++++++++++++++++++++\n");
	printf("\t\t请输入父亲血型的选项:");
	in1 = receive();
	printf("\t\t请输入母亲血型的选项:");
	in2 = receive();

	for(i=0; i<16; i++)
	{
		if(bloodType[i][0] == in1 && bloodType[i][1] == in2)
		{
			printf("\t\t子女可能的血型为:");
			for(j=2; j<6; j++)
			{
				if(bloodType[i][j] == 1)
				{
					if(j == 2) printf("A型 ");
					if(j == 3) printf("B型 ");
					if(j == 4) printf("AB型 ");
					if(j == 5)  printf("O型 ");
				}
			}
			printf("\n");
			break;
		}
	}
}
//同时输入父母和子女血型时能判断是否具有血型血缘关系。
void func4(int bloodType[][6])
{
	int in1, in2, in3;
	int i, j, flag = 0;
	printf("\t\t++++++++++++++++++++++++++++++++++++++\n");
	printf("\t\t+ 血型选择如下:\n");
	printf("\t\t+ 1、A型血\n");
	printf("\t\t+ 2、B型血\n");
	printf("\t\t+ 3、AB型血\n");
	printf("\t\t+ 4、O型血\n");
	printf("\t\t++++++++++++++++++++++++++++++++++++++\n");
	printf("\t\t请输入父亲血型的选项:");
	in1 = receive();
	printf("\t\t请输入母亲血型的选项:");
	in2 = receive();
	printf("\t\t请输入子女血型的选项:");
	in3 = receive();
	
	for(i=0; i<16; i++)
	{
		if(bloodType[i][0] == in1 && bloodType[i][1] == in2)
		{
			if(bloodType[i][in3+1] == 1)
			{
				printf("\t\t父母和子女有血缘关系\n\n");
				flag = 1;
			}
			break;
		}
	}
	if(flag == 0) printf("\t\t父母和子女没有血缘关系\n\n");
}
//控制函数,根据用户的选择调用不同的功能函数 
void console(int bloodTable[][6])
{
	int in, count, isEnd = 0;
	while(isEnd != 2)
	{
		printf("\t\t++++++++++++++++++++++++++++++++++++++\n");
		printf("\t\t+ 1、输入父亲或母亲一个人的血型\n");
		printf("\t\t+ 2、输入子女的血型\n");
		printf("\t\t+ 3、同时输入父亲和母亲的血型\n");
		printf("\t\t+ 4、输入父母和子女血型,确认血缘关系\n");
		printf("\t\t++++++++++++++++++++++++++++++++++++++\n");
		printf("\t\t输入:");
		in = receive();
		switch(in)
		{
		case 1 : func1(bloodTable); break;	
		case 2 : func2(bloodTable); break;
		case 3 : func3(bloodTable); break;	
		case 4 : func4(bloodTable); break;	
		default : break;
		}
		printf("\t\t是否要继续查询?\n");
		printf("\t\t++++++++++++++++++++++++++++++++++++++\n");
		printf("\t\t+ 1、继续\n");
		printf("\t\t+ 2、结束\n");
		printf("\t\t++++++++++++++++++++++++++++++++++++++\n");
		printf("\t\t输入:");
		count = 4;
		while(count>0)	//询问用户是否结束查询,并设置输入非法处理 
		{
			count--;
			scanf("%d",&isEnd);
			if(isEnd == 1 || isEnd == 2) break;
			else printf("\t\t输入错误!!!您还有%d次输入机会!\n\t\t请输入1或2:",count);
		}
	}
	printf("\t\t查询结束!!\n");
}

int main()
{
//	将A、B、AB、O四种血型,父母十六种组合存储到数组table[][]种
//	其中table[0]和table[1]表示父母的血型,值1、2、3、4分别代表A、B、AB、O四种血型
//	table[…][2]、table[…][3]、table[…][4]、table[…][5]表示子女的 A、B、AB、O四种血型,值为1表示存在,否则为0 
	int table[16][6] = {{1,1,1,0,0,1}, {1,2,1,1,1,1}, {1,3,1,1,1,0}, {1,4,1,0,0,1}, {2,2,0,1,0,1}, {2,3,1,1,1,0}, {2,4,0,1,0,1}, {3,3,1,1,1,0}, 
	{3,4,1,1,0,0},{4,4,1,1,1,0},{2,1,1,1,1,1}, {3,1,1,1,1,0}, {4,1,1,0,0,1}, {3,2,1,1,1,0}, {4,2,0,1,0,1}, {4,3,1,1,0,0}};
//	调用控制函数 
	console(table);
	return 0;
}

6、运行结果展示

posted @ 2019-06-16 09:49  神友  阅读(1836)  评论(0编辑  收藏  举报