标题:血型遗传
只看楼主
zh7744123
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-5-2
结帖率:100%
 问题点数:0 回复次数:8 
血型遗传
能不能修改一下这个源代码?血型遗传的。#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()
{
    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;
}
搜索更多相关主题的帖子: int break count 输入 printf 
2020-05-27 18:59
zh7744123
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-5-2
得分:0 
这源代码是对的,我就想能不能有其他的写法。
根据血型遗传关系,编程实现:○1.输入父亲或母亲一个人的血型时,输出子女可能的血型,○2.输入子女的血型时,输出其父母可能的血型,○3.同时输入父亲和母亲的血型时,输出子女可能的血型, ○4.同时输入父母和子女血型时能判断是否具有血型血缘关系。
○1.程序运行时有友好的操作提示界面;
○2.可进行多人次输入,将血型关系总表输入文件保持,在主菜单中能选择查看血型关系总表;
    ○3.有输入错误检查,并限制出错次数,如:应输入字母时输入其它内容,能提示错误并要求重新输入;
○4.程序中有详细的注释说明;
2020-05-27 19:25
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
这个数组应该记载的是结论。
你要想甩掉它,那就不妨回溯一个层面,用基因表达。
反正血型这东西就是排列组合出来的。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-05-27 20:08
zh7744123
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-5-2
得分:0 
能不能改成指针类型啊
2020-05-27 21:48
zh7744123
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2020-5-2
得分:0 
哪个大佬帮我写一下呀,呜呜呜
2020-05-27 21:57
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
做个关系数据表,直接查表
2020-05-28 17:12
tang_xiaohu
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2021-5-27
得分:0 
回复 2楼 zh7744123
可以加个好友嘛楼主?
2021-05-27 13:49
我善治鬼
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:107
专家分:181
注 册:2015-2-16
得分:0 
我测试一下使用简单没有什么问题, 就是有一个函数出现了严重问题, 如果输入一个错误数整个程序将崩溃

程序代码:
int receive2()  // 这个函数有BUG, 即使输入错误也返回错误值, 导致整个程序崩溃
{
    int in;
    int count = 4;
    while (count > 0)
    {
        scanf_s("%d", &in);
        if (in > 0 && in < 5) break;
        else
        {
            count--;
            printf("\t\t输入错误!!!您还有%d次输入机会!\n\t\t请输入1、2、3或4:", count);
        }
    }
    return in; 
}


int receive(int *in)   // 应该改成这样
{
   if (!in) return 0;
    int count = 4;
    while (count > 0)
    {
        scanf_s("%d", &in);
        if (*in > 0 && *in < 5) break;
        else
        {
            count--;
            printf("\t\t输入错误!!!您还有%d次输入机会!\n\t\t请输入1、2、3或4:", count);
        }
    }
    return 1;
}

2021-05-27 15:09
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:554
专家分:3690
注 册:2019-7-29
得分:0 
我改了一版,改到最后感觉没改出啥有价值的东西,不过都改完了,本着不浪费的原则,就发出来吧,各位大佬将就看看吧,不喜勿喷。

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int receive(int *array)
{
    int flag=0,count = 4;
    while(count>0)
    {
        printf("\t\t输入:");
        scanf("%d,%d,%d",&array[0],&array[1],&array[2]);
        if(array[0]==0&&array[1]==0&&array[2]==0)
        {
            count--;
            printf("\t\t输入错误!!!您还有%d次输入机会!\n\t\t输入不能全为0:",count);
        }
        if((array[0]==0||array[1]==0)&&array[2]!=0)
        {
            count--;
            printf("\t\t输入错误!!!您还有%d次输入机会!\n\t\t子女和父母要同时已知0:",count);
        }
        else if(array[0]==0&&array[1]==0&&array[2]==0)
        {
            count--;
            printf("\t\t输入错误!!!您还有%d次输入机会!\n\t\t请输入0、1、2、3或4:",count);
        }
        else
        {
            flag=1;
            break;
        }
    }
    return flag;
}

void func(int array[],int bloodType[][6],int num)
{
    int i,j,state[4]= {0},state2=0,state3[num][2],count=0,type;
    char str[4][10]= {{"A型"},{"B型"},{"AB型"},{"O型"}};

    //0.输入父亲一个人的血型.
    //1.输入母亲一个人的血型.
    //2.输入子女的血型.
    //3.同时输入父亲和母亲的血型.
    //4.输入父母和子女血型,确认血缘关系
    //类型0.1.3:使用state 0-3.类型2:使用state 0-15.类型4:使用state 0。
    if(array[2]!=0)
    {
        if(array[0]!=0&&array[1]!=0)
            type=4;
        else
            type=2;
    }
    else
    {
        if(array[0]!=0&&array[1]!=0)
            type=3;
        else if(array[0]==0)
            type=0;
        else if(array[1]==0)
            type=1;
    }

    for(i=0; i<num; i++)
    {
        if((state2==1)||((state[0]+state[1]+state[2]+state[3])==4))
            break;

        switch(type)
        {
        case 0:
            if(array[0]==bloodType[i][0])
            {
                for(j=2; j<6; j++)
                {
                    if(bloodType[i][j]!=0)
                        state[j-2]=1;
                }
                if((state[0]+state[1]+state[2]+state[3])==4)
                    break;
            }
            break;
        case 1:
            if(array[1]==bloodType[i][1])
            {
                for(j=2; j<6; j++)
                {
                    if(bloodType[i][j]!=0)
                        state[j-2]=1;
                }
                if((state[0]+state[1]+state[2]+state[3])==4)
                    break;
            }
            break;
        case 3:
            if((array[0]==bloodType[i][0])&&(array[1]==bloodType[i][1]))
            {
                for(j=2; j<6; j++)
                {
                    if(bloodType[i][j]!=0)
                        state[j-2]=1;
                }
                if((state[0]+state[1]+state[2]+state[3])==4)
                    break;
            }
            break;
        case 2:
            for(j=2; j<6; j++)
            {
                if(bloodType[i][j]==array[2])
                {
                    state3[count][0]=bloodType[i][0];
                    state3[count][1]=bloodType[i][1];
                    count++;
                    break;
                }
            }
            break;
        case 4:
            if((array[0]==bloodType[i][0])&&(array[1]==bloodType[i][1]))
            {
                if(bloodType[i][array[2]+1]==1)
                    state2=1;
            }
            break;
        }
    }

    switch(type)
    {
    case 0:
    case 1:
    case 3:
        printf("\t\t子女可能出现的血型为:");
        for(j=0; j<4; j++)
            if(state[j]==1)
                printf("%s ",str[j]);
        printf("\n");
        break;
    case 2:
        printf("\t\t父母可能的血型为:\n");
        for(j=0; j<count; j++)
        {
            printf("父亲%s +母亲%s\n",str[state3[j][0]],str[state3[j][1]]);
        }
        break;
    case 4:
        if(state2==1)
            printf("\t\t父母和子女有血缘关系\n\n");
        else
            printf("\t\t父母和子女没有血缘关系\n\n");
        break;
    }
}

void console(int bloodTable[][6],int num)
{
    int array[3],count, isEnd = 0;
    while(isEnd != 2)
    {
        printf("请输入父亲、母亲及子女三个人的血型(未知用0表示):\n");
        if(receive(array)==1)
            func(array,bloodTable,num);

        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()
{
    FILE *file;
    int num=0,*table=NULL,ret;

    //1.A型 2.B型 3.AB型 4.O型

    if(access("./ceshi.txt",0)==-1)     //判断文件是否存在
    {
        printf("列表文件不存在!\n");
        system("pause");
        return 0;
    }

    if((file=fopen("./ceshi.txt","r"))==NULL)
    {
        printf("打开文件失败!\n");
        system("pause");
        return 0;
    }

    while(1)
    {
        table=realloc(table,(num*6+6)*sizeof(int));
        //父、母、子A、子B、子AB、子O
        ret=fscanf(file,"%d,%d,%d,%d,%d,%d,\n",&table[num*6],&table[num*6+1],&table[num*6+2],&table[num*6+3],&table[num*6+4],&table[num*6+5]);
        if(ret==EOF)  //ASCLL文件结束
            break;
        if(ret!=6)      //读取文件错误
        {
            printf("读取文件错误!\n");
            if(table!=NULL)
                free(table);
            system("pause");
            return 0;
        }
        num++;
    }

    if(fclose(file)!=0)                                 //关闭文件,并检查是否成功关闭
    {
        printf("文件关闭错误!\n");
        if(table!=NULL)
            free(table);
        system("pause");
        return 0;
    }

    console((int(*)[6])table,num);

    if(table!=NULL)
        free(table);
    system("pause");
    return 0;
}


文件内容
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,

一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2021-06-01 15:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-501823-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.223599 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved