Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный хостинг на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Гаряка Асмик
Статус: Специалист
Рейтинг: 3178
∙ повысить рейтинг »
lamed
Статус: Практикант
Рейтинг: 2270
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2024
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / C/C++

Номер выпуска:1513
Дата выхода:14.04.2010, 12:30
Администратор рассылки:Verena, Профессионал
Подписчиков / экспертов:639 / 198
Вопросов / ответов:3 / 3
IRC-канал по теме:#C

Вопрос № 177745: Требуется написать программу, которая после ввода текста/предложения, выводит в столбик по отдельности слова, без знаков препинания, после этого доработать программу что бы она выводила только слова, начинающиеся с гласной буквы+ещё вариант програм...


Вопрос № 177762: Добрый вечер уважаемые эксперты, помогите написать програму на С++ которая решает уравнение Y = 1/4 - 1/4 sin(5/8Пи-8α) ...
Вопрос № 177765: Уважаемые эксперты, помогите в написании следующей программы на языке С++: Написать, используя технику указателей, программу работы с базой отдела кадров. База размещается в текстовом файле произвольного размера. Каждая строка – запись об одно...

Вопрос № 177745:

Требуется написать программу, которая после ввода текста/предложения, выводит в столбик по отдельности слова, без знаков препинания, после этого доработать программу что бы она выводила только слова, начинающиеся с гласной буквы+ещё вариант программы, где выводится только 1е слово, начинающееся на гласную.
Первую часть я сделал, слова в столбик выводятся как положено, прошу помочь доработать, что бы выводились только слова, начинающиеся с гласной буквы+ещё вариант программы, где выводится только 1е слово, начинающееся на гласную. И если можно, 3й вариант, где 1е слово на гласную, а остальные за ним идут как обычно.
P.S. Работает в CPP в досовской оболочке. Программу прилагаю.

Отправлен: 08.04.2010, 13:29
Вопрос задал: Михайлов Константин Романович, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает Micren, Профессионал :
Здравствуйте, Михайлов Константин Романович.
Программа C++. Проверял GCC.
Код:
#include <locale>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <iterator>

using namespace std;

// Используемые синонимы для типов данных.
typedef vector<wstring> word_vector;
typedef wstring::const_iterator citer;

// Функция сравнения как и у Вас для букв и цифр.
int (*cmp_func)(wint_t) = iswalnum;

// Гласные буквы. Можете добавить сюда для других языков.
const wstring VOWELS = L"aeiouy";

// Разбивает строку на слова используя нашу функцию сравнения
word_vector parse_str(const wstring& str)
{
word_vector result;

// Начало слова
citer begin = find_if(str.begin(), str.end(), pointer_to_unary_function<wint_t, int>(cmp_func)), end;
while (begin != str.end())
{
// Конец слова
end = find_if(begin, str.end(), not1(pointer_to_unary_function<wint_t, int>(cmp_func)));
// Cохраняем слово
result.push_back(wstring(begin, end));
// Ищем дальше
begin = find_if(end, str.end(), pointer_to_unary_function<wint_t, int>(cmp_func));
}
return result;
}

// Разбивает строку на слова начинающиеся с гласных
word_vector parse_str_vowels(const wstring& str)
{
word_vector result;

citer begin = str.begin(), end;
begin = find_if(str.begin(), str.end(), pointer_to_unary_function<wint_t, int>(cmp_func));
while (begin != str.end())
{
end = find_if(begin, str.end(), not1(pointer_to_u nary_function<wint_t, int>(cmp_func)));
// Слово
wstring word(begin, end);
// Проверяем начинается ли с гласной
if (VOWELS.find(towlower(word[0])) != wstring::npos)
{
// Если да то сохраняем
result.push_back(word);
}
begin = find_if(end, str.end(), pointer_to_unary_function<wint_t, int>(cmp_func));
}
return result;
}

int main()
{
locale::global(locale(""));

// Вводим строку
wcout << L"Введите строку:" << endl;
wstring str;
getline(wcin, str);

// 1й вариант
wcout << L"Вариант 1:" << endl;
word_vector words = parse_str(str);
copy(words.begin(), words.end(), ostream_iterator<wstring, wchar_t>(wcout, L"\n"));

// 2й вариант
wcout << L"Вариант 2:" << endl;
words = parse_str_vowels(str);
copy(words.begin(), words.end(), ostream_iterator<wstring, wchar_t>(wcout, L"\n"));

// 3й вариант
wcout << L"Вариант 3:" << endl;
words = parse_str_vowels(str);
if (words.size())
{
wcout << words[0] << endl;
}
else
{
wcout << L"Нет слов начинающихся с гласных" << endl;
}

return 0;
}

Пример работы:
Код:
Введите строку:
English is a West Germanic language that developed in England and south-eastern Scotland during the Anglo-Saxon era.
Вариант 1:
English
is
a
West
G ermanic
language
that
developed
in
England
and
south
eastern
Scotland
during
the
Anglo
Saxon
era
Вариант 2:
English
is
a
in
England
and
eastern
Anglo
era
Вариант 3:
English


То же самое без использования STL. По просьбе из мини-форума.
Код:
#include <locale>
#include <iostream>
#include <cstring>

using namespace std;

// Размер буфера
const size_t MAX_LEN = 255;

// Гласные буквы. Можете добавить сюда для других языков.
const wchar_t* VOWELS = L"aeiouy";

// Выводит слова
void parse_str(const wchar_t* const str)
{
// Начало строки
const wchar_t *begin = str;
// Ищем п ервую букву или цифру
while (*begin && !iswalnum(*begin))
{
++begin;
}
// Пока не конец строки
while (*begin)
{
const wchar_t* end = begin;
// Ищем первую не букву или цифру
while (*end && iswalnum(*end))
{
++end;
}
// Выводим
while (begin != end)
{
wcout << *begin++;
}
wcout << endl;
// Продолжим поиск буквы или цифры
while (*begin && !iswalnum(*begin))
{
++begin;
}
}
}

// Выводит слова начинающиеся с гласной в количестве заданном 2м параметром
void parse_str_vowels(const wchar_t* const str,size_t count)
{
const wchar_t *begin = str, *end = 0;
while (*begin && !iswalnum(*begin))
{
++begin;
}
while (*begin)
{
end = begin;
while (*end && iswalnum(*end))
{
++end;
}
// Если первая буква гласная
if (wcschr(VOWELS, towlower(*begin)))
{
while (begin != end)
{
wcout << *begin++;
}
wcout << endl;
// Уменьшим счетчик и проверим не пора ли остановиться
if(!--count)
{
return;
}
}
else
{
begin = end;
}
while (*begin && !iswalnum(*begin))
{
++begin;
}
}
}

int main()
{
locale::global(locale(""));

wchar_t str[MAX_LEN];
wcout << L"Введите строку:" << endl;
wcin.getline(str, MAX_LEN);

wcout << L"Вариант 1:" << endl;
parse_str(str);

w cout << L"Вариант 2:" << endl;
parse_str_vowels(str,-1);

wcout << L"Вариант 3:" << endl;
parse_str_vowels(str,1);

return 0;
}

Ответ отправил: Micren, Профессионал
Ответ отправлен: 08.04.2010, 20:02
Номер ответа: 260685

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 260685 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Вопрос № 177762:

    Добрый вечер уважаемые эксперты, помогите написать програму на С++ которая решает уравнение Y = 1/4 - 1/4 sin(5/8Пи-8α)

    Отправлен: 09.04.2010, 02:46
    Вопрос задал: Xrom1989, Посетитель
    Всего ответов: 1
    Страница вопроса »


    Отвечает Boriss, Академик :
    Здравствуйте, Xrom1989.
    Вот, если я правильно Вас понял, то в приложении код
    Ежели нет, то пишите, исправлю, как надо
    Вид окна приложения:
    Код:
    Введите значение угла a: 1.23e-5
    0.25*(1 - sin(M_PI*5/8 - a*8) = 0.0190207

    Приложение:

    -----
    Вывод - то место в тексте, где вы устали думать

    Ответ отправил: Boriss, Академик
    Ответ отправлен: 09.04.2010, 15:25
    Номер ответа: 260723

    Оценка ответа: 5
    Комментарий к оценке:
    Очень благодарен. Кратко и понятно))

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 260723 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Вопрос № 177765:

    Уважаемые эксперты, помогите в написании следующей программы на языке С++:

    Написать, используя технику указателей, программу работы с базой отдела кадров. База размещается в текстовом файле произвольного размера. Каждая строка – запись об одном сотруднике.

    Формат записи о сотруднике:
    Фамилия и инициалы (через точку) - 30 символов, фамилия начинается в 1-й позиции,
    Год рождения – 5 символов.
    Заработная плата (оклад) – 10 позиций.

    Функции программы:
    Поиск по заданному критерию,
    Дополнение записи,
    Исключение записи,
    Корректировка записи.

    Отправлен: 09.04.2010, 03:46
    Вопрос задал: Sanches, Посетитель
    Всего ответов: 1
    Страница вопроса »


    Отвечает Verena, Профессионал :
    Здравствуйте, Sanches.
    Вот простейшая реализация, без контроля ввода и прочих красивостей, в этом смысле хорошо бы добавить проверки. Поиск сделала по имени или части имени. Условие про точку учла чисто условно, потому что не вижу в нём особого смысла. Если что-то не так, Вы всегда можете дополнить или расширить программу по аналогии.
    Указатели как факт используются - для работы со строками и файлами, хотя я и не уверена, что Вы это имели в виду. Речь могла идти о считывании файла в память, но это нерационально и так обычно не делают.
    Если что-то не ясно, спрашивайте. Проверено на Visual Studio 2005.
    Удачи!

    Приложение:

    -----
    Эта история - не для истории, понимаешь?

    Ответ отправил: Verena, Профессионал
    Ответ отправлен: 14.04.2010, 01:26
    Номер ответа: 260806

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 260806 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.14 от 03.03.2010

    В избранное