@Valuvir

Что нужно изменить в коде С++?

Программа находит в строке последовательности одинаковых символов длиннее 3 и заталкивает эти фрагменты в двумерный массив.
char s[]={"qhtnnnnnnfchjjjgeeeeejg   tdggv ddddddddd"};
	int z=0,l,o,k=0,q,len=strlen(s) ;
	char c[20][20];

	for(int i=0;i<len;i++){								
		for(int j=i+1;j<len;j++)						
		{							
			if (s[i]==s[j])
			{
				for (o=i,l=j;;l++)
				{
					if(s[o]==s[l])
					{
						z++;
					}
					else 
					{
						z=0;
						break;
					}	
					if (z>3)
					{
						for(q=0;q<z;q++) {c[k][q]=s[l];}
						c[k][q]='\0';
						k++;i=l+q;
					}
				}
			}
		}
	}

На выходе если последовательность длиннее 4 он в первый подмассив заталкивает фрагмент из 4 символов, во второй из 5 и т.д. Шаманил, шаманил не получилось это исправить...
  • Вопрос задан
  • 97 просмотров
Пригласить эксперта
Ответы на вопрос 1
@StillDreamer
Ответ на вопрос.
Ваш код переусложнён, но если в нём разбираться, то проблема с циклом, в котором идут проверки с z.
for (o = i,l = j; ;l++)
{
     if (s[o] == s[l])
     {
          z++;
      }
      else 
      {
            z=0; 
            break;
      }	
      // Итак, что произойдёт в if'е ниже. Каждый раз, когда z > 3, будет добавляться строка в массив
     // Даже если текущая последовательность ещё не кончилась.     
      if (z > 3)
      {
          for (q = 0; q < z; q++) 
          { 
              c[k][q] = s[l];
          }
          c[k][q] = '\0';
          k++;
          i = l + q;
      }
}


Теперь по рекомендациям по коду.
Во-первых, старайтесь давать переменным осмысленные названия. Например, z могла бы называться current_sequence_length. Так проще отлаживаться и вообще понимать, что происходит.
Во-вторых, не экономьте на пробелах вокруг присваиваний, арифметических операторов и знаков равенства. https://google.github.io/styleguide/cppguide.html - довольно хороший стайлгайд.
3. Как уже упомянули, можно было бы использовать строки, которые string, и встроенные фичи.
4. Если без алгоритмов поиска и строк - всё равно ваше решение слишком сложное, его можно упростить.
В качестве наброска
int start_pos = 0;
int cur_pos = 1;
while (cur_pos < len)
{
    // Начинаем сравнивать
    while (cur_pos < len && s[start_pos] == s[cur_pos]) 
    {
        // Просто двигаемся к следующему элементу, пока они одинаковые
         ++cur_pos;
    }

    if (cur_pos - start_pos > 3) // Нашлось 4 или более одинаковых символа подряд
    {
        // Копируем, мне слишком лень писать этот кусок :) Но тут надо корректно обработать
       // ситуацию с концом строки
       // А ещё не забываем подвинуть start_pos и cur_pos
       start_pos = cur_pos;
       ++cur_pos;
    }
}

Можно вообще без вложенных циклов, можно ещё как-то иначе. Я про примерную суть.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы