创建DNA序列的补体并将其逆转为C ++

时间:2015-10-12 06:32:30

标签: c++ arrays pointers dna-sequence

所以我试图创建序列的补充 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;
}

3 个答案:

答案 0 :(得分:4)

标准的现代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;
}   

答案 1 :(得分:1)

像这样更改reverse方法

void reverse(char s[])
{
    while (*s) {
        switch(*s) {
        case 'A':
            *s = 'T';
            break;
        case 'G':
            *s = 'C';
            break;
        case 'C':
            *s = 'G';
            break;
        case 'T':
            *s = 'A';
            break;  
        }
        ++s;
    }
    return;
}

......你会得到正确的结果。

如果您不喜欢指针,请不要使用它们!在现代C ++中,指针通常不是必需的。下面的代码是C ++ 11(你有C ++ 11编译器?),就像我一样。

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

std::string reverse(std::string seq)
{
    auto lambda = [](const char c) {
        switch (c) {
        case 'A':
            return 'T';
        case 'G':
            return 'C';
        case 'C':
            return 'G';
        case 'T':
            return 'A';
        default:
            throw std::domain_error("Invalid nucleotide.");
        }
    };

    std::transform(seq.cbegin(), seq.cend(), seq.begin(), lambda);
    return seq;
}


int main()
{
    std::string seq("TGAGACTTCAGGCTCCTGGGCAACGTGCTGGTCTGTGTG");
    std::cout << "DNA sequence: " << std::endl << seq << std::endl;
    seq = reverse(seq);
    std::cout << "Reverse Compliment: " << std::endl << seq << std::endl;
    system("pause");
    return EXIT_SUCCESS;
}

一些注意事项:

  1. default声明中使用switch
  2. 在C ++中,最好从函数返回一个值,而不是通过指针操作一个变量。
  3. 首选std::string到普通字符。

答案 2 :(得分:1)

std::string 样式,看起来简单明了:我认为它可能对OP或其他人有用。

  

创建DNA序列的补体并将其逆转C ++

换句话说,它是DNA序列的反向互补,通过逆转DNA序列然后获得其补体可以很容易地实现。或者获得补充然后逆转。示例如下所示。

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

int main()
{
    std::string DNAseq = "TGAGACTTCAGGCTCCTGGGCAACGTGCTGGTCTGTGTGC";
    reverse(DNAseq.begin(), DNAseq.end());
    for (std::size_t i = 0; i < DNAseq.length(); ++i){
        switch (DNAseq[i]){
        case 'A':
            DNAseq[i] = 'T';
            break;    
        case 'C':
            DNAseq[i] = 'G';
            break;
        case 'G':
            DNAseq[i] = 'C';
            break;
        case 'T':
            DNAseq[i] = 'A';
            break;
        }
    }
    std::cout << "reverse complement : " << DNAseq << std::endl;
    return 0;
}