Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit lr3;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus;
- type
- TForm1 = class(TForm)
- MainMenu1: TMainMenu;
- N1: TMenuItem;
- N2: TMenuItem;
- N3: TMenuItem;
- N4: TMenuItem;
- GroupBox1: TGroupBox;
- GroupBox2: TGroupBox;
- mm_In: TMemo;
- mm_Out: TMemo;
- N5: TMenuItem;
- procedure N2Click(Sender: TObject);
- procedure N3Click(Sender: TObject);
- procedure N4Click(Sender: TObject);
- procedure N5Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- FIn, FOut : TextFile;
- implementation
- {$R *.dfm}
- procedure TForm1.N2Click(Sender: TObject);
- const
- WordMax = 30; //Константа, обозначающая максимально допустимый размер массива (по усл.)
- type
- StringList = array[1..WordMax] of String; //Создание нового типа, обозначающего массив строк
- var
- HandlingText, OutString : String;
- DiffWords : StringList;
- I, Count : Integer;
- procedure SplitText(Text : String; var Mass : StringList; var N : Integer);
- var
- DiffWords : StringList;
- TempText, Word : String;
- Position, Length: Integer;
- begin
- TempText := Text; //TempText - переменная, из которой в последствии будет вырезаться по одному слову, стоящему спереди
- Position := Pos(' ', TempText); //Поиск первого пробела, т. е. конца первого слова
- N := 1; //N - счётчик массива разделённых слов
- Length := TempText.Length;
- while Length > 0 do //Цикл будет повторяться до тех пор, пока символы TempText не закончатся
- begin
- if Position = 0 then //Если ни одного пробела не найдено, принимаем весь оставшийся TempText за слово
- begin
- Word := TempText; //Присваиваем соответствующей переменной значением TempText
- TempText := ''; //Очищаем TempText, чтобы остановить цикл
- end
- else //Если пробел в TempText был найден
- begin
- Word := Copy(TempText, 1, Position - 1); //Копируем из TempText фрагмент от начала до 1-го пробела
- TempText := Copy(TempText, Position + 1); //Убираем этот же фрагмент за ненадобностью
- end;
- if Word.Length > 10 then //По условию - максимальная длина слова - 10 символов, проверяем
- ShowMessage('Максимальная длина слова -- 10. Слово"' + Word + '" будет проигнорировано.')
- else //Если в цикле десять или меньше слов
- begin
- Mass[N] := Word; //Добавляем новое слово (Word) в массив разделённых слов
- N := N + 1; //Инкреметируем счётчик элементов этого массива
- end;
- Length := TempText.Length; //Получаем длину оставшегося TempText для следующей итерации цикла while
- Position := Pos(' ', TempText); //Получаем позицию следующего пробела, т.е. конца следующего слова
- if N > 30 then //По условию - максимальное количество слов - 30, проверяем
- begin
- Length := 0; //Если слов больше тридцати, останавливаем цикл while
- ShowMessage('Максимальное количество слов -- 30. Слова, следующие за 30-м будут проигнорированы.');
- end;
- end;
- N := N - 1; //Кол-во значений массива разделённых слов можно получить из счётчика N
- end;
- procedure HandleText(Text : String; var DiffWords : StringList; var J : Integer);
- var
- Words : StringList;
- LastWord : String;
- Count, I, K : Integer;
- begin
- Text := Text.Replace(' ', ' '); //Избавляемся от повторяющихся подряд пробелов
- SplitText(Text, Words, Count); //Получаем массив разделённых слов
- LastWord := Words[Count].Replace('.', ''); //Получаем последнее слово для сравнений, убрав из него точку
- J := 1; //J - счётчик массива обработанных слов
- for I := 1 to Count - 1 do //Цикл, проходящий по всем словам массива
- if Words[I] <> LastWord then //Проверка слова на идентичность с последним
- begin
- K := 1; //K - счётчик массива символов слова Words[I]
- while K <= Words[I].Length do //Цикл, проходящий по всем символам Word[I]
- if Words[I][K] in ['0'..'9'] then //Проверка символа на приндлежность к множеству цифр
- Delete(Words[I], K, 1) //Удаление символа, если это подтверждается (K не должен инкрементироваться)
- else
- K := K + 1; //Пропуск символа, инкрементирование K
- if Length(Words[I]) > 0 then
- begin
- DiffWords[J] := Words[I]; //Если в слове после обработке остались символы, помещаем его в массив
- J := J + 1; //Инкреметируем счётчик этого массива
- end;
- end;
- J := J - 1; //Кол-во значений массива обработанных слов можно получить из счётчика J
- end;
- begin
- Reset(FIn); //Открываем входной файл для чтения
- Read(FIn, HandlingText); //Получаем входной файл в переменную
- CloseFile(FIn); //Закрываем файл FIn
- mm_In.Text := HandlingText; //Вставляем входную строку
- HandleText(HandlingText, DiffWords, Count); //Обработка строки с помощью подпрограммы HandleText
- OutString := ''; //Инициализация выходной строки
- for I := 1 to Count do //Цикл, проходящий по словам из массива обработанных слов
- OutString := Concat(OutString, DiffWords[I], ' '); //Конкатенация текущего значения массива в OutString
- mm_Out.Text := OutString; //Вывод выходной строки
- Rewrite(FOut); //Открываем выходной файл для записи
- Write(FOut, OutString); //Записываем текст в выходной файл
- CloseFile(FOut); //Закрываем выходной файл
- end;
- procedure TForm1.N3Click(Sender: TObject);
- begin
- //Удаляется текст из двух полей
- mm_In.Text := '';
- mm_Out.Text := '';
- end;
- procedure TForm1.N4Click(Sender: TObject);
- begin
- Close; //Выход из программы
- end;
- procedure TForm1.N5Click(Sender: TObject);
- begin
- mm_In.Lines.SaveToFile('InFile.txt'); //Сохранием входной текст в файл
- end;
- Initialization
- AssignFile(FIn, 'InFile.txt'); //Инициализируем входной файл
- AssignFile(FOut, 'OutFile.txt'); //Инициализируем выходной файл
- Finalization
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement