Найти порядковый номер самого длинного слова.

Здравствуйте, помогите решить задачку. Нужно найти порядковый номер самого длинного слова в предложении. Предложение не обязательно должно быть большим.
На пример: «Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства».

А ограничение по времени сколько?
Если не очень строго, то можно тупо в массив сохранять количества символов в каждом слове. Потом отсортировать и вывести номер максимума.

Вот что у меня получилось.
Как сделать, чтоб результат выводился нажатием клавиши «Enter»?
И можно ли использовать русский текст?

#include <iostream>
#include <string>
#include <iterator>

using namespace std;

typedef istream_iterator< string> str_in_it;

int main()
{
    string longest;
    unsigned short longest_id = 0;

    setlocale(LC_CTYPE, "Russian");
    cout << "Введите текст" << "\n";
    unsigned short id = 0;
    for (str_in_it it(cin); it != str_in_it(); it++, id++) {
        if (it->length() > longest.length()) {
            longest = *it;
            longest_id = id;
        }
    }

    cout << "Самое длинное слово - " << longest << "\n";
    cout << "Порядковый номер - " << longest_id << "\n";

    system("pause");
    return 0;
}

Какой компилятор вы используете? Не знаю как у вас, но у меня ответ выводит по нажатию Enter. И в качестве ввода, лучше использовать getline.

Это был ретарический вопрос) Используйте функцию getline со стрингом. Конкретно не знаю что вас интересует, но во всяком случае там идёт ввод с пробелами пока ты не нажмешь интер.

Самая тупая реализация в духе классического C без использования STL и проч. (за исключением ввода-вывода):

#include <iostream>

using namespace std;

char sentence[] = "Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства";

int main() {

    setlocale(LC_CTYPE, "Russian");

    char *cursym = sentence;
    char *curword = sentence;
    char *maxword = sentence;
    int curlen = 0;
    int curwordcounter = 1;
    int maxlen = 0;
    int maxwordcounter = 0;

    while (*cursym) {
        if (*cursym == ' ') {
            if (curlen > maxlen) {
                maxlen = curlen;
                maxword = curword;
                maxwordcounter = curwordcounter;
            }
            curlen = 0;
            *cursym = '\0';
            curword = cursym + 1;
            curwordcounter++;
        }
        else {
            curlen++;
        }
        cursym++;
    }
    // обработка последнего слова, после которого вместо пробела стоит '\0'
    if (curlen > maxlen) {
        maxlen = curlen;
        maxword = curword;
        maxwordcounter = curwordcounter;
    }

    cout << "Самое длинное слово: \"" << maxword << "\"\nЕго длина " 
        << maxlen << " букв\nПорядковый номер в предложении " 
        << maxwordcounter << endl;

    system("pause");
    return 0;
}

А на более высокоуровневом языке типа Perl или Ruby это выглядело бы совсем просто (Ruby):

sentence = "Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства"
words = sentence.split(/\s+/)
maxwordnum = 0
maxwordlen = 0
words.each_index do |i|
    if words[i].length > maxwordlen
        maxwordlen = words[i].length
        maxwordnum = i
    end
end

puts "Самое длинное слово \"#{words[maxwordnum]}\""
puts "Номер в предложении #{maxwordnum+1}"

Впрочем, то же самое, видимо, можно сделать и на C++, использовав мощь .NET ))

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.