2012-11-30 1 views
1

Это первая программа на C++, которую я когда-либо писал, и мне трудно понять порядок, в котором должны быть помещены операнды. Это для класс, но похоже, что я не должен использовать тег домашней работы. Извините, если я делаю это неправильно.Программа, в которую пользователь вводит строку, и программа подсчитывает экземпляры букв

Это мой вход

// Get DNA string 

string st; 
cout << "Enter the DNA sequence to be analysed: "; 
cin >> st; 

Это, кажется, работает нормально, но я думал, я бы включил его упаковывают это то, что я делаю неправильно.

Это то, что я до сих пор проверял, что входной сигнал является исключительно C, T, A или G. Он проходит через программу и просто печатает «Пожалуйста, введите действительный sequnce1, введите действующую последовательность2,. .. ЭСТ. Я уверен, что я делаю что-то очень глупо, я просто не могу понять это.

// Check that the sequence is all C, T, A, G 

while (i <= st.size()){ 
if (st[i] != 'c' && st[i] != 'C' && st[i] != 'g' && st[i] != 'G' && st[i] != 't' && st[i] != 'T' && st[i] != 'a' && st[i] != 'A'); 
    cout << "Please enter a valid sequence" << 
    i++; 
else if (st[i] == c,C,G,t,T,a,A) 
    i++; 

Вторая половина моей программы для подсчета количества Cs и Gs в последовательности

for (i < st.size() ; i++ ;); 
for (loop <= st.size() ; loop++;) 
    if (st[loop] == 'c') 
    { 
    count_c++; 
    } 
    else if (st[loop] == C) 
    { 
    count_c++; 
    } 
    else if (st[loop] == g) 
    { 
    count_g++; 
    } 
    else if (st[loop] == G); 
    { 
    count_g++; 
    } 


cout << "Number of instances of C = " << count_c; 
cout << "Number of instances of G = " << count_g; 

Похоже, что это не цикл, он будет считать 1 одной из букв s. Как это сделать? Кажется, я не могу положить конец; в любом месте, не получив ошибку, хотя я знаю, что мне это нужно.

Любая помощь или советы, указывающие мне в правильном направлении, были бы весьма полезными - Я работаю над этим кодом в течение двух дней (это неловко признаться).


Edit:

Моя последовательность проверки будет выглядеть так:

while (i < st.size()) { 
if (st[i] != c && st[i] != C && st[i] != g && st[i] !=G && st[i] !=t && st[i] !=T && st[i] !=a && st[i] != A) 
    cout << "Please enter a valid sequence" << "\n" << "\n"; 
    i++; 
} 

и мой счетчик выглядит следующим образом:

// Count the number of Cs and Gs 

count_c = 0; 
count_g = 0; 

for (i = 0; i < st.size() ; i++) { 
    if ((st[i] == 'c') || (st[i] == 'C')) 
    count_c++; 
    else if ((st[i] == 'g')|| (st[i] == 'G')); 
    count_g++; 
} 


cout << "Number of instances of C = " << count_c; 
cout << "Number of instances of G = " << count_g; 
+4

Your для петель не хватает первой части. – chris

+0

Этот код не компилируется, и даже если он и сделал, он не делает то, что вы утверждаете. –

+0

Я не утверждаю, что он что-то делает! Я прошу о помощи. Сейчас он компилируется для меня, но это двойной счет моих gs, я отредактирую свой пост через минуту. – stringgy

ответ

0

Ваш цикл использует неправильный синтаксис. Вы хотите:

for (i = 0; i < st.size() ; i++) { 
    ... 
} 

Кроме того, вы всегда должны использовать < size и не <= size для индексации, так как индексация начинается 0 и заканчивается в size-1.

+0

Я начал с того, что там, но g ++ дал мне сообщение об ошибке, я удалил i = 0 из-за пределов цикла и вернул его в него, все работает до конца. Спасибо! – stringgy

0

Вы должны удалить ";" после этого, если оператор:

if (st[i] != 'c' && st[i] != 'C' && st[i] != 'g' && st[i] != 'G' && st[i] != 't' && st[i] != 'T' && st[i] != 'a' && st[i] != 'A'); 

Теперь это ничего не делает.

Вы должны использовать «<» вместо «< =», чтобы избежать неправильного индексирования массива строк (строка размера «размер» означает, что индексы от 0 до размера - 1)

while (i <= st.size()) 

Если вы уже проверял, что символ не является одним из c, C, g, G, t, T, a, A, вам не нужно проверять его снова, поэтому, если (st [i] == c, C, G, t , T, a, A) бесполезно.

Но даже с этими исправлениями ваш код логически ошибочен.

+0

Спасибо! Я не знаю, как я продолжал смотреть мимо этого! – stringgy

+1

Кстати, обозначение '(st [i] == c, C, G, t, T, a, A)' не сравнивает st [i] со всеми этими символами. Оператор запятой сложный ... –

0

Давайте исправим как проверка и подсчет сразу:

bool sequencedna(const string &s, int &count_a, int &count_t, int &count_c, int &count_g) 
{ 
    for(int i = 0; i != s.length(); i++) 
    { 
     /* get the character at position i and convert it to uppercase */ 
     char c = s[i]; 

     if((c == 'C') || (c == 'c')) 
      count_c++; 
     else if((c == 'G') || (c == 'g')) 
      count_g++; 
     else if((c == 'T') || (c == 't')) 
      count_t++; 
     else if((c == 'A') || (c == 'a')) 
      count_a++; 
     else 
      return false; // invalid character in DNA sequence! 
    } 

    return true; // valid DNA sequence 
} 

void doit() 
{ 
    string st; 

    while(true) 
    { 
     cout << "Enter the DNA sequence to be analysed: "; 
     cin >> st; 

     int count_c = 0, count_g = 0, count_t = 0, count_a = 0; 

     if(sequencedna(st, count_a, count_t, count_c, count_g)) 
     { 
      cout << "The DNA string has been sequenced. Counts " << endl 
       << " Adenine: " << count_a << endl 
       << " Thymine: " << count_t << endl 
       << " Cytosine: " << count_c << endl 
       << " Guanine: " << count_g << endl; 
      return; 
     } 

     cout << "Invalid sequence. DNA sequences may contains only A, T, C and G." << endl; 
    } 
} 
+0

отсутствует еще? –

+0

@MooingDuck Хм? Где, по вашему мнению, отсутствует другое? –

+0

«doit» выглядит как ошибка, но после дальнейшего обследования я понял, что это за намерение. Это странно. –

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