所以我试图创建序列的补充
TGAGACTTCAGGCTCCTGGGCAACGTGCTGGTCTGTGTGC
但是我的输出没有按预期工作。
序列中每个字母的补码是
A -> T
G -> C
C -> G
T -> A

我已经用 Java 编程一年多了,所以我对 C++ 中的指针真的很生疏,我猜问题在于反向方法,指针的方式在函数调用的每次传递中都发生了变化

#include<stdio.h>
#include<iostream>
using namespace std;

void reverse(char s[]);

int main() {
    char s[40] = {'T','G','A','G','A','C','T','T','C','A','G','G','C','T','C','C','T','G','G','G','C','A','A','C','G','T','G','C','T','G','G','T','C','T','G','T','G','T','G'};

    cout << "DNA sequence: "<< endl << s << endl;

    reverse(s);

    cout << "Reverse Compliment: "<< endl << s << endl;



    system("pause");
}

void reverse(char s[])
{
    char c;
    char *p, *q;

    p = s;

    if (!p)
        return;

    q = p + 1;
    if (*q == '\0')
        return;

    c = *p;
    reverse(q);

    switch(c) {
        case 'A':
            *p = 'T';
            break;
        case 'G':
            *p = 'C';
            break;
        case 'C':
            *p = 'G';
            break;
        case 'T':
            *p = 'A';
            break;
    }
    while (*q != '\0') {
        *p = *q;
        p++;
        q++;
    }

    *p = c;

    return;
}

最佳答案

标准的现代 C++ 使这种低级的、面向指针的编程变得不必要(实际上,您正在有效地编写 C)。

一旦你有了一个函数,比如 complement ,它将一个核苷酸转换成它的补码,你只需要应用一些标准库函数,比如 transform

这是用 C++11 重写的程序:

#include <string>
#include <iostream>
#include <algorithm>
#include <cassert>


using namespace std;


char complement(char n)
{
    switch(n)
    {
    case 'A':
        return 'T';
    case 'T':
        return 'A';
    case 'G':
        return 'C';
    case 'C':
        return 'G';
    }
    assert(false);
    return ' ';
}


int main()
{
    string nucs = "ACAATTGGA";
    transform(
        begin(nucs),
        end(nucs),
        begin(nucs),
        complement);
    cout << nucs << endl;
}

关于c++ - 创建 DNA 序列的补充并将其反转 C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33074574/

10-10 03:45