2015-03-13 4 views
-4

Я написал этот код ниже для крошечной программы, которая получает строку (и помещает ее в массив) и число, а затем ищет через массив, чтобы найти, имеет ли он повторяющийся символ (и подсчитывает количество повторений), если так; программа будет сравнивать время повторения определенного символа и если количество повторений равно количеству, которое дал пользователь; программа заменит их символом «A». Например; если мы дадим программу «BBCC» и номер 2, она должна дать нам результаты «AAAA». Проблема в том, что мой код работает для некоторых примеров и не работает для приведенного выше примера. Вот код:Незначительная ошибка в моем коде на C++; Как это исправить?

#include <iostream> 
#include <stdio.h> 

using namespace std; 

int main() 
{ 
char str[30]; 
int i, j, k, l, number, counter = 0; 
char ch; 

cout << "Enter a string: "; 
gets (str); 

cout << "\nEnter a number: "; 
cin >> number; 

for (i =0; str[i]; i++){ 
    ch = str[i]; 
    for (j = 0; str[j]; j++){ 
     if (str[j] == ch){ 
      counter++; 
     } 
    } 
    if (counter == number){ 
     for (k = 0; str[k]; k++){ 
      if (str[k] == ch){ 
       str[k] = 'A'; 
      } 
     } 
    } 
} 

for (l = 0; str[l]; l++){ 
    cout << str[l]; 
} 
getchar(); 
return 0; 
} 

Другая ошибка в том, что если мы дадим ему строку «ABC» и номер 2; результаты будут «AAC»! Я знаю, что мой код немного грязный, потому что я новичок, поэтому, пожалуйста, извинись и помогите мне исправить мою проблему. Спасибо.

+1

Я не уверен, как этот вопрос когда-либо будет помогать будущим посетителям? :/ –

+2

Никогда не используйте 'gets', вместо этого используйте' std :: string' и обычный оператор ввода '>>'. –

+0

Что касается вашей проблемы, узнайте, как использовать отладчик, рядом с компилятором и редактором он должен быть наиболее распространенным инструментом в вашем наборе инструментов. Используя отладчик, вы можете проходить код за строкой, видя значения всех задействованных переменных, и это поможет вам увидеть, ведет ли код себя так, как вы ожидаете. –

ответ

1

Вам необходимо сбросить переменную counter в цикле.

Для ABC Например:

  1. Цикл будет первым рассчитывать A с. Существует 1 A, поэтому counter = 1.
  2. Следующая итерация будет считаться B s. Есть 1 B, поэтому счетчик увеличивается до counter = 2!
  3. Это введенный номер, так что он заменит все B комиссионка A =>AAC
0
for (i = 0 ; str[ i ] ; i ++) 
{ 
    if(str[ i ] != 'A') // because replacing A with A is pointless 
    { 
     counter = 0 ; 
     ch = str[ i ] ; 

     for (j = 0 ; str[ j ] ; j ++) 
     { 
      if (str[ j ] == ch) 
      { 
        counter ++ ; 
      } 
     } 

     if (counter == number) 
     { 
      for (j = 0 ; str[ j ] ; j ++) 
      { 
       if (str[ j ] == ch) 
       { 
        str[ j ] = 'A' ; 
       } 
      } 
     } 
    } 
} 

Я пытался поставить все комментарии по исправлению + некоторые оптимизации вместе, расскажите, пожалуйста, если что-нибудь еще неправильно

EDIT:

C++ 11 прекрасно для его упрощен ;-)

map< char , vector<int> > counters ; 

for (i = 0 ; str[ i ] ; i ++) 
{ 
    counters[ str[ i ] ].push_back(i) ; 
} 

for(pair< char , vector<int> > liste : counters) 
{ 
    vector<int> vec = liste.second ; 

    if(vec.size() == number) 
     for(int elt : vec) 
      str[ elt ] = 'A' ; 
} 

объяснение: я пройти через массив, акции каждый индекс в списке индекса, связанного с гольца (то, что карта для)

в конце концов, я просто смотрю на размер векторов для каждого char, если размер равен number, я просматриваю этот список, чтобы каждый элемент «заострен» по индексу «A»

+0

Это хорошо работает, спасибо большое! Определяет ли переменные переменные для циклов (i, j и k)? – hashtagger21

+0

не для j и k cuz их для непересекающихся, я исправил его thx: D (btw нужно добавить много оптимизации, потому что это все еще довольно неприятно: -P, представьте себе, что у вас 18 'a', а n не 18, то вы пройдете весь массив 18 раз, это будет ужасно плохо, вы можете рассчитывать, пройдя через массив только один раз, используя std :: map Guiroux

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