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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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.
Ответить с цитированием
  #2  
Старый 27.03.2013, 08:58
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Мне кажется код существенно упростится, если 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.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter