Самое длинное слово, содержащее минимум 3 буквы 'a'

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

vbn
Сообщения: 18
Зарегистрирован: 02 янв 2015, 16:18

упс :) и вправду, сам не заметил, да нужно чтоб был не менее трех букв а.
Я так понимаю надо условие написать, чтоб он отслеживал три буквы а, но только куда его вставить нужно?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ну во-первых, эти буквы a нужно считать, причём считать отдельно в каждом слове.

Следует завести отдельную переменную, скажем count_a. Изначально она должна быть нолём. Во время прохождения по строке нужно увеличивать эту переменную, если текущий символ равен a и сбрасывать её в ноль, когда слово закончилось (в том же месте, где сбрасывается в ноль текущая длина). Ну и последнее, что нужно поправить, это условие запоминания индекса начала максимального слова. В этом условии нужно проверять не то, что текущая длина слова больше либо равно трём, а то, что наша переменная count_a больше либо равно трём.

Подумай над каждым изменением в коде и проблем не возникнет.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
vbn
Сообщения: 18
Зарегистрирован: 02 янв 2015, 16:18

Вроде я все сделал по вашим рекомендациям правильно, но не работает, ввожу два слово, одно с тремя буквами а а другое очень длинное, но не с буквами а выводиться а самое длинное

Код: Выделить всё

#include<stdio.h>
#include<string.h>
#include<conio.h>

int main()
{
    char s[255];
    int i, cur_len = 0, max_len = 0, start_max = -1,len,count_a=0;
    printf("Vvedite text: ");
    gets(s);
    len = strlen(s);
    for (i = 0; i <= len; i++)
    {
        if ((s[i]=='a') || (s[i]=='A'))
        {
            count_a++;
        }

        if ((s[i]==0) || (s[i]==' '))
        {
            if (count_a>=3)
            {
                start_max = i - cur_len;
                max_len = cur_len;
            }
            cur_len = 0;
            count_a=0;
        }
        else
        {
            cur_len++;
        }
    }

    if (start_max >= 0)
    {
        i = start_max;
        while ((s[i] != ' ') && (s[i] != 0))
        {
            printf("%c", s[i]);
            i++;
        }
    }
    else
    {
        printf("slovo s tremy simvolami a, ne bilo naydeno");
    }

    getch();

    return 0;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

А зачем вторую часть условия убрал? Без неё у тебя самое длинное слово не будет искаться. Ну я же попросил тебя подумать над каждым изменением...
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
vbn
Сообщения: 18
Зарегистрирован: 02 янв 2015, 16:18

Я проверил прошлый код(который без добавления с содержанием буквы а ), он тоже не работает, я ввожу так:
sssg juytretip
и выводиться juytretip

Код: Выделить всё

#include <stdio.h>
#include <string.h>
#include <conio.h>

int main()
{
    char s[255];
    int i, cur_len = 0, max_len = 0, start_max = -1;

    printf("Vvedite text: ");
    gets(s);

    const int len = strlen(s);
    for (i = 0; i <= len; ++i)
    {
        if ((s[i]==0) || (s[i]==' '))
        {
            if ((cur_len >= 3) && (cur_len > max_len))
            {
                start_max = i - cur_len;
                max_len = cur_len;
            }
            cur_len = 0;
        }
        else
        {
            cur_len++;
        }
    }
   
    if (start_max >= 0)
    {
        i = start_max;
        while ((s[i] != ' ') && (s[i] != 0))
        {
            printf("%c", s[i]);
            ++i;
        }
    }
    else
    {
        printf("slovo dlinnoy ot trex simvolov i boliche, ne bilo naydeno");
    }

    getch();

    return 0;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

А что ты ожидаешь увидеть? Ведь "juytretip" - это ведь и есть самое длинное слово, содержащее как минимум три буквы.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
vbn
Сообщения: 18
Зарегистрирован: 02 янв 2015, 16:18

Хорошо, вернемся к задаче с тремя буквами а, где я мог ошибиться, вроде проверяет и длину слова, и буквы "а" считает, но вывод длинное слово, без букв "а"

Код: Выделить всё

#include<stdio.h>
#include<string.h>
#include<conio.h>

int main()
{
    char s[255];
    int i, cur_len = 0, max_len = 0, start_max = -1,len,count_a=0;
    printf("Vvedite text: ");
    gets(s);
    len = strlen(s);
    for (i = 0; i <= len; i++)
    {
        if ((s[i]=='a') || (s[i]=='A'))
        {
            count_a++;
        }

        if ((s[i]==0) || (s[i]==' '))
        {
            if ((count_a>=3) && (count_a > max_len))
            {
                start_max = i - cur_len;
                max_len = cur_len;
            }
            cur_len = 0;
            count_a=0;
        }
        else
        {
            cur_len++;
        }
    }

    if (start_max >= 0)
    {
        i = start_max;
        while ((s[i] != ' ') && (s[i] != 0))
        {
            printf("%c", s[i]);
            i++;
        }
    }
    else
    {
        printf("slovo s tremy simvolami a, ne bilo naydeno");
    }

    getch();

    return 0;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Скопировал программу из твоего сообщения, скомпилировал и запустил. Вот результат запуска:
Vvedite text: 11111 aaa 1111a a11111111a 111111111111111111111
aaa
По-моему всё правильно. Ты видишь ошибки?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
vbn
Сообщения: 18
Зарегистрирован: 02 янв 2015, 16:18

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