Вопрос № 174551: Уважаемые эксперты,прошу вашей помощи в решении задачи. Задание:Дан текст из нескольких строк.Необходимо найти в строке (номер строки вводится пользователем) самое длинное слово.Найденное слово необходимо вернуть в главную функцию. Условия: Пер...
Вопрос № 174551:
Уважаемые эксперты,прошу вашей помощи в решении задачи. Задание:Дан текст из нескольких строк.Необходимо найти в строке (номер строки вводится пользователем) самое длинное слово.Найденное слово необходимо вернуть в главную функцию. Условия: Первое окно программы содержит меню, предлагающее выбрать одно из возможных действий. Среди этих действий должны присутствовать: ∙ ввод текста, ∙ вывод текста, ∙ выход из программы, ∙ а также действия, определяемые вариантом.
Все функции, в
том числе и работы со строками, должны быть разработаны самостоятельно (т.е. не использовать стандартных функций работы со стро-ками из библиотек языка Си). Массив, содержащий исходный текст, должен передаваться в функции через параметры.При разработке программы не следует использовать глобальные переменные, все необходимые данные должны передаваться в функции через параметры. Я попытался решить данную задачу,но чего-то не получается.Исходник прилагаю.Помогите,естестве
нно не за бесплатно.
Отвечает Micren, Бакалавр :
Здравствуйте, Jekaiseburga. Так это можно сделать при помощи STL. Microsoft Visual C++/Visual Studio 2008. Самое главное прокомментировано. Программа.
// Ищет все слова с максимальной длиной в строке string_vector maxWord(const wstring& str) { // Результат будет здесь string_vector result;
// Итераторы на начало и конец wstring::const_iterator it=str.begin(),end=str.end();
// Найденная максимальная длина слова wstring::size_type maxLength=0;
// Этот адаптер для того, чтоб использовать функцию iswspace() в качестве предиката static pointer_to_unary_function<wint_t,int> wsPredicate=ptr_fun(iswspace);
// Пока не конец строки while(it!=end) { // Ищем начало слова wstring::const_iterator
beginWord=find_if(it,end,not1(wsPredicate)); // Ищем конец слова wstring::const_iterator endWord=find_if(beginWord,end,wsPredicate);
// Если не пусто if(beginWord!=endWord) { // Наше слово wstring word(beginWord,endWord); // Его длина wstring::size_type wordSize=word.size(); // Если нашли более длинное if(wordSize>maxLength) { // Очистим результат result.clear(); // И у
становим новую длину maxLength=wordSize; } // Если нашли с такой же длиной if(wordSize==maxLength) {
// Сохраним result.push_back(word); } } it=endWord; } return result; }
// Ищет максимальное слово в заданной строке void findMaxWord(const string_vector& strings) { string_vector::size_type size=strings.size(); if(!size) { wcout<<L"Список пуст"<<endl; return; } string_vector::size_type strNo; wcout<<L"Введите номер строки:"; wcin>>strNo; if(wcin.fail()) { wcout<<L"Неверный
ввод"<<endl; wcin.clear(); wcin.ignore(numeric_limits<streamsize>::max(),L'\n'); return; } wcin.ignore(numeric_limits<streamsize>::max(),L'\n'); if(strNo>0 && strNo<size+1) { string_vector words=maxWord(strings[strNo-1]); if(words.size()) { showStrings(L"Найдены следующие слова(слово) с максимальной длиной:",words); } else { wco
ut<<L"Нет слов в выбранной строке"<<endl; } return; } else { wcout<<L"Неверный номер строки"<<endl; } }
Пример работы:
Код:
Сделайте свой выбор: 1 - Добавление строк 2 - Показать строки 3
- Поиск самого длинного слова в строке 0 - Выход 1 Вводите строки(пустая строка для завершения): Как известно, с одним оператором try можно связывать несколько операторов catch. Именно такой вариант используется чаще всего. Однако каждый оператор catch должен перехватывать отдельный тип исключительной ситуации
Сделайте свой выбор: 1 - Добавление строк 2 - Показать строки 3 - Поиск самого длинного слова в строке 0 - Выход 2 Имеются следующие строки: 1 - "Как известно, с одним оператором try" 2 - "можно связывать несколько операторов catch." 3 - "Именно такой вариант используется чаще всего." 4 - "Однако каждый оператор catch должен перехватывать 5 - "отдельный тип исключительной ситуации" Сделайте свой выбор: 1 - Добавление строк 2 - Показать строки 3 - Поиск самого длинного слова в строке 0 - Выход 3 Введите номер строки:1 Найдены следующие слова(слово)
с максимальной длиной: 1 - "оператором" Сделайте свой выбор: 1 - Добавление строк 2 - Показать строки 3 - Поиск самого длинного слова в строке 0 - Выход 3 Введите номер строки:2 Найдены следующие слова(слово) с максимальной длиной: 1 - "операторов" Сделайте свой выбор: 1 - Добавление строк 2 - Показать строки 3 - Поиск самого длинного слова в строке 0 - Выход 3 Введите номер строки:3 Найд
ены следующие слова(слово) с максимальной длиной: 1 - "используется" Сделайте свой выбор: 1 - Добавление строк 2 - Показать строки 3 - Поиск самого длинного слова в строке 0 - Выход 4 Будьте внимательней Сделайте свой выбор: 1 - Добавление строк 2 - Показать строки 3 - Поиск самого длинного слова в строке 0 - Выход 3 Введите номер строки:4 Найдены следующие слова(слово) с максимальной длиной: 1 - "перехватывать" Сделайте свой выбор: 1
- Добавление строк 2 - Показать строки 3 - Поиск самого длинного слова в строке 0 - Выход 3 Введите номер строки:5 Найдены следующие слова(слово) с максимальной длиной: 1 - "исключительной"
while(true) { switch(menu()) { case 0: delArray(strings); return 0; case 1: addStrings(strings); break; case 2: showStrings("Имеются следующие строки:",strings); break; case 3: findMaxWord(strings); break; } } return 0; }
int menu() { while(true) { printf("Сделайте свой выбор:\n"\ "
1 - Добавление строк\n"\ "2 - Показать строки\n"\ "3 - Поиск самого длинного слова в строке\n"\ "0 - Выход\n"\ ":"); int choice=_getche(); printf("\n"); switch(choice) { case '0': case '1': case '2': case '3': return choice-'0'; default: printf("Будьте внимательней\n"); } }
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.