|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Некорректная работа программы
Условие: Текст дан. Выведите в алфавитном порядке все глухие согласные буквы, не входящие только в одно слово;
Проблема: Должен выводить повторяющиеся буквы в алфавитном порядке, но выводит только одну букву, ближайшую к концу алфавита Код:
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
|
|||
|
|||
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; Код:
for I := 0 To sl.count-1 Do ShowMessage(sl[i]); Последний раз редактировалось lmikle, 27.05.2022 в 00:09. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
NeField (27.05.2022)
|
#3
|
|||
|
|||
Вообще, все можно сделать проще:
Код:
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. |