Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.05.2022, 21:42
NeField NeField вне форума
Прохожий
 
Регистрация: 24.05.2022
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
Злость Некорректная работа программы

Условие: Текст дан. Выведите в алфавитном порядке все глухие согласные буквы, не входящие только в одно слово;
Проблема: Должен выводить повторяющиеся буквы в алфавитном порядке, но выводит только одну букву, ближайшую к концу алфавита
Код:
procedure TForm1.Button1Click(Sender: TObject);
    const
    gl=['к','п','с','т','ф','х','ц','ч','ш','щ'];
    bk:string='кпстфхцчшщ';
    type mnoz=set of char;
    var  s,s1:string;
     m:array[1..100] of mnoz;
     mn,mn1:mnoz;
     n,i,j:byte;
     word: ShortString;
   begin
    s := LowerCase(Memo1.Text);
    s:=s+' ';
    n:=0;
    while pos(' ',s)>0 do
   begin
     s1:=copy(s,1,pos(' ',s)-1);
     n:=n+1;
     m[n]:=[];
    for j:=1 to length(s1) do
    if s1[j] in gl then m[n]:=m[n]+[s1[j]];
    delete(s,1,pos(' ',s));
   end;
  mn1:=[];
  for i:=1 to n do
   begin
    mn:=[];
    for j:=1 to n do
    if j<>i then mn:=mn+m[j];
    mn1:=mn1+(m[i]*mn);
    end;
   if mn1=[] then
   Memo2.Lines[0] := 'Букв, которые не входят только в одно слово, нет!';
    begin
     for i:=1 to length(bk) do
     if (bk[i] in mn1) then
     word := bk[i] + ' ';
    end;
    Memo2.Text := word;
 end;
Ответить с цитированием
  #2  
Старый 27.05.2022, 00:03
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,800
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Line 37 должна быть:
Код:
word := word + bk[i] + ' ';

PS. Лучше не использовать 'word' как имя переменной, т.к. есть такой тип данных.

PPS. Более простой способ деления текста на слова (по пробелу):
Код:
var
  sl : TStringList;
begin
  sl := TStringList.Create;
  Try
    sl.Delimiter := ' ';
    sl.Delimitedtext := Memo1.Lines.Text;
    ...
  Finally
    sl.Free;
  End;
В результате у тебя есть переменная sl - список слов (фактически, массив), доступ к элементам через sl[i]:
Код:
for I := 0 To sl.count-1 Do
  ShowMessage(sl[i]);

Последний раз редактировалось lmikle, 27.05.2022 в 00:09.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
NeField (27.05.2022)
  #3  
Старый 27.05.2022, 00:16
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,800
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вообще, все можно сделать проще:
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  Leters=['к','п','с','т','ф','х','ц','ч','ш','щ'];
var
  Out : String;
  sl : TStringList;
  I, J : Integer;
  Cnt : Integer;
begin
  Out := '';
  sl := TStringList.Create;
  Try
    sl.Delimiter := ' ';
    sl.Delimitedtext := AnsiLowerCase(Memo1.Lines.Text);

    For I := Low(Letters) To High(Letters) Do
	  Begin
	    Cnt := 0;
		For J := 0 To sl.Count-1 Do
		  If Pos(Letters[i],sl[J]) > 0 Then Inc(Cnt)
		If (Cnt > 0) and (Cnt = sl.Count-1) 
		  Then Out := Out + Letters[i] + ' ';
      End;
  Finally
    sl.Free;
  End;  
  If Out = '' 
    Then Memo2.Lines.Text := 'Букв, которые не входят только в одно слово, нет!'
	Else Memo2.Lines.Text := Out;
end;
Как-то так. Должно работать.

Последний раз редактировалось lmikle, 27.05.2022 в 18:35.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:31.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter   Ссылка на Telegram