0

基本的に文字列から読み取るalil関数をここに書き込もうとしています。3文字ごとに読み取り、前提条件(ifステートメント)を使用して評価します。条件が満たされると、それらの3文字が新しい3文字に置き換えられます。次に、新しい文字列を出力します。

コードを書いてみましたが、ロジックが正しくないようです。プログラムは実行されますが、何も出力されません。関数名と不正確さを気にしないでください。これをテストするためにサンプル関数を実行しています。

string amino_acids(string line)
{
    string acid;
    string acids;
    string newline;
    for( int i= 0; i < line.length(); i++)
    {
        acid = line[i];
    }
    for (int i = 0; i < 3; i++)
    {
        acids = acid[i];
        if(acids == "GUU")
        {
            acids = "ZAP";  
        }
        newline = acids;
    }
    cout << "Acids: " <<newline <<endl;
    return newline;
}
4

4 に答える 4

1

演算子をstd::string使用してaにインデックスを付けると、が生成されます。この場合、文字列がオーバーロードされます。[]charoperator=

酸(1文字の値を取る)が3文字の文字列と等しくなることは決してないので、意図したとおりにループしていたとしても(質問のコメントにあるように、おそらくそうではありません)。と比較し直してください。したがって、交換は実行されません。

やりたいことをするために、次のようなことを試してください。

for (int i = 0; i + 3 < line.length(); i += 3) // counting by 3 until end of line
{
    if (line.substr(i, 3) == "GUU")            // if the substring matches
    {
        line.assign("ZAP", i, 3);              // overwrite it with new substring
    }
}
return line;
于 2013-03-21T02:32:03.533 に答える
1
for( int i= 0; i < line.length(); i++)
    acid = line[i];

行に「abcd」が含まれているとします。このループは次のようになります。

acid = 'a';
acid = 'b';
acid = 'c';
acid = 'd';

最後の割り当てだけが永続的な影響を及ぼします。line から acid に実際に 3 文字を取得する必要がある場合は、.ではなく ,+=に文字を追加するために使用することをお勧めします。しかし、このように行全体をループすると、. もっと似たものが欲しいと思いますか?acid=acid = line;acid = line.substr(0, 3)

for (int i = 0; i < 3; i++)
{
     acids = acid[i];

これはクラッシュします。 acidは間違いなく単一の文字列であり、2 回目と 3 回目の繰り返しにインデックスacid[1]を付けています。acid[2]C++ を学習している間は、おそらく.at(i)無効なインデックスを使用しようとしたときに例外をスローする which を使用する必要があります。例外をキャッチして、少なくとも問題の兆候を示すことができます。そのままでは、未定義の動作です。

at を使用するには、try/catchブロックが必要です...基本的な形式は次のとおりです。

int main()
try
{
    ...your code in here...
    some_string.at(i);
}
catch (const std::exception& e)
{
    std::cerr << "caught exception: " << e.what() << '\n';
}

より一般的には、std::cout変数が実際にどのような値を持っているかがわかるように、コード全体にいくつかのステートメントを入れてみてください...期待したものではないことが簡単にわかります。または、対話型デバッガーを使用して、各ステートメントの実行の影響を監視します。

于 2013-03-21T02:34:48.060 に答える
0

あなたの説明を読むと、あなたはそのようなものが欲しい

//note below does not compile, its just psuedo-code

string amino_acid(const string& sequence){
  string result = sequence; //make copy of original sequence
  For i = 0 to sequence.length - 3 
    string next3Seq = sequence(i,3); //grab next 3 character from current index
    If next3Seq == 'GUU' //if the next next three sequence is 'GUU'
      then result.replace(i,3,'ZAP'); //replace 'GUU' with 'ZAP'
    EndIf
  EndFor
  return result;   
}

これをコーディングの開始点として使用できます。幸運を。

于 2013-03-21T02:42:03.380 に答える
0

あなたの質問に対する私の理解によると。私はいくつかのコードを書きました。以下をご覧ください

string acids;
string newLine;
int limit=1;
for(int i=0;i<line.length();i++)
{
    acids=acids+line[i];
    if(limit==3)//Every 3 characters
    {
      if(acids == "GUU")
        {
            acids = "ZAP";  
        }       
        limit=1;
        acids=""
        newline=newline+acids;
    }
limit++;
    return newline;
}
于 2013-03-21T02:43:57.443 に答える