Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/14: Рейтинг темы: голосов - 14, средняя оценка - 5.00
Sketch_45
0 / 0 / 0
Регистрация: 16.03.2011
Сообщений: 18
#1

Найти слова в тексте, не содержащие указанные буквы.

07.03.2012, 11:02. Просмотров 2496. Ответов 12
Метки нет (Все метки)

1 Дан текст на русском языке и не которые две буквы. Найти слова не содержащее указанные буквы.
2 Дан строка, подсчитать сколько различных символов встречаются в ней
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2012, 11:02
Ответы с готовыми решениями:

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

Дана строка, содержащая текст, заканчивающийся точкой. Вывести на экран слова, содержащие три буквы
Дана строка, содержащая текст, заканчивающийся точкой. Вывести на экран слова,...

Найти и записать в Memo слова содержащие более 3х гласных букв
суть программы изложена в названии темы. текст вводится в компонент Memo. Моя...

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

Найти слова, которые встречаются в тексте только 1 раз
Это одна из функций текстового редактора. Напишите, пожалуйста, код

12
Lirrk
Заблокирован
07.03.2012, 11:59 #2
Всё это решается через список
Задача первая
1 Текст из мемо помещается в список
2 Стандартной процедурой разбиваем его на составляющие списка
Теперь каждое слово в своей строке.
3 Сортируем список
5 Начинаем сканирование списка с нижней строки
6 Проверяем, было ли уже это слово Если да, уничтожаем строку и продолжаем цикл
если нет
- Проверяем через POS наличие данных символов в строке, если они есть, строка уничтожается.

После того, как все строки будут пройдены, вывести результат в другой мемо

PS Следует предусмотреть очистку от мусора. Знаков припенаний табуляций и так далее

Задача вторая
1 Создать список.
2 Внести в него посимвольно строку.
3 Отсортировать список
4 уничтожить все повтрения
5 Прочитать значение Count списка. Это и будет количество символов.
1
Jazon_deenAlt
4111 / 986 / 191
Регистрация: 09.04.2009
Сообщений: 4,226
07.03.2012, 12:14 #3
вторую задачу можно сделать 2-мя цыклами
Delphi
1
2
3
for i:=1 to length(s) do
  for j:=length(s) downto i+1 do
    if s[i]=s[j] then delete(s,j,1)
после етого count:=length(s);
как-то так
1
Mawrat
12824 / 5732 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
07.03.2012, 15:34 #4
Лучший ответ Сообщение было отмечено как решение

Решение

Обе задачи удобно решать с помощью множеств.

Решение первой задачи. На форму надо положить TButton, TEdit, два TMemo. Для кнопки создать обработчик события OnClick и оформить его код так:
Delphi
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
procedure TForm1.Button1Click(Sender: TObject);
const
  //Множество разделителей слов.
  D = ['.', ',', ':', ';', '!', '?', '-', ' ', #9, #10, #13];
var
  S : String;
  Da : set of Char;
  i, Len, LenW, CntA : Integer;
begin
  //Составляем множетсво букв. В множество добавляем строчный и заглавный
  //варианты букв.
  S := Edit1.Text;
  Da := [];
  for i := 1 to Length(S) do
    if not (S[i] in D) then
      Da := Da + [ AnsiUpperCase(S[i])[1], AnsiLowerCase(S[i])[1] ]
  ;
  if Da = [] then begin
    ShowMessage('Буквы не заданы. Действие отменено.');
    Exit;
  end;
 
  //Обработка текста и распечатка искомых слов.
  Memo2.Clear;
  Memo2.Lines.Add('Перечень слов, которые не содержат заданые буквы:');
  S := Memo1.Text;
  Len := Length(S);
  LenW := 0;
  CntA := 0;
  for i := 1 to Len do begin
    //Пропускаем разделители.
    if S[i] in D then Continue;
    //Подсчёт заданных букв в слове.
    if S[i] in Da then Inc(CntA);
    //Уточняем длину слова.
    Inc(LenW);
    //Отслеживаем конец слова.
    if (i = Len) or (S[i + 1] in D) then begin
      //Если заданных букв нет в слове - распечатываем его.
      if CntA = 0 then
        Memo2.Lines.Add( Copy(S, i - LenW + 1, LenW) );
      //Сброс счётчика заданных букв.
      CntA := 0;
      //Сброс длины слова.
      LenW := 0;
    end;
  end;
end;
В Edit1 вводятся буквы - их можно вводить подряд или разделять пробелами, запятыми и т. п. В Memo1 следует ввести исследуемый текст. В Memo2 программа выведет результат решения задачи.

Вторая задача решается так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.Button1Click(Sender: TObject);
var
  S : String;
  D : set of Char;
  i, Cnt : Integer;
begin
  S := Memo1.Text;
  D := [];
  Cnt := 0;
  for i := 1 to Length(S) do begin
    if S[i] in D then Continue;
    Inc(Cnt);
    D := D + [ S[i] ];
  end;
 
  //Ответ.
  ShowMessage('Количество различных символов: ' + IntToStr(Cnt));
end;
1
Lirrk
Заблокирован
07.03.2012, 15:56 #5
Mawrat,
У вас не учтён тот факт, что в тексте может быть множество одинаковых слов, подходящих под условие. Все они попадут в список. Это-во первых.
И ваш способ был бы целесообразен. если бы это был голый паскаль.
Ну в Delphi лучше всего использовать его возможности.
Ваш вариант намного проще было бы реализовать через два потока.
А что касается перебора символов пунктуации... Он всё равно есть, даже если вы использовали скрытый способ проверки. Намного оптимальне проверить символ на вхождение в нужный диапазон.
0
Mawrat
12824 / 5732 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
07.03.2012, 18:00 #6
Цитата Сообщение от Lirrk Посмотреть сообщение
Mawrat,
У вас не учтён тот факт, что в тексте может быть множество одинаковых слов, подходящих под условие. Все они попадут в список.
Lirrk, это и не надо учитывать. Если бы в ответе надо было вывести только различающиеся слова - это было бы отражено в условии. Но в условии этого нет - значит, надо вывести все слова, в которых нет заданных букв.
Цитата Сообщение от Lirrk Посмотреть сообщение
И ваш способ был бы целесообразен. если бы это был голый паскаль.
Ну в Delphi лучше всего использовать его возможности.
Не соглашусь. Тот код, который я привёл - это и есть оптимальное применение возможностей языка. Кроме этого, код скоростной и подходит для обработки больших текстов. Я конечно не против использования компонентов, потомков от TStrings. Но часто можно обходиться без них, тем более, если требуется обеспечить высокую скорость обработки.
Цитата Сообщение от Lirrk Посмотреть сообщение
Ваш вариант намного проще было бы реализовать через два потока.
Это врядли... Можно написать код с потоками и сравнить их.
Цитата Сообщение от Lirrk Посмотреть сообщение
А что касается перебора символов пунктуации... Он всё равно есть, даже если вы использовали скрытый способ проверки. Намного оптимальне проверить символ на вхождение в нужный диапазон.
Перебора там нет. Как я понял, имеется в виду применение оператора IN в отношении множеств. - Он не выражается перебором. Кроме всего прочего, код работы со множествами оптимизируется компилятором.
0
Lirrk
Заблокирован
07.03.2012, 19:41 #7
Mawrat,
Я между прочим и говорил про TStrings в своём предложении.
0
Mawrat
12824 / 5732 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
07.03.2012, 19:55 #8
Цитата Сообщение от Lirrk Посмотреть сообщение
Я между прочим и говорил про TStrings в своём предложении.
Понятно. А я подумал, речь идёт о том, как компилятор преобразует код оператора IN.
Я не против применения TStrings. Вообще, то решение, которое я написал - это только один из способов. Спору нет - можно по-разному задачу решать.
0
Sketch_45
0 / 0 / 0
Регистрация: 16.03.2011
Сообщений: 18
09.03.2012, 12:03  [ТС] #9
О рябата спасибо что откликнулись но мне надо просто решить через два edit т.е. в одном вожу строку а во втором ответ. через мемо решать не надо т.к. мы таким решением не делали( сейчас попробую из того что помогли изменить текст и получить что надо...
0
Arcor
4882 / 1834 / 382
Регистрация: 20.11.2009
Сообщений: 5,887
Записей в блоге: 1
09.03.2012, 12:11 #10
Цитата Сообщение от Sketch_45 Посмотреть сообщение
через мемо решать не надо т.к. мы таким решением не делали

Не по теме:

все больше и больше поражают такие ответы..., да какая разница через что решать? мемо, эдиты и прочие компоненты, это просто для визуального просмотра текста, а так решай через массивы, списки... и выводи куда душе вздумается...



Добавлено через 2 минуты
Цитата Сообщение от Lirrk Посмотреть сообщение
Я между прочим и говорил про TStrings в своём предложении.
нуууу!!!! у Memo1.Lines и есть класс TString, как Mawrat и сделал
0
Sketch_45
0 / 0 / 0
Регистрация: 16.03.2011
Сообщений: 18
09.03.2012, 15:04  [ТС] #11
Цитата Сообщение от Sketch_45 Посмотреть сообщение
О ребята спасибо что откликнулись но мне надо просто решить через два edit т.е. в одном вожу строку а во втором ответ. через мемо решать не надо т.к. мы таким решением не делали( сейчас попробую из того что помогли изменить текст и получить что надо...
Тут на путал все правильно надо решать через memo! Только 2 задача не до конца написана была там ещё "2 Дана строка, подсчитать сколько различных символов встречаются в ней и вывести всё на экран"
0
Mawrat
12824 / 5732 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
09.03.2012, 15:33 #12
Цитата Сообщение от Sketch_45 Посмотреть сообщение
Только 2 задача не до конца написана была там ещё "2 Дана строка, подсчитать сколько различных символов встречаются в ней и вывести всё на экран"
На форму надо положить TButton и два TMemo. Для кнопки создать обработчик события OnClick и его код оформить так:
Delphi
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
procedure TForm1.Button1Click(Sender: TObject);
var
  S, SRes : String;
  D : set of Char;
  i, Cnt : Integer;
begin
  S := Memo1.Text;
  D := [];
  Cnt := 0;
  SRes := '';
  for i := 1 to Length(S) do begin
    if S[i] in D then Continue;
    Inc(Cnt);
    D := D + [ S[i] ];
    if Cnt > 1 then SRes := SRes + ', ';
    if S[i] < #33 then
      SRes := SRes + '#' + IntToStr(Ord(S[i])) //Неотображаемые символы.
    else
      SRes := SRes + S[i]; //Отображаемые символы.
  end;
 
  //Ответ.
  Memo2.Lines.Add('Количество различных символов: ' + IntToStr(Cnt));
  Memo2.Lines.Add('Список различных символов:');
  Memo2.Lines.Add(SRes);
end;
Исходный текст вводится в Мемо1. Ответ выводится в Мемо2.
1
Sketch_45
0 / 0 / 0
Регистрация: 16.03.2011
Сообщений: 18
09.03.2012, 16:47  [ТС] #13
Mawrat спасибо большое за решение задач во второй задачи я дополнил 23. memo2.clear;
0
09.03.2012, 16:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2012, 16:47

Поместить в начало строки слова, содержащие только цифры, а затем все остальные слова
Помогите решить задачку, :)строка состоит из слов разделенных ровно 1 пробелом,...

Дан текст.Найти все палиндромы(слова-перевёртыши)в етом тексте
Доброго времени суток ув.форумчане!Нужна ваша помощь в решении задачи по...

Найти слова из латинских букв которые встречаются в тексте чаще всего
Это одна из функций текстового редактора. Напишите код, пожалуйста. Заранее...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru