2013-11-27 2 views
0

Я работаю с нитями ДНК, так что входная строка будет выглядеть так: ATGC (с возможными основаниями А, Т, G, и С)Как использовать эту функцию void для вычисления процента?

Я должен использовать эту функцию: пустое updateGCCount (символ 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, что неверно, и я не могу понять, почему это дает мне эту проблему! Помощь очень ценится!

Спасибо!

+1

'дс ++' и '++' приращения указателей –

+0

Таким образом, если это увеличивает указатели, в основной функции, я должен использовать цикл for, чтобы пройти через входную строку, а затем внутри цикла for, я бы вызвал updateGCCount? – Karen

ответ

3

Вам нужно увеличивать, что gc и at точки:

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

Как она стоит, вы держите приращение в себя указатели, которые могут привести к проблемам (хотя, так как вы на самом деле не разыменование указателей , это может не привести к серьезным проблемам).

Вы могли бы назвать его:

char *dna = ...; 

int gc = 0; 
int at = 0; 

updateGCCount(dna, &gc, &at); 

Теперь вы просто должны определить, каков процент средств. Является ли количество пар GC из общего числа смежных пар или какой-либо другой спецификации (например, общее число G или C по сравнению с общей длиной цепи ДНК)?

Вполне вероятно, что вы рассчитывать не пар, но отдельные символы, так что процент вы после становится:

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

Вы также должны установить тест на конце строки:

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

Хорошо! Благодаря! Итак, я попробовал это, и когда я запустил его со строкой ввода «ATGC», он дал мне процент от 0. :(Я думал, что это потому, что я установил gc и был равен 0 в начале, но мне нужна помощь что я до сих пор в моей проблеме. Я обновляю то, что у меня до сих пор в моей проблеме. – Karen

1

int * gc - указатель на переменную вне функции, в которой человек, вызывающий функцию, хочет сохранить ответ. Вы хотите, чтобы увеличить значение при этом указатель:

(* gc) ++ ; 

вместо

gC++ ; 

Также вы не смотрите на строки, переданной в, так что этот цикл никогда не собирается выходить.Вместо того, чтобы сделать:

int i; char c ; 

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

т.д.

+0

цикл выше (в вопросе) никогда не будет запущен из-за 'i! = '\ 0'' –

+2

Пожалуйста, не помещайте пробелы вокруг жестко связывающих унарных операторов, таких как '*' и '++' (или, более того, '.' и' -> 'или' [] '). –

+1

@johny: вы уверены? но условие эквивалентно '(c = s [i])! = '\ 0';'. –

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 */ 
    } 
    } 
} 
+0

О! Спасибо за ваш вклад! – Karen

Смежные вопросы