Показать сообщение отдельно
  #1  
Старый 27.03.2013, 01:58
Zinkutal Zinkutal вне форума
Прохожий
 
Регистрация: 27.03.2013
Сообщения: 3
Версия Delphi: Delphi 7 Lite E
Репутация: 10
Вопрос Подскажите что не так

Ввести в двух строках ввода (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.
Ответить с цитированием