我如何使用此void函数计算百分比?

时间:2013-11-27 03:55:26

标签: c

我正在处理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,这是不对的,我无法弄清楚为什么它给我这个问题!非常感谢帮助!

谢谢!

3 个答案:

答案 0 :(得分:3)

您需要增加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++)

答案 1 :(得分:1)

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

(* gc) ++ ;

而不是

gc ++ ;

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

int i; char c ;

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

答案 2 :(得分:0)

你已经修复了指针的问题,但它仍然没有用。

你不是在比较“对”,而是个别角色;你的循环都是错的。如果您想要计算“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 */
    }
  }
}