Advertisement
Guest User

Untitled

a guest
Mar 25th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 7.81 KB | None | 0 0
  1. unit lr3;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     MainMenu1: TMainMenu;
  12.     N1: TMenuItem;
  13.     N2: TMenuItem;
  14.     N3: TMenuItem;
  15.     N4: TMenuItem;
  16.     GroupBox1: TGroupBox;
  17.     GroupBox2: TGroupBox;
  18.     mm_In: TMemo;
  19.     mm_Out: TMemo;
  20.     N5: TMenuItem;
  21.     procedure N2Click(Sender: TObject);
  22.     procedure N3Click(Sender: TObject);
  23.     procedure N4Click(Sender: TObject);
  24.     procedure N5Click(Sender: TObject);
  25.   private
  26.     { Private declarations }
  27.   public
  28.     { Public declarations }
  29.   end;
  30.  
  31. var
  32.   Form1: TForm1;
  33.   FIn, FOut : TextFile;
  34.  
  35. implementation
  36.  
  37. {$R *.dfm}
  38.  
  39. procedure TForm1.N2Click(Sender: TObject);
  40.  
  41. const
  42.   WordMax = 30; //Константа, обозначающая максимально допустимый размер массива (по усл.)
  43. type
  44.   StringList = array[1..WordMax] of String; //Создание нового типа, обозначающего массив строк
  45. var
  46.   HandlingText, OutString : String;
  47.   DiffWords : StringList;
  48.   I, Count : Integer;
  49.  
  50. procedure SplitText(Text : String; var Mass : StringList; var N : Integer);
  51. var
  52.   DiffWords : StringList;
  53.   TempText, Word : String;
  54.   Position, Length: Integer;
  55. begin
  56.   TempText := Text; //TempText - переменная, из которой в последствии будет вырезаться по одному слову, стоящему спереди
  57.   Position := Pos(' ', TempText); //Поиск первого пробела, т. е. конца первого слова
  58.   N := 1; //N - счётчик массива разделённых слов
  59.   Length := TempText.Length;
  60.   while Length > 0 do //Цикл будет повторяться до тех пор, пока символы TempText не закончатся
  61.   begin
  62.     if Position = 0 then //Если ни одного пробела не найдено, принимаем весь оставшийся TempText за слово
  63.     begin
  64.       Word := TempText; //Присваиваем соответствующей переменной значением TempText
  65.       TempText := '';   //Очищаем TempText, чтобы остановить цикл
  66.     end
  67.     else //Если пробел в TempText был найден
  68.     begin
  69.       Word := Copy(TempText, 1, Position - 1); //Копируем из TempText фрагмент от начала до 1-го пробела
  70.       TempText := Copy(TempText, Position + 1); //Убираем этот же фрагмент за ненадобностью
  71.     end;
  72.     if Word.Length > 10 then //По условию - максимальная длина слова - 10 символов, проверяем
  73.       ShowMessage('Максимальная длина слова -- 10. Слово"' + Word + '" будет проигнорировано.')
  74.     else //Если в цикле десять или меньше слов
  75.     begin
  76.       Mass[N] := Word; //Добавляем новое слово (Word) в массив разделённых слов
  77.       N := N + 1; //Инкреметируем счётчик элементов этого массива
  78.     end;
  79.     Length := TempText.Length; //Получаем длину оставшегося TempText для следующей итерации цикла while
  80.     Position := Pos(' ', TempText); //Получаем позицию следующего пробела, т.е. конца следующего слова
  81.     if N > 30 then //По условию - максимальное количество слов - 30, проверяем
  82.     begin
  83.       Length := 0; //Если слов больше тридцати, останавливаем цикл while
  84.       ShowMessage('Максимальное количество слов -- 30. Слова, следующие за 30-м будут проигнорированы.');
  85.     end;
  86.   end;
  87.   N := N - 1; //Кол-во значений массива разделённых слов можно получить из счётчика N
  88. end;
  89.  
  90. procedure HandleText(Text : String; var DiffWords : StringList; var J : Integer);
  91. var
  92.   Words : StringList;
  93.   LastWord : String;
  94.   Count, I, K : Integer;
  95. begin
  96.   Text := Text.Replace('  ', ' '); //Избавляемся от повторяющихся подряд пробелов
  97.   SplitText(Text, Words, Count); //Получаем массив разделённых слов
  98.  
  99.   LastWord := Words[Count].Replace('.', ''); //Получаем последнее слово для сравнений, убрав из него точку
  100.  
  101.   J := 1; //J - счётчик массива обработанных слов
  102.   for I := 1 to Count - 1 do //Цикл, проходящий по всем словам массива
  103.     if Words[I] <> LastWord then //Проверка слова на идентичность с последним
  104.     begin
  105.       K := 1; //K - счётчик массива символов слова Words[I]
  106.       while K <= Words[I].Length do //Цикл, проходящий по всем символам Word[I]
  107.         if Words[I][K] in ['0'..'9'] then //Проверка символа на приндлежность к множеству цифр
  108.           Delete(Words[I], K, 1) //Удаление символа, если это подтверждается (K не должен инкрементироваться)
  109.         else
  110.           K := K + 1; //Пропуск символа, инкрементирование K
  111.       if Length(Words[I]) > 0 then
  112.       begin
  113.         DiffWords[J] := Words[I]; //Если в слове после обработке остались символы, помещаем его в массив
  114.         J := J + 1; //Инкреметируем счётчик этого массива
  115.       end;
  116.     end;
  117.   J := J - 1; //Кол-во значений массива обработанных слов можно получить из счётчика J
  118. end;
  119.  
  120. begin
  121.   Reset(FIn); //Открываем входной файл для чтения
  122.   Read(FIn, HandlingText); //Получаем входной файл в переменную
  123.   CloseFile(FIn); //Закрываем файл FIn
  124.   mm_In.Text := HandlingText; //Вставляем входную строку
  125.   HandleText(HandlingText, DiffWords, Count); //Обработка строки с помощью подпрограммы HandleText
  126.   OutString := ''; //Инициализация выходной строки
  127.   for I := 1 to Count do //Цикл, проходящий по словам из массива обработанных слов
  128.     OutString := Concat(OutString, DiffWords[I], ' '); //Конкатенация текущего значения массива в OutString
  129.   mm_Out.Text := OutString; //Вывод выходной строки
  130.   Rewrite(FOut); //Открываем выходной файл для записи
  131.   Write(FOut, OutString); //Записываем текст в выходной файл
  132.   CloseFile(FOut); //Закрываем выходной файл
  133. end;
  134.  
  135. procedure TForm1.N3Click(Sender: TObject);
  136. begin
  137.   //Удаляется текст из двух полей
  138.   mm_In.Text := '';
  139.   mm_Out.Text := '';
  140. end;
  141.  
  142. procedure TForm1.N4Click(Sender: TObject);
  143. begin
  144.   Close; //Выход из программы
  145. end;
  146.  
  147. procedure TForm1.N5Click(Sender: TObject);
  148. begin
  149.   mm_In.Lines.SaveToFile('InFile.txt'); //Сохранием входной текст в файл
  150. end;
  151.  
  152. Initialization
  153. AssignFile(FIn, 'InFile.txt'); //Инициализируем входной файл
  154. AssignFile(FOut, 'OutFile.txt'); //Инициализируем выходной файл
  155. Finalization
  156.  
  157. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement