1

我需要编写的代码让用户输入一个 mRna 链,该链存储在一个 char 数组中。该 mRNa 链必须以字符“a”、“u”、“g”开头。我不知道如何验证这是否属实。我考虑过获取整数值的总和并对其进行测试,但我不能这样做,因为它与可以输入的另外 3 个字母的字母相匹配。

此外,每三个字母翻译成一个氨基酸。我不知道如何取每个三个字母并翻译它。

我的第二个问题的一个例子 mRNA 字符串是 auguuuauu

蛋氨酸的八月代码。

uuu 代码为苯丙氨酸。

异亮氨酸的auu代码。

所以程序会继续阅读每组 3 个并翻译它。然后将这些值存储在字符数组中。我正在考虑这样做的方式是制作一个循环,一次将 3 个值存储到一个 char 数组中。我不知道如何使用该 char 数组来分析该值是什么并将其更改为需要的值。一旦它改变了,我就会把它拖到最后。

4

3 回答 3

8

好吧,如果你知道它是前三个,你总是可以这样做:

char *strand;

// load string in there

if (3 >= strlen(strand) && ( strncmp("aug",strand,3) == 0 )) {
    // do stuff
}

很快,你得到了你的确认。

如果您需要处理不同的订单,也许您可​​以澄清您的问题。

编辑:

如果您需要其中之一:

char *strand;

// load string in there

if (3 >= strlen(strand) && 
      (   strncmp("aug",strand,3) == 0
       || strncmp("agu",strand,3) == 0
       || strncmp("gau",strand,3) == 0
       || strncmp("gua",strand,3) == 0
       || strncmp("uga",strand,3) == 0
       || strncmp("uag",strand,3) == 0 )
{
    // do stuff
}

如果您需要这些字母的任何排列:

char *strand;
int matchCount = 0;

// load string in there

if (3 >= strlen(strand))
{
    switch (strand[0])
    {
        case 'a':
        case 'u':
        case 'g':
            matchCount++;
            break:
    }
    switch (strand[1])
    {
        case 'a':
        case 'u':
        case 'g':
            matchCount++;
            break:
    }
    switch (strand[2])
    {
        case 'a':
        case 'u':
        case 'g':
            matchCount++;
            break:
    }
}

if (3 == matchCount) {
    // do stuff
}

好的,鉴于您的更新,这是您第二个问题的解决方案。

#define METHIONINE    "aug"
#define PHENYLALAINE  "uuu"
#define ISOLEUCINE    "auu"

#define UNDEFINEDVALUE     0
#define METHIONINEVALUE    1
#define PHENYLALAINEVALUE  2
#define ISOLEUCINEVALUE    3

#define NUMBEROFACIDS  256

char *strand,*strandItr;
int aminoAcidList[NUMBEROFACIDS]={UNDEFINEDVALUE};
int aminoAcidCount = 0;
unsigned int i = 0;

// load string in there

if ((strlen(strand) % 3)) != 0)
{
    // your string doesn't only have these three-long amino acids
}

aminoAcidCount = strlen(strand)/3;

for (i = 0; i < aminoAcidCount; i++)
{
    if (strncmp(METHIONINE,(strand + i*3),3) == 0)
    {
        aminoAcidList[i] = METHIONINEVALUE;
    }
    else if (strncmp(PHENYLALAINE,(strand + i*3),3) == 0)
    {
        aminoAcidList[i] = PHENYLALAINEVALUE;
    }
    else if (strncmp(ISOLEUCINE,(strand + i*3),3) == 0)
    {
        aminoAcidList[i] = ISOLEUCINEVALUE;
    }
}

// do other stuff

for (i = 0; i < aminoAcidCount; i++)
{
    switch (aminoAcidList[i])
    {
        case METHIONINEVALUE:
            printf ("Methionine\n");
            break;
        case PHENYLALAINEVALUE:
            printf ("Phenylalaine\n");
            break;
        case ISOLEUCINEVALUE:
            printf ("Isoleucine\n");
            break;
        case UNDEFINEDVALUE:
        default:
            printf ("Unknown amino acid\n");
            break;
    }
}
于 2013-11-08T18:43:38.777 回答
3

您可以使用strncmp(3)比较两个字符串的开头:

if (strncmp(mRNAstrand, "aug", 3) == 0)
于 2013-11-08T18:42:19.990 回答
0

对于您的第一个问题,只需写:

if (!(*mRna == 'a' || *mRna == 'u' || *mRna == 'g'))
    //Handle wrong array

您应该为您的第二个问题提供一个代码示例,以便更清楚您遇到的问题。

于 2013-11-08T18:42:12.197 回答