Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
1 / 1 / 0
Регистрация: 25.09.2014
Сообщений: 125

Множества. Вывод определенных слов

07.11.2014, 18:36. Показов 4158. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пусть дан текст, заканчивающийся точкой. Текст состоит из слов, разделённых пробелом.
Слово - последовательность русских букв(как строчных так и прописных).
Напечатать слова, что имеют чётный номер и состоят только из повторяющихся букв.
Пример: аАГГ олЛа кЛМн маМа паап лала ооО кКк.
Что должно вывести: маМа лала кКк

Дело в том, что нужно использовать множества.

(К превеликому сожалению, был болен пока тема изучалась и по-этому не понимаю).
(Не хочется просто так задачу оставлять).
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.11.2014, 18:36
Ответы с готовыми решениями:

Вывод определённых значений из таблицы, затем вывод их произведения на файл
Здравствуйте, как считать с файла только цифры(буквы не трогать), найти их произведение, затем вывести его в файл(output)? В интернете не...

Вывод определенных слов
Нужно чтобы слово пусть будет ПРИВЕТ и ПОКА из файла news.php, выводилось в нужном месте текста в файле rtm/ news1.php Выводится слова...

Работа с текстами, вывод определенных слов
Доброго времени суток! Есть задачка: Дан текст, содержащий буквы и пробелы. найти и напечатать слова и их количество, длина...

7
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
07.11.2014, 21:21
Описание сути решения
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Задача:
Дана строка. Найти и распечатать чётные слова, которые состоят только из
повторяющихся букв.
 
Суть решения:
Заведём два множества: Dw и Dwb. Будем просматривать буквы каждого слова в строке.
- Последовательно будем выделять слова строки и вести их подсчёт.
- Если слово оказалось чётным, то мы будем изучать его буквенный состав следующим
  образом:
-- Каждую букву слова будем записывать во множество Dw. Таким образом, множество
   Dw будет содержать буквы, которые встретились в текущем слове.
-- Если очередная буква ранее уже встречалась в этом слове, то это означает, что
   эта буква повторяется. Такие буквы мы будем записывать во множество Dwb.
   Т. е., множество Dwb - это множество тех букв, которые повторяются в
   текущем слове.
-- Теперь, имея для текущего слова множества Dw и Dwb, проверим - если эти два
   множества совпадают, то это значит, что множество букв слова совпадает со
   множеством повторяющихся букв этого же слова - т. е., это слово состоит
   только из повторяющихся букв. Это, как раз, такое слово, которое мы ищем.
 
Пример диалога программы:
 
Задайте текст:
аАГГ олЛа кЛМн маМа паап лала ооО кКк.
Перечень чётных слов, которые состоят только из повторяющихся букв:
маМа
лала
кКк
Повторить - Enter. Выход - любой символ + Enter.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
program Project1;
 
{Перевод букв строки в верхний регистр. Для кодовой страницы CP866 (OEM, DOS).}
function UpCase866(const aStr : String) : String;
var
  S : String;
  i : Integer;
begin
  S := aStr;
  for i := 1 to Length(S) do
    if S[i] in ['а'..'п'] then
      S[i] := Chr(Ord(S[i]) - 32)
    else if s[i] in ['р'..'я'] then
      S[i] := Chr(Ord(S[i]) - 80)
    else if S[i] = 'ё' then
      S[i]:='Ё'
    else
      S[i] := UpCase(S[i]);
  UpCase866 := S;
end;
 
const
  {Множество разделителей слов.}
  D = [' ', '.', ',', ':', ';', '-', '!', '?', #9, #10, #13];
var
  S, S1 : String;
  Dw, Dwb : set of Char;
  i, Len, LenW, Cnt : Integer;
begin
  repeat
    Writeln('Задайте текст:');
    Readln(S1);
 
    {Решение.}
    Writeln('Перечень чётных слов, которые состоят только из повторяющихся букв:');
    S := UpCase866(S1); {Приводим буквы строки к верхнему регистру.}
    Len := Length(S);   {Длина строки.}
    LenW := 0;          {Длина текущего слова.}
    Dw := [];           {Множество букв, которые встретились в текущем слове.}
    Dwb := [];          {Множество букв, которые в текущем слове имеют повторы.}
    Cnt := 0;           {Счётчик слов.}
    for i := 1 to Len do
      if not (S[i] in D) then {Если символ не является разделителем, значит он принадлежит слову.}
      begin
        Inc(LenW);            {Учитываем очередную букву в длине слова.}
        if S[i] in Dw then    {Если буква имеет повтор в текущем слове.}
          Dwb := Dwb + [S[i]] {Добавляем букву во множество повторов.}
        else                  {Иначе.}
          Dw := Dw + [S[i]];  {Добавляем букву во множество букв текущего слова.}
        {Отслеживаем конец слова.}
        if (i = Len) or (S[i + 1] in D) then
        begin
          Inc(Cnt); {Порядковый номер текущего слова.}
          {Если слово является чётным, то проверяем результаты его буквенного
          анализа. Если множество букв слова совпадает со множеством повторяющихся
          букв этого слова, то это означает, что это слово состоит только
          из повторяющихся букв.}
          if (Cnt mod 2 = 0) and (Dw = Dwb) then
            Writeln(Copy(S1, i - LenW + 1, LenW)); {Распечатываем найденное слово.}
          {Обнуление переменных, связанных с обработкой отдельных слов.}
          LenW := 0;
          Dw := [];
          Dwb := [];
        end;
      end;
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
0
1 / 1 / 0
Регистрация: 25.09.2014
Сообщений: 125
07.11.2014, 23:38  [ТС]
Понял. Но когда переделывал, что бы не было возможности повторения программы и без перевода букв в верхний регистр, то программа выдавала пустой ответ.

Переделайте, чтобы было без возможности повтора и перевода букв в верхний регистр(как оказалось - он не нужен).

Добавлено через 1 час 34 минуты
Вот последняя моя правка:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Program smlttrsnwrd;
const   D=[' ',',','-'];
var     s,s1:string;
        dw,dwb:set of char;
        i,len,lenw,cnt:integer;
 
Begin
write('Zadayte text: ');
readln(s);
writeln('Nechetnye slova s povtoryayschimisya bykvami: ');
len:=Length(s);
lenw:=0;
dw:=[];
dwb:=[];
cnt:=0;
for i:=1 to len do
if not(s[i] in D) then
Begin
inc(lenw);
if s[i] in dw then
dwb:=dwb+[s[i]]
else
dw:=dw+[s[i]];
if (i=len) or (s[i+1] in D) then
Begin
inc(cnt);
if (cnt mod 2 = 0) and (dw=dwb) then
writeln(Copy(s,i-lenw+1,lenw));
End;
End;
readln;
End.
P.S.: Использовал другой пример: asd kaka lala dada
Должно вывести: kaka dada
Но, увы, выводит пустое место.
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
08.11.2014, 00:02
Цитата Сообщение от Magestian Посмотреть сообщение
Переделайте, чтобы было без возможности повтора и перевода букв в верхний регистр(как оказалось - он не нужен).
Без перевода букв в верхний регистр:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
program Project1;
 
const
  {Множество разделителей слов.}
  D = [' ', '.', ',', ':', ';', '-', '!', '?', #9, #10, #13];
var
  S : String;
  Dw, Dwb : set of Char;
  i, Len, LenW, Cnt : Integer;
begin
  repeat
    Writeln('Задайте текст:');
    Readln(S);
 
    {Решение.}
    Writeln('Перечень чётных слов, которые состоят только из повторяющихся букв:');
    Len := Length(S);   {Длина строки.}
    LenW := 0;          {Длина текущего слова.}
    Dw := [];           {Множество букв, которые встретились в текущем слове.}
    Dwb := [];          {Множество букв, которые в текущем слове имеют повторы.}
    Cnt := 0;           {Счётчик слов.}
    for i := 1 to Len do
      if not (S[i] in D) then {Если символ не является разделителем, значит он принадлежит слову.}
      begin
        Inc(LenW);            {Учитываем очередную букву в длине слова.}
        if S[i] in Dw then    {Если буква имеет повтор в текущем слове.}
          Dwb := Dwb + [S[i]] {Добавляем букву во множество повторов.}
        else                  {Иначе.}
          Dw := Dw + [S[i]];  {Добавляем букву во множество букв текущего слова.}
        {Отслеживаем конец слова.}
        if (i = Len) or (S[i + 1] in D) then
        begin
          Inc(Cnt); {Порядковый номер текущего слова.}
          {Если слово является чётным, то проверяем результаты его буквенного
          анализа. Если множество букв слова совпадает со множеством повторяющихся
          букв этого слова, то это означает, что это слово состоит только
          из повторяющихся букв.}
          if (Cnt mod 2 = 0) and (Dw = Dwb) then
            Writeln(Copy(S, i - LenW + 1, LenW)); {Распечатываем найденное слово.}
          {Обнуление переменных, связанных с обработкой отдельных слов.}
          LenW := 0;
          Dw := [];
          Dwb := [];
        end;
      end;
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
Добавлено через 1 минуту
Но при этом предполагается, что в исходной строке пользователем должен быть задан текст либо только из строчных букв, либо - только из заглавных. Потому, что в новом варианте программа считает строчные и прописные буквы различными (например, А <> а).

Добавлено через 1 минуту
Цитата Сообщение от Magestian Посмотреть сообщение
без возможности повтора
Имеется в виду, чтобы повторы слов не распечатывались?
0
1 / 1 / 0
Регистрация: 25.09.2014
Сообщений: 125
08.11.2014, 00:10  [ТС]
Без:
Pascal
1
2
3
4
 Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
08.11.2014, 00:13
Лучший ответ Сообщение было отмечено Magestian как решение

Решение

Без повтора:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
program Project1;
 
const
  {Множество разделителей слов.}
  D = [' ', '.', ',', ':', ';', '-', '!', '?', #9, #10, #13];
var
  S : String;
  Dw, Dwb : set of Char;
  i, Len, LenW, Cnt : Integer;
begin
  {Решение.}
  Writeln('Перечень чётных слов, которые состоят только из повторяющихся букв:');
  Len := Length(S);   {Длина строки.}
  LenW := 0;          {Длина текущего слова.}
  Dw := [];           {Множество букв, которые встретились в текущем слове.}
  Dwb := [];          {Множество букв, которые в текущем слове имеют повторы.}
  Cnt := 0;           {Счётчик слов.}
  for i := 1 to Len do
    if not (S[i] in D) then {Если символ не является разделителем, значит он принадлежит слову.}
    begin
      Inc(LenW);            {Учитываем очередную букву в длине слова.}
      if S[i] in Dw then    {Если буква имеет повтор в текущем слове.}
        Dwb := Dwb + [S[i]] {Добавляем букву во множество повторов.}
      else                  {Иначе.}
        Dw := Dw + [S[i]];  {Добавляем букву во множество букв текущего слова.}
      {Отслеживаем конец слова.}
      if (i = Len) or (S[i + 1] in D) then
      begin
        Inc(Cnt); {Порядковый номер текущего слова.}
        {Если слово является чётным, то проверяем результаты его буквенного
        анализа. Если множество букв слова совпадает со множеством повторяющихся
        букв этого слова, то это означает, что это слово состоит только
        из повторяющихся букв.}
        if (Cnt mod 2 = 0) and (Dw = Dwb) then
          Writeln(Copy(S, i - LenW + 1, LenW)); {Распечатываем найденное слово.}
        {Обнуление переменных, связанных с обработкой отдельных слов.}
        LenW := 0;
        Dw := [];
        Dwb := [];
      end;
    end;
  Readln;
end.
1
1 / 1 / 0
Регистрация: 25.09.2014
Сообщений: 125
08.11.2014, 00:19  [ТС]
Доглядел бы я у себя ошибку - заработало б
Спасибо Вам, увидел ошибку
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
08.11.2014, 00:25
Цитата Сообщение от Magestian Посмотреть сообщение
Доглядел бы я у себя ошибку - заработало б
В твоём коде пропущены строки с обнулением переменных LenW, Dw, Dwb. Если их добавить, то всё, как надо заработает.

Добавлено через 1 минуту
И переменную S1 там надо убрать - она теперь лишняя.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.11.2014, 00:25
Помогаю со студенческими работами здесь

Вывод определенных слов при вводе цифр
Нужна программа на СИ, не на Си++, с использованием switch... что бы при нажатии 1,2,3...9.. выводились определенные слова..

Работа с текстовым файлом. Вывод определенных строк и слов
Ребят, привет! Помогите задачки решить, половину сама осилила, а над остальным уже второй день бьюсь... В общем обязательно решение...

Программа для слежением появлением определенных слов на определенных сайтах
Все привет! Мне необходимо быть в курсе дел по одному вопросу, но нет времени постоянно следить за десятком сайтов. Соответственно,...

Поиск определенных слов в ТХТ файле, и запись этих слов (если найдено) в отдельный файл
К примеру, есть файл &quot;Text.txt&quot;. В нем есть 1000 строк. Если какая-то строка = привет, то echo Привет &gt;&gt; Output.txt Как это...

таблица рандомных слов. выделение определенных слов
Задание: Таблица с разными словами; выделить все ячейки, слова в которых начинаются и оканчиваются на одну и ту же букву (и содержащее не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru