わかりました、コドンが正確にいくつあるか言われたことは無視して、より一般的な解決策を説明します.
各コドンは正確に 3 文字に変換されることがわかっているので、必要なバッファーのサイズを前もって計算できます。あなたの場合、もちろん固定サイズのバッファを使用できます。終端の NUL 文字のためのスペースを残すことを忘れないでください。この出力バッファは配列になります。それは次のようになります。
void printEncodingCodonSequences(
char aminoAcid1,
char aminoAcid2,
char aminoAcid3,
char aminoAcid4,
char aminoAcid5 )
{
char outputBuffer[16]; // 5 codons, exactly
char codons[] = { aminoAcid1, aminoAcid2, aminoAcid3, aminoAcid4, aminoAcid5 };
findCodonEncodingCombinations(outputBuffer, outputBuffer, codons, 5);
}
次に、各コドンを考えられるすべての配列にマッピングし、与えられたコドンの数だけこれを繰り返す必要があります。これは組み合わせ問題であるため、再帰に非常に適しています。この関数は最初のコドンを受け取り、さまざまな可能なエンコーディングを反復処理します。繰り返しのたびに、残りのコドンを処理するために自分自身を再度呼び出します。
int findCodonEncodingCombinations( char* outputBuffer, char* outputPos, char* codons, int remaining )
{
if (remaining == 0) {
*outputPos = 0;
puts(outputBuffer);
puts("\n");
return 1;
}
int combinations = 0;
switch (*codon) {
case 'D': // GAT, GAC
case 'd':
outputPos[0] = 'G';
outputPos[1] = 'A';
outputPos[2] = 'T';
combinations += findCodonEncodingCombinations(outputBuffer, outputPos + 3, codons + 1, remaining - 1);
outputPos[2] = 'C';
combinations += findCodonEncodingCombinations(outputBuffer, outputPos + 3, codons + 1, remaining - 1);
break;
}
return combinations;
}
実際、ループはこの問題にはあまり役に立ちません。ただし、次のように、すべての入力が有効であることを確認するために使用できます。
void printEncodingCodonSequences(
char aminoAcid1,
char aminoAcid2,
char aminoAcid3,
char aminoAcid4,
char aminoAcid5 )
{
char outputBuffer[16]; // 5 codons, exactly
char codons[] = { aminoAcid1, aminoAcid2, aminoAcid3, aminoAcid4, aminoAcid5 };
if (!validateCodons(codons, 5)) return;
findCodonEncodingCombinations(outputBuffer, outputBuffer, codons, 5);
}
bool validateCodons( char* codons, int count )
{
while (count--) { // it's a loop :)
switch (*codons++) {
case 'd':
case 'D':
//...
break;
default: // unrecognized codon
puts("?\n");
return false;
}
}
return true;
}
明らかに、他の多くのコドン マッピングを入力する必要があります。