Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2022, 13:12   #1
Ladoga
Пользователь
 
Регистрация: 28.01.2022
Сообщений: 17
По умолчанию Условный оператор в цикле

Здравствуйте!
Ничего не получается.
Напишите программу, которая запрашивает строку символов, состоящую только из латинских букв a, b и c, и выводит начальные позиции всех цепочек abcabc. Если нет ни одной цепочки abcabc -- вывести "NO". Во входной строке не менее 3 символов.
Sample Input 1:

ababcaabca
Sample Output 1:

3 7
Sample Input 2:

abacadac
Sample Output 2:

NO



Код:
#include  <iostream>
using namespace std;
int main() {
string s;
int k=1, p=0;
cin >> s;
for (int i=0; i<s.length(); i++) 

{
 if(s[i]=='a')	k++; 
 if(s[i]=='a'&&s[i+1]=='b'&& s[i+2]=='c')
 {
 	k =='a';
        k++;
	cout<<k<<" "; 
	 
 }
  
  }   
  
  
  return 0;

}

Последний раз редактировалось BDA; 11.02.2022 в 10:22.
Ladoga вне форума Ответить с цитированием
Старый 10.02.2022, 13:29   #2
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Цитата:
Сообщение от Ladoga Посмотреть сообщение
for (int i=0; i<s.length(); i++)
Вы обращаетесь к элменту i+2. Явно выход за границу будет.

Цитата:
Сообщение от Ladoga Посмотреть сообщение
if(s[i]=='a') k++;
Чтобы что?

Цитата:
Сообщение от Ladoga Посмотреть сообщение
if(s[i]=='a'&&s[i+1]=='b'&& s[i+2]=='c')
У вас же цепочка длиннеее...

Цитата:
Сообщение от Ladoga Посмотреть сообщение
k =='a';
Зачем? Почему результат не искпользуете?

Цитата:
Сообщение от Ladoga Посмотреть сообщение
k++;
Зачем?

Цитата:
Сообщение от Ladoga Посмотреть сообщение
cout<<k<<" ";
Вам же i надо выводить...

Где проверка, что последовательности были? Где NO?
ForenLi вне форума Ответить с цитированием
Старый 10.02.2022, 14:05   #3
Ladoga
Пользователь
 
Регистрация: 28.01.2022
Сообщений: 17
По умолчанию

Спасибо большое,
Переделаю!

Код:
#include <iostream>
using namespace std;
int main(){
 string s;
 int i, n, k;
 cin>>s; 
 n=s.length();

 for(int i = 0; i < n - 2; i++) 
 { 		 
 if(s[i]=='a'&& s[i+1]=='b'&& s[i+2]=='c')
 {
 	cout<<i+1<<" ";
 	k++;
 }
          
}
  if(!k)  
  
  cout<<"NO";
  
  return 0;  
 }

Последний раз редактировалось BDA; 11.02.2022 в 10:23.
Ladoga вне форума Ответить с цитированием
Старый 10.02.2022, 16:02   #4
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Цитата:
Сообщение от Ladoga Посмотреть сообщение
int i
У вас же в цикле есть своя локальная.

Цитата:
Сообщение от Ladoga Посмотреть сообщение
k
Неинициализированно

Цитата:
Сообщение от Ladoga Посмотреть сообщение
if(s[i]=='a'&& s[i+1]=='b'&& s[i+2]=='c')
Строка для поиска у вас длинннее
ForenLi вне форума Ответить с цитированием
Старый 10.02.2022, 16:14   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Алгоритм должен быть другим.
Есть строка s и подстрока subs
Код:
1. flag = False;  // Нет совпадения 
2. В цикле по k от первого символа s до символа s.length() - sub.length() // Последняя позиция подстроки
{
     3. flags = True;   // Если символы совпадут 
     4. В цикле по m от первого символа подстроки до конца [sub.length()]
     {
            5. Если символы не совпадают s[k + m] != sub[m] , то flags = False; break;
     }
     5. Если flags = True (все символы подстроки совпали), то Печать(k); flag = True; // Найдено совпадение
}
6. Если flag == False (подстрока не найдена) Печать('NO')
Иначе: Устанавливаем указатель (базовый) на первый символ строки и двигаем его до позиции, когда конец подстроки "упрётся" в конец строки.
Во внутреннем цикле сравниваем символы строки с символами подстроки. Если есть несовпадение, то устанавливаем флажок и "вываливаемся" из внутреннего цикла.
Проверяем причину завершения внутреннего цикла.
Всякий раз, когда цикл завершился нормально, не по break, то выводим позицию (k) и устанавливаем признак "найдено совпадение".
После выхода из основного цикла смотрим на флажок "найдено совпадение" и принимаем решение о печати/не печать NO.

PS:
flag - найдена/не найдена подстрока
flags - совпал/не совпал символ

PSS: После ввода кода выделите его и нажмите на кнопку [CODE], которая находится над формой ввода. В этом случае код не будет терять формата.
Как-то так, ...

Последний раз редактировалось ViktorR; 10.02.2022 в 16:17.
ViktorR вне форума Ответить с цитированием
Старый 10.02.2022, 20:52   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Исключительно в целях самообразования.
Это решение - реализация приведённого ранее алгоритма (предыдущий пост).
Код:
#include <iostream>
using namespace std;

bool tstr(string s, string subs);

int main()
{
   string s1, s2, subs;
   
   subs = "abc";
   s1 = "ababcaabca";
   s2 = "abacadac";
   cout << "s1 = " << s1 << "   subs = " << subs << endl;
   if (!tstr(s1, subs))
   {
      cout<<"NO";
   }
   cout << endl;
   cout << "s2 = " << s2 <<  "   subs = " << subs << endl;
   if (!tstr(s2, subs))
   {
      cout.width(5);
      cout<<"NO";
   }

    return 0;
}

bool tstr(string s, string subs)
{
   bool flag, flags;
   flag = false;
   for(int k = 0; k < s.length() - subs.length(); k++)
   {
      flags = true;
      for (int m = 0; m < subs.length(); m++)
     {
        if(s[k + m] != subs[m])
	{
	   flags = false;
	   break;
	}
     }
     if (flags)
    {
        flag = true;
        cout.width(5);
	cout << k;	   	   
     }
   }
   return flag;
}
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 11.02.2022, 09:00   #7
Ladoga
Пользователь
 
Регистрация: 28.01.2022
Сообщений: 17
По умолчанию

Благодарю за подробное решение.
Занимаюсь самостоятельно, спасибо.
Ladoga вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Условный оператор,оператор цикла и массив Klark73 Microsoft Office Excel 1 19.12.2011 17:09
Условный оператор. Оператор выбора. евгенийзууу Паскаль, Turbo Pascal, PascalABC.NET 3 05.12.2011 14:37
Оператор выбора или условный оператор[Перенесено из JavaSE] merhaba1992 Помощь студентам 1 20.01.2011 17:06
Условный оператор. Оператор выбора. Pascal Сержuk Помощь студентам 4 17.11.2010 12:50