我正在处理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,这是不对的,我无法弄清楚为什么它给我这个问题!非常感谢帮助!
谢谢!
答案 0 :(得分:3)
您需要增加gc
和at
指向的位置:
(*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 */
}
}
}