C语言-基因序列转换独热码(one-hot code)

1.题目要求

复制代码
(语言: C)在生物信息学家处理基因序列时,经常需要将基因序列转化为独热码,在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。
如基因序列有四种状态,ATCG。分别可以转化为0001,0010,0100,1000。
如果遇到其他字符,则转化为0000。如遇到atcg,也转化为0001,0010,0100,1000。
请一次性输入若干段序列,并输入这些序列的独热码。(因段数以及序列长度不确定,需要使用动态数组,测试用例中每行长度不超过20)

如
输入:
2
ATCG
AAAA
输出:
0001001001001000
0001000100010001

2.代码实现

1.方法一(二维数组)

比较科学且正常的做法

cpp 复制代码
#include <stdio.h>
#include <string.h>

void convert(char *sequence, char result[][5]);

int main() {
    int n;
    scanf("%d", &n);

    char sequences[20][20];
    char results[20][20 * 4];

    for (int i = 0; i < n; i++) {
        scanf("%s", sequences[i]);
        convert(sequences[i], (char (*)[5])results[i]);
        printf("%s\n", results[i]);
    }

    return 0;
}
void convert(char *sequence, char result[][5]) {
    int len = strlen(sequence);
    for (int i = 0; i < len; i++) {
        switch (sequence[i]) {
            case 'A':
                strcpy(result[i], "0001");
                break;
            case 'T':
                strcpy(result[i], "0010");
                break;
            case 'C':
                strcpy(result[i], "0100");
                break;
            case 'G':
                strcpy(result[i], "1000");
                break;
            default:
                strcpy(result[i], "0000");
        }
    }
}

2.方法二(一维数组)

纯属瞎捣鼓,不建议......

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>

int main()
{
    int n;
    int count = 0;
    // 提示输入要处理的序列数量
    printf("请输入要处理的序列数量:");
    scanf("%d", &n);
    // 提示输入 n 段基因序列
    printf("请输入%d段基因序列:\n", n);
    char *array = (char *)malloc(n * 21 * sizeof(char));
    for (int i = 0; i < n * 20; i++) {
        scanf("%c", &array[i]);
        if (array[i] == '\n') {
            array[i] = '0';
            count++;
        }
        if (count > n) {
            break;
        }
    }
    int countPRO = 0;
    // 输出独热码的提示
    printf("独热码如下:\n");
    for (int i = 0; i < n * 20; i++) {
        if (array[i] == 'A' || array[i] == 'a') {
            printf("0001");
        } else if (array[i] == 'T' || array[i] == 't') {
            printf("0010");
        } else if (array[i] == 'C' || array[i] == 'c') {
            printf("0100");
        } else if (array[i] == 'G' || array[i] == 'g') {
            printf("1000");
        } else if (array[i]!= '0') {
            printf("0000");
        } else {
            if (i!= 0 && countPRO!= n) {
                printf("\n");
            }
            countPRO++;
        }
        if (countPRO > n) {
            break;
        }
    }
    free(array);
    return 0;
}
相关推荐
Predestination王瀞潞28 分钟前
IO操作(Num22)
开发语言·c++
宋恩淇要努力2 小时前
C++继承
开发语言·c++
迎風吹頭髮2 小时前
UNIX下C语言编程与实践53-UNIX 共享内存控制:shmctl 函数与共享内存管理
服务器·c语言·unix
沿着路走到底3 小时前
python 基础
开发语言·python
沐知全栈开发4 小时前
C# 委托(Delegate)
开发语言
任子菲阳4 小时前
学Java第三十四天-----抽象类和抽象方法
java·开发语言
csbysj20205 小时前
如何使用 XML Schema
开发语言
R6bandito_5 小时前
STM32中printf的重定向详解
开发语言·经验分享·stm32·单片机·嵌入式硬件·mcu
逆小舟5 小时前
【C/C++】指针
c语言·c++·笔记·学习
earthzhang20215 小时前
【1007】计算(a+b)×c的值
c语言·开发语言·数据结构·算法·青少年编程