【问题标题】:How would I use this void function to calculate the percentage?我将如何使用这个 void 函数来计算百分比?
【发布时间】:2013-11-27 03:55:26
【问题描述】:

我正在处理 DNA 链,因此输入字符串将类似于:ATGC(可能的碱基 A、T、G 和 C)

我必须利用这个函数:void updateGCCount(char s[], int * gc, int * at) 来计算输入字符串中“GC”内容的百分比。

函数 updateGCCount 扫描输入字符串 s 的内容,并适当地更新“GC”和“AT”计数。

我不明白的是,如果这个函数没有返回任何东西,如果它是无效的,那么我如何使用它来计算“GC”内容的百分比?

这是我的 updateGCCount 函数代码:

void updateGCCount(char s[], int * gc, int * at){
   int i;

   for(i=0;i!='\0';i++){
      if(s[i]=='G' || s[i]=='C'){
         (*gc)++;                   /*Updated with the help of people who answered!*/
      }
      if(s[i]=='A' || s[i]=='T'){
         (*at)++;                   /*Updated with the help of people who answered!*/
      }
   }
}

现在这是我调用上述函数的主要函数(在收到以下答案的帮助后添加了此代码):

int main(){
   char s[400];
   int gc, at;
   double percentage;

   scanf("%s", s);

   gc = 0;
   at = 0;

   updateGCCount(s, &gc, &at);
   percentage = (gc * 100.0)/(strlen(s) - 1);

   printf("Sequence  : %s\n", s);
   printf("GC-content: %.2f\n", percentage);

   return 0;
}

我遇到的问题! 当我输入“ATCG”的输入字符串时,百分比为 0,这是不正确的,我无法弄清楚为什么它会给我这个问题!非常感谢您的帮助!

谢谢!

【问题讨论】:

  • gc++at++ 递增指针
  • 那么,如果这增加了指针,在主函数中,我是否必须使用 for 循环来遍历输入字符串,然后在 for 循环中,我会调用 updateGCCount 吗?

标签: c


【解决方案1】:

您需要增加 gcat 指向的内容:

(*gc)++;
(*at)++;

就目前而言,您不断增加指针本身,这可能会导致问题(尽管,由于您实际上并未取消引用指针,因此可能不会导致重大问题)。

你可以这样称呼它:

char *dna = ...;

int gc = 0;
int at = 0;

updateGCCount(dna, &gc, &at);

现在您只需确定百分比的含义。是相邻对总数中的 GC 对数,还是其他一些规范(如 G 或 C 的总数与 DNA 链的总长度相比)?

您可能计算的不是对而是单个字符,因此您所追求的百分比变为:

double percentage_gc = (gc * 100.0) / strlen(dna);

您还需要修复字符串结尾的测试:

for (i = 0; s[i] != '\0'; i++)

【讨论】:

  • 好的!谢谢!所以,我尝试了这个,当我用输入字符串“ATGC”运行它时,它给了我一个 0 的百分比。:(我想这是因为我在开始时设置了 gc 和等于 0 但我需要一些帮助指出我的错误。我会更新我目前遇到的问题。
【解决方案2】:

int * gc 是指向函数外部变量的指针,调用函数的人希望在该变量中存储答案。你想增加那个指针的值:

(* gc) ++ ;

而不是

gc ++ ;

另外你没有查看传入的字符串,所以这个循环永远不会退出。而是这样做:

int i; char c ;

for ( i= 0 ;  ((c= s[i])) ; i ++ ) {
  if ( c == 'G' || c == 'C' ) { (* gc) ++ ; }

等等

【讨论】:

  • 由于i!='\0',上面的循环(有问题)永远不会运行
  • 请不要在*++ 等紧密绑定的一元运算符周围放置空格(或者更重要的是.->[])。
  • @johny:你确定吗?它的间距很差,但条件相当于(c = s[i]) != '\0';
  • 我使用非常小的比例间隔字体来编辑代码,这些空间有助于提高系统的可读性。
  • 如果我真的想吓唬风格警察,我可以写像 if ( ('G' == c ) || ('C' == c )) 这样的 IF,我更喜欢这样做,因为它会捕获你只使用一个 = 的拼写错误。
【解决方案3】:

您已经解决了指针的问题,但仍然无法正常工作。

您不是在比较“对”,而是在比较单个字符;你的循环全错了。如果您想计算“GC”(即 G 后跟 C),我认为以下方法可行:

void updateGCCount(char s[], int * gc, int * at){
  int i, Length;
  Length = strlen(s);   /* new terminating condition for the loop */

  for( i = 0; i < Length - 1; i++ ) {
    if(s[i]=='G' && s[i+1] =='C') {
      (*gc)++;                   /* Updated with the help of people who answered! */
      i++;                       /* if you found G followed by C, skip one */
    }
    if(s[i]=='A' && s[i+1]=='T') {
      (*at)++;                   /* Updated with the help of people who answered! */
      i++;                       /* if you found A followed by T skip one */
    }
  }
}

【讨论】:

  • 哦!感谢您的意见!
猜你喜欢
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 2013-10-27
  • 2021-04-12
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
相关资源
最近更新 更多