Консультация № 177745
08.04.2010, 13:29
45.00 руб.
0 4 1
Требуется написать программу, которая после ввода текста/предложения, выводит в столбик по отдельности слова, без знаков препинания, после этого доработать программу что бы она выводила только слова, начинающиеся с гласной буквы+ещё вариант программы, где выводится только 1е слово, начинающееся на гласную.
Первую часть я сделал, слова в столбик выводятся как положено, прошу помочь доработать, что бы выводились только слова, начинающиеся с гласной буквы+ещё вариант программы, где выводится только 1е слово, начинающееся на гласную. И если можно, 3й вариант, где 1е слово на гласную, а остальные за ним идут как обычно.
P.S. Работает в CPP в досовской оболочке. Программу прилагаю.

Приложение:
#include "iostream.h"
void main(){
unsigned char S[255];
cout<<"Enter tour text:";
cin.get(S,255);
int i,len;
for (i=0; S[i]!=0; i++)
{
if (((S[i]>='a') && (S[i]<='z') || (S[i]>='A') && (S[i]<='Z')) || ((S[i]>='0') && (S[i]<='9')))
{
cout<<S[i];
len=0;
}
else
{
if (((S[i-1]>='a') && (S[i-1]<='z') || (S[i-1]>='A') && (S[i-1]<='Z')) || ((S[i-1]>='0') && (S[i-1]<='9')))
if (len !=1){
cout<<endl;
len=1;}
else{
cout<<"";
}
}
}
}

Обсуждение

Неизвестный
08.04.2010, 20:02
общий
это ответ
Здравствуйте, Михайлов Константин Романович.
Программа 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_unary_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
Germanic
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);

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

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

return 0;
}
Неизвестный
08.04.2010, 22:56
общий
У меня просто 2 лабы всего было по Си, я ничего практически не понял в ответе. Но всё равно огромное спасибо. Если можно, напишите мне всё относительно моего приложения, которое я прикрепил в 1м посте. То есть банально просто. Ещё раз огромное спасибо за всё!
Неизвестный
08.04.2010, 23:40
общий
Михайлов Константин Романович:
Т.е. надо написать без использования STL? Вы ведь и сами используете потоковые классы(cin,cout) оттуда. И вместо строковых классов(типа wstring) использовать массив char?

Хотя намного проще вряд ли получится(если по уму писать).

Указатели Вы хоть учили уже?
Неизвестный
09.04.2010, 21:11
общий
Михайлов Константин Романович:
Добавил в ответ без использования STL
Форма ответа