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;
}
相关推荐
郝学胜-神的一滴1 分钟前
Linux下,获取子进程退出值和异常终止信号
linux·服务器·开发语言·c++·程序人生
AI科技星15 分钟前
张祥前统一场论动量公式P=m(C-V)误解解答
开发语言·数据结构·人工智能·经验分享·python·线性代数·算法
CodeByV35 分钟前
【C++】继承
开发语言·c++
权泽谦1 小时前
用 Python 做一个天气预报桌面小程序(附源码 + 打包与部署指导)
开发语言·python·小程序
ftpeak1 小时前
《Rust+Slint:跨平台GUI应用》第八章 窗体
开发语言·ui·rust·slint
森语林溪1 小时前
大数据环境搭建从零开始(十七):JDK 17 安装与配置完整指南
java·大数据·开发语言·centos·vmware·软件需求·虚拟机
lsx2024062 小时前
HTML 音频(Audio)详解
开发语言
woshihonghonga2 小时前
【动手学深度学习】
开发语言·python
威风的虫2 小时前
ES6 数组方法:告别循环,拥抱函数式编程
开发语言·前端·javascript
码界筑梦坊2 小时前
240-基于Python的医疗疾病数据可视化分析系统
开发语言·python·信息可视化·数据分析·毕业设计·echarts