Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Sarmak
58 / 57 / 5
Регистрация: 01.12.2009
Сообщений: 177
#1

Строка. Вывести слова. - Delphi

20.09.2010, 01:18. Просмотров 747. Ответов 3
Метки нет (Все метки)

Дана строка с латинскими словами, разделенными одним или несколькими пробелами. Вывести в другую строку те слова, перед которыми находятся только предшествующие по алфавиту, а за ними только последующие.
Пример:
Дано: abc cde fgh aaa kkk lmh
Вывести: cde kkk
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2010, 01:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Строка. Вывести слова. (Delphi):

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

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

Строка: вывести на экран слова с четным количеством символов.
помогите где ошибка Дана строка, состоящая из слов, отделенных друг от друга...

Строка: Вывести все слова, у которых первая и последняя буквы одинаковые
Дана строка, вывести все слова, у которых первая и последняя буквы одинаковые....

Дана строка. Вывести те слова, которые содержат хотя бы одну букву k
Можно использовать функции: copy, concat, length, pos, delete, insert. var ...

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

3
Mawrat
12821 / 5729 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
20.09.2010, 11:08 #2
В качестве элемента решения могу предложить функцию, которая извлекает из текста слова и для каждого слова прописывает "минимальный" и "максимальный" символ. Результат возвращает в виде массива, который содержит информацию по каждому слову.
Дальше надо будет анализировать каждый элемент этого массива - если CharMin слова больше чем CharMax всех предыдущих слов - то такое слово является кандидатом на попадание в рузельтирующую строку. Если для этого же слова выполняется следующее условие - что его CharMax меньше, чем CharMin всех последующих слов массива - то такое слово записывается в рузультирующую строку, иначе - не записывается.
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
type
  TWordInfo = record
    StrWord : String;
    ChrMin : Char;
    ChrMax : Char;
  end;
  TArrWords = array of TWordInfo;
 
function GetWords(const aStr : String) : TArrWords;
const
  (*Множество разделителей слов.*)
  D = [' ', '.', ',', ':', ';', '!', '?', #9, #10, #13];
  Capacity = 10;
var
  i, j, Pos1, Pos2 : Integer;
  ChrMin, ChrMax : Char;
begin
  SetLength(Result, 0);
  Pos1 := 0;
  Pos2 := 0;
  ChrMin := #0;
  ChrMax := #0;
  for i := 1 to Length(aStr) do begin
    (*Если очередной символ является разделителем - пропускаем его.*)
    if aStr[i] in D then Continue;
    (*Отслеживаем начало слова.*)
    if i = 1 then
      Pos1 := i
    else if aStr[i - 1] in D then
      Pos1 := i
    ;
    (*Отслеживаем конец слова.*)
    if i = Length(aStr) then
      Pos2 := i
    else if aStr[i + 1] in D then
      Pos2 := i
    ;
    //Определение "наименьшего" символа в слове.
    if aStr[i] < ChrMin then
      ChrMin := aStr[i]
    ;
    //Определение "наибольшего" символа в слове.
    if aStr[i] > ChrMax then
      ChrMax := aStr[i]
    ;
    (*Если конец слова найден - обрабатываем его.*)
    if Pos2 > 0 then begin
      //Наращиваем длину массива, если требуется.
      if j = Length(Result) then SetLength(Result, j + Capacity);
      Result[j].StrWord := Copy(aStr, Pos1, Pos2 - Pos1 + 1);
      Result[j].ChrMin := ChrMin;
      Result[j].ChrMax := ChrMax;
      //Индекс следующего элементa массива.
      Inc(j);
      //Сброс показателей.
      ChrMin := #0;
      ChrMax := #0;
      //Сбрасываем флаг-координату конца слова.
      Pos2 := 0;
    end;
  end;
  //Устанавливаем длину массива равной количеству добавленных в массив элементов.
  if Length(Result) > j then SetLength(Result, j);
end;
1
Sarmak
58 / 57 / 5
Регистрация: 01.12.2009
Сообщений: 177
20.09.2010, 17:22  [ТС] #3
Благодарен. Больно сложно закрутили =)
Моё воплощение:
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
//Вырезаем по одному слову этой функцией.
function TAlfavet.find(var s: string): string;
 
var i:integer;
  begin
    i:=pos(' ',s);
    if (i>2) then
      begin
        result:=copy(s,1,i-1);
        delete(s,1,i);
        s:=trim(s);
      end
    else
      begin
        result:=trim(s);
        s:='';
      end;
  end;
 
//Собственно ищем и выводим.
procedure TAlfavet.vivodClick(Sender: TObject);
 
var n,s,s1,s2:string;
 
  begin
    s:=stroka.text;
    s1:=find(s);
    s2:=find(s);
    n:='';
    while (length(s)<>0) do
      if (s1<s2)
      then
        begin
          s1:=s2;
          s2:=find(s);
          if s1<s2
          then n:=n+s1+' ';
        end
      else
        begin
          s1:=s2;
          s2:=find(s);
        end;
    if n='' then result.caption:='Подходящих слов нет'
    else result.caption:='Подходящие слова: '+n;
  end;
//это гуи, но смысл думаю понятен.
0
Mawrat
12821 / 5729 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
20.09.2010, 20:57 #4
Да, можно так. Я в Delphi стараюсь избегать применения процедур Insert() и Delete() по причине того, что они приводят к перераспределению памяти (в отличае от Pascal). Если обрабатывается небольшой текст - это не страшно. А вот если текст большой - несколько мегобайт, например, тогда Insert() и Delete() становятся очень ресурсоёмкими. Например, если удалить из строки размером 1 Мбайт 1 символ, это будет эквивалентно 1 Млн. операций. Т. к. при перераспределении памяти под новую строку происходит копирование всех символов прежней строки в новую область памяти (в новую строку), за исключением удалённого символа. Правда, положение очень сильно исправляет опитимизатор, встроенный в диспетчер памяти Delphi. Тем не менее, на больших текстах надо стараться избегать Insert() и Delete(), как я уже говорил.
---
Применительно к нашей задаче эти соображения можно не учитывать, т. к. имеется в виду небольшая строка.
---
И ещё, чтобы учесть случай, когда исходная строка содержит только одно слово, необрамлённое ни одним пробелом, а также случай, когда имеются ведущие пробелы в строке, надо делать так:
Delphi
1
2
3
4
5
6
procedure TAlfavet.vivodClick(Sender: TObject);
var n,s,s1,s2:string;
begin
  s:=stroka.text;
  s := TrimLeft(s) + ' ';
...
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2010, 20:57
Привет! Вот еще темы с решениями:

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

Строка: Вывести слова, оканчивающиеся на букву ′о′
Дан текст из строчных русских букв: между словами – пробел, после по-следнего...

Строка: Напечатать слова текста, максимальные по длине, которые отличны от последнего слова
Дан текст, содержащий от 2 до 50 слов, в каждом из которых от 1 до 7 строчных...

Вывести все слова текста, которые нельзя составить из «ключевого» слова
Помогите пожалуйста,в edit1 вводиться текст нужно вывести все слова текста,...


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

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

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