创建 DNA 序列的补码并将其反转 C++
creating complement of DNA sequence and reversing it C++
所以我正在尝试创建序列的补集
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 == '[=10=]')
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 != '[=10=]') {
*p = *q;
p++;
q++;
}
*p = c;
return;
}
像这样更改 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;
}
一些注意事项:
- 在
switch
语句中使用 default
。
- 在 C++ 中,return 来自函数的值比通过指针操作变量更好。
- 比普通字符更喜欢
std::string
。
标准的现代 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;
}
std::string
风格,看起来简单干净:我想它可能对OP或其他人有用。
creating complement of DNA sequence and reversing it 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;
}
所以我正在尝试创建序列的补集
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 == '[=10=]')
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 != '[=10=]') {
*p = *q;
p++;
q++;
}
*p = c;
return;
}
像这样更改 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;
}
一些注意事项:
- 在
switch
语句中使用default
。 - 在 C++ 中,return 来自函数的值比通过指针操作变量更好。
- 比普通字符更喜欢
std::string
。
标准的现代 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;
}
std::string
风格,看起来简单干净:我想它可能对OP或其他人有用。
creating complement of DNA sequence and reversing it 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;
}