|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Подскажите что не так
Ввести в двух строках ввода (Edit) две строки из слов, разделенных пробелами.
После нажатия на кнопку (Button) в многострочный редактор (Memo) вывести три числа: первое - сколько слов в двух строках совпадает, второе - сколько слов из первой строки отсутствует во второй, третье - сколько слов во второй отсутствуют в первой. Отдельно имеется CheckBox - если он выбран, анализируются слова с учетом заглавных и строчных букв. Код:
unit laba05; interface {#4.5 Ввести в двух строках ввода (Edit) две строки из слов, разделенных пробелами. После нажатия на кнопку (Button) в многострочный редактор (Memo) вывести три числа: первое - сколько слов в двух строках совпадает, второе - сколько слов из первой строки отсутствует во второй, третье - сколько слов во второй отсутствуют в первой. Отдельно имеется CheckBox - если он выбран, анализируются слова с учетом заглавных и строчных букв.} uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const M = 100; type TArr = array[1..M] of String; TForm1 = class(TForm) edt1: TEdit; edt2: TEdit; btn1: TButton; mmo1: TMemo; mmo2: TMemo; chk1: TCheckBox; procedure GetWords(const aStr : String; var aArr : TArr; var aCnt : Integer); procedure edt1change(Sender: TObject); procedure edt2change(Sender: TObject); procedure btn1click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; s1,s2,s :string; //Arr1, Arr2 : TArr; // i, j, Cnt1, Cnt2, CntE : Integer; implementation {$R *.dfm} procedure GetWords(const aStr : String; var aArr : TArr; var aCnt : Integer); const D = ['.', ',', ':', ';', '!', '?', '-', ' ', #9, #10, #13]; var Sw : String; i, j, Len, LenW : Integer; begin Len := Length(aStr); Sw := ''; LenW := 0; aCnt := 0; for i := 1 to Len do if not (aStr[i] in D) then begin Inc(LenW); if (i = Len) or (aStr[i + 1] in D) then begin Sw := Copy(aStr, i - LenW + 1, LenW); j := 1; while (j <= aCnt) and (aArr[j] <> Sw) do Inc(j); if j > aCnt then begin Inc(aCnt); aArr[aCnt] := Sw; end; LenW := 0; end; end; end; procedure TForm1.edt1Change(Sender: TObject); begin s1:=edt1.text; s1:=mmo1.Text; end; procedure TForm1.edt2Change(Sender: TObject); begin s2:=edt2.text; s2:=mmo2.Text; end; procedure TForm1.btn1Click(Sender: TObject); var Arr1, Arr2 : TArr; i, j, Cnt1, Cnt2, CntE : Integer; begin GetWords(s1, Arr1, Cnt1); GetWords(s2, Arr2, Cnt2); CntE := 0; for i:=1 to Cnt1 do begin j := 1; while (j <= Cnt2) and (Arr1[i] <> Arr2[j]) do Inc(j); if j <= Cnt2 then Inc(CntE); end; ShowMessage( 'Количество совпадающих слов: ' + IntToStr(CntE) + #13#10'Количество слов первого текста, которых нет во втором тексте: ' + IntToStr(Cnt1 - CntE) + #13#10'Количество слов второго текста, которых нет в первом тексте: ' + IntToStr(Cnt2 - CntE) ); end; var Arr1, Arr2 : TArr; i, j, Cnt1, Cnt2, CntE : Integer; begin if chk1.Checked then begin GetWords(s1, Arr1, Cnt1); GetWords(s2, Arr2, Cnt2); end else begin GetWords(AnsiUpperCase(s1), Arr1, Cnt1); GetWords(AnsiUpperCase(s2), Arr2, Cnt2); end; CntE := 0; for i := 1 to Cnt1 do begin j := 1; while (j <= Cnt2) and (Arr1[i] <> Arr2[j]) do Inc(j); if j <= Cnt2 then Inc(CntE); end; ShowMessage( 'Количество совпадающих слов: ' + IntToStr(CntE) + #13#10'Количество слов первого текста, которых нет во втором тексте: ' + IntToStr(Cnt1 - CntE) + #13#10'Количество слов второго текста, которых нет в первом тексте: ' + IntToStr(Cnt2 - CntE) ); end. |
#2
|
||||
|
||||
Мне кажется код существенно упростится, если TStringList использовать. Примерно так:
Код:
procedure TForm7.Button1Click(Sender: TObject); Var SL: Array[1..2] of TStringList; i,j,Index: Integer; begin for i := 1 to 2 do SL[i] := TStringList.Create; SL[1].DelimitedText := Edit1.Text; SL[2].DelimitedText := Edit2.Text; Memo1.Clear; for i := 0 to SL[2].Count - 1 do for j := 0 to SL[1].Count - 1 do if SL[1].Strings[j] = SL[2].Strings[i] then Memo1.Lines.Add(IntToStr(i)); for i := 1 to 2 do SL[i].Free; end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 27.03.2013 в 09:01. |