首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我得到两个输出?

为什么我得到两个输出?
EN

Stack Overflow用户
提问于 2022-04-11 09:58:15
回答 2查看 60关注 0票数 0

我一直在为我的生物课写这段代码。这个想法是用户输入DNA和代码输出,相应的mRNA和it.It的氨基酸序列几乎没有任何错误,但是我注意到它有时会给出两个输出而不是一个输出。(例如,"Ile Met“而不是"Met")我也知道我的代码很乱,所以请您也帮忙一下,我应该更改哪些部分和如何更改?

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-11 11:42:17

你的窃听器是(mrna[k * 3 + 2] == 'U' || 'C' || 'A')。您可能认为这会检查mrna[k * 3 + 2]是否等于UCA。但这不是它的作用..。|| (“或”)操作符结合了三个条件--其中一个条件是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]保存在一个名称较短的变量中,以使这些表达式更短、更快(然而,现代优化器将自动为您完成此优化,即使您没有显式地进行此优化)。

票数 1
EN

Stack Overflow用户

发布于 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,您可以为每个三元组填充这个字符串。

代码语言:javascript
复制
#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;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71825869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档