Как подсчитать максимальную группу согласных букв,которые встречаются подряд в слове?

написал код,который должен считать максимальную группу согласных букв,которые встречаются подряд в слове и выводить в файл,также слово должно заканчиваться точкой, но подсчеты неправильные, то есть программа считает не все согласные, подскажите пожалуйста,что нужно изменить в коде?

#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;

int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char Stroka[100];
    char sogl[] = "qwrtpsdfghjklzxcvbnm";
    int dlin, counter = 0, maxsogl = 0;
    ofstream zad("Zadanie.txt");
    cout << "Введите строку:";
    cin >> Stroka;
    cout << "Строка, выведенная в файл:";
    cout << Stroka;
    zad << Stroka;
    dlin = strlen(Stroka);//записали длину строки
    char* p = Stroka;
    for (int i = 0; i < dlin; i++) {
        for (int j = 0; j < strlen(sogl); j++) {
            if (Stroka[i] == sogl[j]) {
                counter++;
            }
            
            else if(Stroka[i]!=sogl[j]&&counter>maxsogl) {
                maxsogl = counter;
                counter = 0;
            }
            
        }
    }
    cout << endl;
    cout <<maxsogl;
    zad << maxsogl;
    return 0;
}

Ответы (1 шт):

Автор решения: Павел Ериков

В общем буду отталкиваться от вопроса, а не от того, что написано в коде.

  1. Когда вы находите согласную букву (Stroka[i] == sogl[j]) вы увеличиваете counter. И получается вы как бы её нашли, но зачем то продолжаете эту же букву в слове проверять с остальными согласными.
    else if (Stroka[i] != sogl[j] && counter > maxsogl) {
        maxsogl = counter;
        counter = 0;
    }
    
    Нужно если вы нашли согласную букву, то увеличить счетчик и перестать её сравнивать с остальными согласными.
  2. Так же вам нужно после того, как определили является ли Stroka[i] согласной (для этого сделаем переменную bool isFind) сравнивать сначала с maxsogl counter и если Stroka[i] не является согласной (isFind == false), то обнуляете counter.

Пример кода с комментариями (все что не указано я не изменял):

//Пометка, что рассматриваемый символ строки является согласной
bool isFind = false;
for (int i = 0; i < dlin; i++) {
    //Изначально пусть будет гласной
    isFind = false;
    //Идет по списку согласных букв
    //пока или не прошли по всему списку или не нашли ее в списке
    for (int j = 0; j < strlen(sogl) && !isFind; j++) {
        //Если мы нашли в списку согласных букв Stroka[i]
        if (Stroka[i] == sogl[j]) {
            //то увеличиваем counter
            counter++;
            //и объявляем что Stroka[i] согласная
            isFind = true;
        }
    }
    //Тут понятно
    if (counter > maxsogl)
        maxsogl = counter;
    //Если Stroka[i] не является согласной буквой
    //обнуляем counter
    if (!isFind) 
        counter = 0;
}
→ Ссылка