我一直在为我的生物课写这段代码。这个想法是用户输入DNA和代码输出,相应的mRNA和it.It的氨基酸序列几乎没有任何错误,但是我注意到它有时会给出两个输出而不是一个输出。(例如,"Ile Met“而不是"Met")我也知道我的代码很乱,所以请您也帮忙一下,我应该更改哪些部分和如何更改?
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
string sdna;
cout << "Enter codogener strang: ";
cin >> sdna;
int n = sdna.size();
char dna[100];
char mrna[100];
strcpy_s(dna, sdna.c_str());
cout << "DNA: ";
for (int i = 0; i < n; i++) {
cout << dna[i];
if (i % 3 == 2)
cout << " ";
}
for (int i = 0; i < n; i++)
{
if (dna[i] == 'A')
mrna[i] = 'U';
else if (dna[i] == 'T')
mrna[i] = 'A';
else if (dna[i] == 'G')
mrna[i] = 'C';
else if (dna[i] == 'C')
mrna[i] = 'G';
}
cout << "\nmRNA: ";
for (int i = 0; i < n; i++)
{
cout << mrna[i];
if (i % 3 == 2)
cout << " ";
}
cout << "\n";
for (int k = 0; k < n; k++) {
if ((mrna[k * 3] == 'A') && (mrna[k * 3 + 1] == 'U') && (mrna[k * 3 + 2] == 'U' || 'C' || 'A'))
cout << "Ile ";
if ((mrna[k * 3] == 'A') && (mrna[k * 3 + 1] == 'U') && (mrna[k * 3 + 2] == 'G'))
cout << "Met ";
if ((mrna[k * 3] == 'A') && (mrna[k * 3 + 1] == 'C') && (mrna[k * 3 + 2] == 'U' || 'C' || 'A' || 'G'))
cout << "Thr ";
if ((mrna[k * 3] == 'A') && (mrna[k * 3 + 1] == 'A') && (mrna[k * 3 + 2] == 'U' || 'C'))
cout << "Asn ";
if ((mrna[k * 3] == 'A') && (mrna[k * 3 + 1] == 'A') && (mrna[k * 3 + 2] == 'G' || 'A'))
cout << "Lys ";
if ((mrna[k * 3] == 'A') && (mrna[k * 3 + 1] == 'G') && (mrna[k * 3 + 2] == 'U' || 'C'))
cout << "Ser ";
if ((mrna[k * 3] == 'A') && (mrna[k * 3 + 1] == 'G') && (mrna[k * 3 + 2] == 'G' || 'A'))
cout << "Arg ";
if ((mrna[k * 3] == 'G') && (mrna[k * 3 + 1] == 'U') && (mrna[k * 3 + 2] == 'U' || 'C' || 'A' || 'G'))
cout << "Val ";
if ((mrna[k * 3] == 'G') && (mrna[k * 3 + 1] == 'C') && (mrna[k * 3 + 2] == 'U' || 'C' || 'A' || 'G'))
cout << "Ala ";
if ((mrna[k * 3] == 'G') && (mrna[k * 3 + 1] == 'A') && (mrna[k * 3 + 2] == 'U' || 'C'))
cout << "Asp ";
if ((mrna[k * 3] == 'G') && (mrna[k * 3 + 1] == 'A') && (mrna[k * 3 + 2] == 'A' || 'G'))
cout << "Glu ";
if ((mrna[k * 3] == 'G') && (mrna[k * 3 + 1] == 'G') && (mrna[k * 3 + 2] == 'U' || 'C' || 'A' || 'G'))
cout << "Gly ";
if ((mrna[k * 3] == 'U') && (mrna[k * 3 + 1] == 'U') && (mrna[k * 3 + 2] == 'U' || 'C'))
cout << "Phe ";
if ((mrna[k * 3] == 'U') && (mrna[k * 3 + 1] == 'U') && (mrna[k * 3 + 2] == 'A' || 'G'))
cout << "Leu ";
if ((mrna[k * 3] == 'U') && (mrna[k * 3 + 1] == 'C') && (mrna[k * 3 + 2] == 'U' || 'C' || 'A' || 'G'))
cout << "Ser ";
if ((mrna[k * 3] == 'U') && (mrna[k * 3 + 1] == 'A') && (mrna[k * 3 + 2] == 'A' || 'G')) {
cout << "Stopp ";
return 0;
}
if ((mrna[k * 3] == 'U') && (mrna[k * 3 + 1] == 'A') && (mrna[k * 3 + 2] == 'U' || 'C'))
cout << "Tyr ";
if ((mrna[k * 3] == 'U') && (mrna[k * 3 + 1] == 'G') && (mrna[k * 3 + 2] == 'A')) {
cout << "Stopp ";
return 0;
if ((mrna[k * 3] == 'U') && (mrna[k * 3 + 1] == 'G') && (mrna[k * 3 + 2] == 'U' || 'C'))
cout << "Cys ";
}
if ((mrna[k * 3] == 'U') && (mrna[k * 3 + 1] == 'G') && (mrna[k * 3 + 2] == 'G'))
cout << "Trp ";
if ((mrna[k * 3] == 'C') && (mrna[k * 3 + 1] == 'U') && (mrna[k * 3 + 2] == 'U' || 'C' || 'A' || 'G'))
cout << "Leu ";
if ((mrna[k * 3] == 'C') && (mrna[k * 3 + 1] == 'C') && (mrna[k * 3 + 2] == 'U' || 'C' || 'A' || 'G'))
cout << "Pro ";
if ((mrna[k * 3] == 'C') && (mrna[k * 3 + 1] == 'A') && (mrna[k * 3 + 2] == 'U' || 'C'))
cout << "His ";
if ((mrna[k * 3] == 'C') && (mrna[k * 3 + 1] == 'A') && (mrna[k * 3 + 2] == 'A' || 'G'))
cout << "Gln ";
if ((mrna[k * 3] == 'C') && (mrna[k * 3 + 1] == 'G') && (mrna[k * 3 + 2] == 'U' || 'C' || 'A' || 'G'))
cout << "Arg ";
}
return 0;
}发布于 2022-04-11 11:42:17
你的窃听器是(mrna[k * 3 + 2] == 'U' || 'C' || 'A')。您可能认为这会检查mrna[k * 3 + 2]是否等于U、C或A。但这不是它的作用..。|| (“或”)操作符结合了三个条件--其中一个条件是mrna[k * 3 + 2] == 'U',正如您所预期的,但另外两个条件是'C'和'A'。C/C++语言将这些字符常量视为无条件真(因为它们是不等于零的数字),因此整个表达式是无条件的。
正确的代码将是(mrna[k * 3 + 2] == 'U' || mrna[k * 3 + 2] == 'C' || mrna[k * 3 + 2] == 'A')。
您可以将mrna[k * 3 + 2]保存在一个名称较短的变量中,以使这些表达式更短、更快(然而,现代优化器将自动为您完成此优化,即使您没有显式地进行此优化)。
发布于 2022-04-11 10:37:35
我对你在mrna[k * 3 + 2] == 'U' || 'C' || 'A'表格中的所有条件表示怀疑。这不检查mrna[k * 3 + 2]与这三个字母中的任何一个,它是无条件的true。
我还建议不要使用char [100]。您已经在阅读一个std::string,它也有operator[],也有operator==。
您还(可能)在数据结束后建立索引。循环条件是k < n,其中n是mrna的“长度”,但是索引mrna[k * 3]。要么更改条件,要么更改索引方式。
但是,我最建议的是用一个if替换长串的std::map,您可以为每个三元组填充这个字符串。
#include <iostream>
#include <string>
#include <map>
void print_triple(const std::string & s)
{
for (int i = 0; i < s.size(); i++) {
std::cout << s[i];
if (i % 3 == 2)
std::cout << " ";
}
}
static std::map<std::string, std::string> mrna_lookup
{
{ "AUU", "Ile " },
{ "AUC", "Ile " },
{ "AUA", "Ile " },
{ "AUG", "Met " },
// etc
};
int main()
{
std::string dna;
std::cout << "Enter codogener strang: ";
std::cin >> dna;
std::cout << "DNA: ";
print_triple(dna);
std::string mrna;
for (char c : dna)
{
switch (c)
{
case 'A': mrna.push_back('U'); break;
case 'T': mrna.push_back('A'); break;
case 'G': mrna.push_back('C'); break;
case 'C': mrna.push_back('G'); break;
}
}
cout << "\nmRNA: ";
print_triple(mrna);
cout << "\n";
std::string_view mrna_view = mrna; // view so .substr doesn't copy
for (int k = 0; k+2 < mrna.size(); k += 3)
{
auto it = mrna_lookup.find(mrna_view.substr(k, 3));
if (it != mrna_lookup.end())
{
std::cout << it->second;
if (it->second == "Stopp ")
{
return 0;
}
}
}
return 0;
}https://stackoverflow.com/questions/71825869
复制相似问题