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

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

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

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

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

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

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

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

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

3
Mawrat
12827 / 5735 / 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
12827 / 5735 / 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

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

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

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


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

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

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