Консультация # 186251: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Здравствуйте! Прошу помощи в написании кода на с++ 1) Строковый тип Строка текста содержит слова, пробелы, знаки препинания. Перенос слов со строки на строку запрещен. Текст занимает одну или несколько строк.Выделить в тексте слова, которые содержат трехбуквенный отрезок русского алфавита...
Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Здравствуйте! Прошу помощи в написании кода на с++ 1) Строковый тип Строка текста содержит слова, пробелы, знаки препинания. Перенос слов со строки на строку запрещен. Текст занимает одну или несколько строк.Выделить в тексте слова, которые содержат трехбуквенный отрезок русского алфавита(3 слога). например слова надежда.
2) Строковый тип В каждой из некоторого количества строк указать все группы последовательных одинаковых символов
(серий), а так же самую длинную серию.
Здравствуйте, Денис! 1) Вот Вам программа, считающая 3-х слоговые слова (что тоже самое - считающая слова с 3-мя гласными буквами!)
Код :
#include <locale>
#include <iostream>
#include <conio.h>
using namespace std;
struct w3s //структура для хранения слов из 3 слогов
{
char *w; //указатель на слово
w3s *next; //указатель на следующего, у последнего = NULL
};
char *sGlasn = "аяеэоёыиуюАЯЕЭОЁЫИУЮ"; //русские гласные буквы
w3s *pw3s = NULL; //указатель на первый элемент в цепочке найденных слов
bool IsRussian(char ch) //проверка на русскую букву
{
return (((ch >= 'А') && (ch <= 'я')) || (ch == 'ё') || (ch <= 'Ё'));
}
bool IsGlasn(char ch) //проверка на гласную
{
return (NULL != strchr(sGlasn, ch)); //ищем в строке символ
}
void addWord(char *w) //сохранение слова в цепочке слов
{
w3s *p; //указатель на текущее слово (в цикле)
w3s *last; //указатель на последнего,
// после которого вставим новое слово
w3s *n = new w3s; //создаем новый элемент цепочки
n->w = new char[strlen(w)+1]; //запрашиваем память под строку-слово
strcpy(n->w, w); //копируем
n->next = NULL; //будет последним
//найдем, куда вставить
for (last=NULL,p=pw3s; p; last=p,p=p->next); //last - указатель на последний элемент
if (last) //что-то уже есть?
last->next = n; //даем ссылку на нового
else //еще ничего не было
pw3s = n; //запоминаем, как первого в цепочке
}
void printWords(void) //вывод найденных слов
{
w3s *p;
if (pw3s) //что-то нашли?
for (p=pw3s; p; p=p->next) //по всем элементам цепочки
cout << p->w << endl; //выводим слова
else
cout << "Слова не найдены" << endl; //ни одного слова не нашли...
}
void freeWords(void) //освобождение памяти цепочки слов
{
w3s *p, *next;
for (p=pw3s; p; p=next)
{
next = p->next; //сохраним адрес следующего
delete []p->w; //удаляем строку текущего
delete p; //удаляем текущего
}
}
void SearchWords(char *str) //поиск слов в строке
{
int count; //счетчик гласных (слогов!)
char *pWord; //указатель на начало слова
bool fWord = false; //=true - русская буква, =false - разделитель
for(count=0; *str; str++) //по всем символам строки
{
if (IsRussian(*str)) //русская буква?
{
if (!fWord) //первая буква слова? (переход от разделителя до буквы)
{
fWord = true; //имеем слово
pWord = str; //сохраним начало слова
}
count += IsGlasn(*str); //если гласная, то добавится 1, иначе - 0 (считаем гласные)
}
else //любой другой символ - разделитель
{
fWord = false; //помечаем, что разделитель
if (count == 3) //закончилось слово с 3 гласными?
{
*str = 0; //закроем нулем
addWord(pWord); //сохраним в цепочке слов!
}
count = 0; //сбрасываем счетчик гласных букв
}
}
if (count == 3) //проверим последнее слово
addWord(pWord); //если 3 слога, то сохраняем
}
int main()
{
char str[256];
system("chcp 1251 >> nul"); //чтобы писалось по-русски
while (true)
{
cin.getline(str, 256); //вводим строку
if (str[0] == 0) //ввод заканчиваем пустой строкой!
break; //на вывод результата
SearchWords(str); //поиск нужных слов в введенной строке
}
printWords(); //выводим слова
freeWords(); //освобождаем память
getch(); //ждем нажатие на клавишу, чтобы сразу не ушло с экрана
return (0);
}
Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 05.06.2012, 02:37
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!