Advertisement
gguuppyy

лаба3н1(основа)

Nov 16th, 2023 (edited)
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 9.65 KB | Source Code | 0 0
  1. Program laba1;
  2.  
  3. Uses
  4.     Windows, System.SysUtils;
  5. Var
  6.     IsCorrect : Boolean;
  7.  
  8. Procedure PrintCondition();
  9. Begin
  10.     Writeln('Эта программа выводит самое короткое слово в предложении и его позицию.', #13, #10);
  11. End;
  12.  
  13. Function CheckPath() : String;
  14. Var
  15.     Path : String;
  16.     IsCorrect : Boolean;
  17. Begin
  18.     Writeln('Введите путь к файлу:');
  19.     Repeat
  20.         IsCorrect := True;
  21.         Readln(Path);
  22.         If Not FileExists(Path) Then
  23.         Begin
  24.             IsCorrect := False;
  25.             Writeln('Такого файла не существует. Повторите ввод:');
  26.         End
  27.         Else If Not(ExtractFileExt(Path) = '.txt') Then
  28.         Begin
  29.             IsCorrect := False;
  30.             Writeln('Неправильное расширение файла. Повторите ввод:');
  31.         End;
  32.     Until IsCorrect;
  33.     CheckPath := Path;
  34. End;
  35.  
  36. Function PathForRead() : String;
  37. Var
  38.     MyFile : TextFile;
  39.     Path : String;
  40.     IsCorrect : Boolean;
  41. Begin
  42.     Repeat
  43.         IsCorrect := True;
  44.         Path := CheckPath();
  45.         Try
  46.             AssignFile(MyFile, Path);
  47.             Reset(MyFile);
  48.         Except
  49.             IsCorrect := False;
  50.             Writeln('Нет доступа к файлу. Измените настройки и повторите ввод.');
  51.         End;
  52.     CloseFile(MyFile);
  53.     Until IsCorrect;
  54.     PathForRead := Path;
  55. End;
  56.  
  57. Function CheckPermission(Path : String) : Boolean;
  58. Var
  59.     MyFile : TextFile;
  60.     IsCorrect : Boolean;
  61. Begin
  62.     IsCorrect := True;
  63.     AssignFile(MyFile, Path);
  64.     Try
  65.         Rewrite(MyFile);
  66.     Except
  67.         Writeln('Файл закрыт для записи.');
  68.         IsCorrect := False;
  69.         Readln;
  70.     End;
  71.     CloseFile(MyFile);
  72.     CheckPermission := IsCorrect;
  73. End;
  74.  
  75. Function PathForWrite() : String;
  76. Var
  77.     Path : String;
  78.     MyFile : TextFile;
  79.     IsCorrect : Boolean;
  80. Begin
  81.     Repeat
  82.         IsCorrect := True;
  83.         Path := CheckPath();
  84.         If Not (CheckPermission(Path)) Then
  85.             IsCorrect := False
  86.     Until IsCorrect;
  87.     PathForWrite := Path;
  88. End;
  89.  
  90. Function Input(Var IsCorrect : Boolean) : String;
  91. Var
  92.     Sentence : String;
  93. Begin
  94.     Readln(Sentence);
  95.     If Sentence = '' Then
  96.     Begin
  97.         IsCorrect := False;
  98.         Writeln('Ошибка. Вы ничего не ввели.');
  99.     End;
  100.     Input := Sentence;
  101. End;
  102.  
  103. Function ReadSentenceConsole() : String;
  104. Var
  105.     Text : String;
  106. Begin
  107.     Repeat
  108.         IsCorrect := True;
  109.         Writeln('Введите предложение:');
  110.         Text := Input(IsCorrect);
  111.     Until IsCorrect;
  112.     ReadSentenceConsole := Text;
  113. End;
  114.  
  115. Function IsSpaceCharacter(Ch: Char): Boolean;
  116. Begin
  117.   IsSpaceCharacter := (Ch = ' ') Or (Ch = #9);
  118. End;
  119.  
  120. Function ExtractWords(Const Sentence: String): TArray<string>;
  121. Var
  122.   Words: TArray<string>;
  123.   CurrentWord: string;
  124.   CurrentWordStartIndex: Integer;
  125.   I: Integer;
  126. Begin
  127.   SetLength(Words, 0);
  128.   CurrentWord := '';
  129.   CurrentWordStartIndex := 1;
  130.  
  131.   I := 1;
  132.   While I <= Length(Sentence) Do
  133.   Begin
  134.     While (I <= Length(Sentence)) And IsSpaceCharacter(Sentence[I]) Do
  135.       Inc(I);
  136.  
  137.     CurrentWordStartIndex := I;
  138.  
  139.     While (I <= Length(Sentence)) And Not IsSpaceCharacter(Sentence[I]) Do
  140.       Inc(I);
  141.  
  142.     CurrentWord := Copy(Sentence, CurrentWordStartIndex, I - CurrentWordStartIndex);
  143.  
  144.     If CurrentWord <> '' Then
  145.     Begin
  146.       SetLength(Words, Length(Words) + 1);
  147.       Words[Length(Words) - 1] := CurrentWord;
  148.     End;
  149.   End;
  150.  
  151.   ExtractWords := Words;
  152. End;
  153.  
  154. Function FindShortestWord(Const Words: TArray<String>): String;
  155. var
  156.   ShortestWord: String;
  157.   I: Integer;
  158. Begin
  159.   ShortestWord := '';
  160.  
  161.   For I := 0 To Length(Words) - 1 Do
  162.   Begin
  163.     If (ShortestWord = '') Or (Length(Words[I]) < Length(ShortestWord)) Then
  164.       ShortestWord := Words[I];
  165.   End;
  166.  
  167.   FindShortestWord := ShortestWord;
  168. End;
  169.  
  170. Function GetWordStartPosition(Const Sentence: String; Const Word: String): Integer;
  171. Var
  172.   I, J: Integer;
  173.   WordLength: Integer;
  174.   Found: Boolean;
  175. begin
  176.   WordLength := Length(Word);
  177.   I := 1;
  178.   Found := False;
  179.  
  180.   While (Not Found) And (I <= Length(Sentence) - WordLength + 1) Do
  181.   Begin
  182.     J := 1;
  183.     While (J <= WordLength) And (Sentence[I + J - 1] = Word[J]) Do
  184.       Inc(J);
  185.  
  186.     If J > WordLength then
  187.       Found := True
  188.     Else
  189.       Inc(I);
  190.   End;
  191.  
  192.   If Found Then
  193.     GetWordStartPosition := I
  194.   Else
  195.     GetWordStartPosition := -1;
  196. End;
  197.  
  198. Function NumberToString(Number: Integer): String;
  199. Var
  200.   CurrentDigit: Integer;
  201. Begin
  202.   NumberToString := '';
  203.   Repeat
  204.     CurrentDigit := Number Mod 10;
  205.     Number := Number Div 10;
  206.     NumberToString := Chr(Ord('0') + CurrentDigit) + Result;
  207.   Until Number = 0;
  208. End;
  209.  
  210. Function FormatShortestWordPosition(Const ShortestWord: String; ShortestWordStartIndex: Integer): String;
  211. Begin
  212.   If ShortestWordStartIndex <> -1 Then
  213.     FormatShortestWordPosition := 'Самое короткое слово: ' + ShortestWord +
  214.       ', начинается с позиции: ' + NumberToString(ShortestWordStartIndex)
  215.   Else
  216.     FormatShortestWordPosition := 'В предложении нет слов.';
  217. End;
  218.  
  219. Procedure PrintShortestWordPosition(Const ShortestWord: String; ShortestWordStartIndex: Integer);
  220. Var
  221.   ResultMessage: String;
  222. Begin
  223.   ResultMessage := FormatShortestWordPosition(ShortestWord, ShortestWordStartIndex);
  224.   Writeln(ResultMessage);
  225. End;
  226.  
  227.  
  228. Function ReadSentenceFromFile(Var MyFile : TextFile; Var IsCorrect : Boolean) : String;
  229. Var
  230.     Sentence : String;
  231. Begin
  232.     Readln(MyFile, Sentence);
  233.     If Sentence = '' Then
  234.     Begin
  235.         IsCorrect := False;
  236.         Writeln('Ошибка. Недостаточно данных в файле.');
  237.     End;
  238.     ReadSentenceFromFile := Sentence;
  239. End;
  240.  
  241. Function ReadFile() : String;
  242. Var
  243.     Path : String;
  244.     MyFile : TextFile;
  245.     Sentence : String;
  246.     IsCorrect : Boolean;
  247.     Words: TArray<string>;
  248.     ShortestWord: string;
  249.     ShortestWordStartIndex: Integer;
  250. Begin
  251.     Repeat
  252.         IsCorrect := True;
  253.         Path := PathForRead();
  254.         AssignFile(MyFile, Path);
  255.         ReSet(MyFile);
  256.         Sentence := ReadSentenceFromFile(MyFile, IsCorrect);
  257.         If IsCorrect Then
  258.         Begin
  259.             IsCorrect := False;
  260.             Writeln('Ошибка. Недостаточно данных в файле.');
  261.         End;
  262.         CloseFile(MyFile);
  263.     Until IsCorrect;
  264.     Words := ExtractWords(Sentence);
  265.     ShortestWord := FindShortestWord(Words);
  266.     ShortestWordStartIndex := GetWordStartPosition(Sentence, ShortestWord);
  267.     ReadFile := Sentence;
  268. End;
  269.  
  270. Function ChooseAction() : String;
  271. Var
  272.     Input: String;
  273.     IsCorrect : Boolean;
  274. Begin
  275.     Repeat
  276.         IsCorrect := True;
  277.         Readln(Input);
  278.         Input := LowerCase(Input);
  279.         If (Input <> 'console') And (Input <> 'file') Then
  280.         Begin
  281.             Writeln('Ошибка. Введите "console" или "file".');
  282.             IsCorrect := False;
  283.         End;
  284.     Until IsCorrect;
  285.     ChooseAction := Input;
  286. End;
  287.  
  288. Function ChooseInput() : String;
  289. Var
  290.     Option : String;
  291.     MyFile : TextFile;
  292.     Sentence : String;
  293.     Words: TArray<string>;
  294.     ShortestWord: string;
  295.     ShortestWordStartIndex: Integer;
  296. Begin
  297.     Writeln('Выберите способ ввода данных.', #13#10,
  298.             'Введите "console", если хотите ввести данные через консоль', #13#10,
  299.             'Введите "file", если хотите передать данные из файла');
  300.     Option := ChooseAction();
  301.     If Option = 'console' Then
  302.     Begin
  303.         Sentence := ReadSentenceConsole();
  304.         Words := ExtractWords(Sentence);
  305.         ShortestWord := FindShortestWord(Words);
  306.         ShortestWordStartIndex := GetWordStartPosition(Sentence, ShortestWord);
  307.     End
  308.     Else
  309.         Sentence := ReadFile();
  310.     ChooseInput := Sentence;
  311. End;
  312.  
  313. Procedure WriteConsole(Const ShortestWord: string; ShortestWordStartIndex: Integer);
  314. Var
  315.     ResultMessage: String;
  316. Begin
  317.     ResultMessage := FormatShortestWordPosition(ShortestWord, ShortestWordStartIndex);
  318.     Writeln(ResultMessage);
  319. End;
  320.  
  321. Procedure WriteFile(Const ShortestWord: string; ShortestWordStartIndex: Integer);
  322. Var
  323.     MyFile : TextFile;
  324.     Path : String;
  325.     ResultMessage : String;
  326. Begin
  327.     Path := PathForWrite();
  328.     AssignFile(MyFile, Path);
  329.     Rewrite(MyFile);
  330.     ResultMessage := FormatShortestWordPosition(ShortestWord, ShortestWordStartIndex);
  331.     Writeln(MyFile, ResultMessage);
  332.     CloseFile(MyFile);
  333.     Writeln('Результат в файле.');
  334. End;
  335.  
  336. Procedure ChooseOutput(ShortestWord : String; ShortestWordStartIndex : Integer);
  337. Var
  338.     Option : String;
  339. Begin
  340.     Writeln('Выберите способ вывода результата.', #13#10,
  341.             'Введите "console", если хотите вывести результат через консоль', #13#10,
  342.             'Введите "file", если хотите передать результат в файл');
  343.     Option := ChooseAction;
  344.     If Option = 'console' Then
  345.      WriteConsole(ShortestWord, ShortestWordStartIndex)
  346.     Else
  347.         WriteFile(ShortestWord, ShortestWordStartIndex);
  348. End;
  349.  
  350. Var
  351.     Sentence : String;
  352.     ShortestWord : String;
  353.     ResultMessage : String;
  354.     ShortestWordStartIndex : Integer;
  355. Begin
  356.     SetConsoleCP(1251);
  357.     SetConsoleOutputCP(1251);
  358.     PrintCondition();
  359.     Sentence := ChooseInput();
  360.     ChooseOutput(ShortestWord, ShortestWordStartIndex);
  361.     Readln
  362. End.
  363.  
  364.  
  365.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement