Slava_Krasava

Lab2_3

Nov 20th, 2024
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 11.20 KB | None | 0 0
  1. Program Lab2_3;
  2.  
  3. Uses
  4.     System.SysUtils;
  5.  
  6. Type
  7.     TBool = Array Of Array Of Boolean;
  8.     TMass = Array Of Array Of Double;
  9.     TErrorCode = (CORRECT,
  10.         INCORRECT_CHOICE,
  11.         NON_NUMERIC,
  12.         OUT_OF_RANGE,
  13.         FILE_NOT_TXT,
  14.         FILE_NOT_EXIST,
  15.         FILE_NOT_READABLE,
  16.         FILE_NOT_WRITABLE,
  17.         FILE_IS_EMPTY,
  18.         READING_GO_WRONG,
  19.         FILE_NOT_FULL);
  20.  
  21. Const
  22.     MIN_ARR = 2;
  23.     MAX_ARR = 20;
  24.     MAX_OPTION = 2;
  25.     MIN_COUNT = -999.999;
  26.     MAX_COUNT = 999.999;
  27.     Err: Array [TErrorCode] Of String = ('',
  28.         'Error. Incorrect choice. Please try again. ',
  29.         'Error. Non-numeric value. Please try again. ',
  30.         'Error. Out of Range. Please try again. ',
  31.         'Error. File not .txt. Please try again',
  32.         'Error. File not Exist. Please try again.',
  33.         'Error. File not readable. Please try again.',
  34.         'Error. File not writable. Please try again.',
  35.         'Error. File is empty. Please try again.',
  36.         'Error. Reading go wrong. Please try again.',
  37.         'Error. The file lacks sufficient information . Please try again. ');
  38.  
  39. Procedure ProgramTask();
  40. Begin
  41.     Writeln('This program find �saddle point� of the given matrix');
  42. End;
  43.  
  44. Function GetExtention(Var Str: String; PosStart, PosEnd: Integer): String;
  45. Var
  46.     I: Integer;
  47.     PartStr: String;
  48. Begin
  49.     PartStr := '';
  50.     For I := PosStart To PosEnd Do
  51.         PartStr := PartStr + Str[I];
  52.     GetExtention := PartStr;
  53. End;
  54.  
  55. Function IsFileTxt(PathToFile: String): TErrorCode;
  56. Var
  57.     Error: TErrorCode;
  58. Begin
  59.     Error := CORRECT;
  60.     If (Length(PathToFile) < 5) Or (GetExtention(PathToFile, Length(PathToFile) - 3, Length(PathToFile)) <> '.txt') Then
  61.         Error := FILE_NOT_TXT;
  62.     IsFileTxt := Error;
  63. End;
  64.  
  65. Function IsFileExist(PathToFile: String): TErrorCode;
  66. Var
  67.     Error: TErrorCode;
  68. Begin
  69.     Error := CORRECT;
  70.     If Not FileExists(PathToFile) Then
  71.         Error := FILE_NOT_EXIST;
  72.     IsFileExist := Error;
  73. End;
  74.  
  75. Function IsFileReadble(Var FileName: TextFile): TErrorCode;
  76. Var
  77.     Error: TErrorCode;
  78. Begin
  79.     Error := CORRECT;
  80.     Try
  81.         Reset(FileName);
  82.     Except
  83.         Error := FILE_NOT_EXIST
  84.     End;
  85.     IsFileReadble := Error;
  86. End;
  87.  
  88. Function IsFileWritable(Var FileName: TextFile): TErrorCode;
  89. Var
  90.     Error: TErrorCode;
  91. Begin
  92.     Error := CORRECT;
  93.     Try
  94.         Append(FileName);
  95.     Except
  96.         Error := FILE_NOT_WRITABLE;
  97.     End;
  98.     IsFileWritable := Error;
  99. End;
  100.  
  101. Procedure GetFileNormalReading(Var FileName: TextFile);
  102. Var
  103.     Error: TErrorCode;
  104.     PathToFile: String;
  105. Begin
  106.     Repeat
  107.         Readln(PathToFile);
  108.         Error := IsFileTxt(PathToFile);
  109.         If Error = CORRECT Then
  110.         Begin
  111.             Error := IsFileExist(PathToFile);
  112.             AssignFile(FileName, PathToFile);
  113.         End;
  114.         If Error = CORRECT Then
  115.             Error := IsFileReadble(FileName);
  116.         If (Error = CORRECT) And (EOF(FileName)) Then
  117.             Error := FILE_IS_EMPTY;
  118.         If Error <> CORRECT Then
  119.             Writeln(ERR[Error]);
  120.     Until Error = CORRECT;
  121. End;
  122.  
  123. Procedure GetFileNormalWriting(Var FileName: TextFile);
  124. Var
  125.     Error: TErrorCode;
  126.     PathToFile: String;
  127. Begin
  128.     Repeat
  129.         Readln(PathToFile);
  130.         Error := IsFileTxt(PathToFile);
  131.         If Error = CORRECT Then
  132.         Begin
  133.             Error := IsFileExist(PathToFile);
  134.             AssignFile(FileName, PathToFile);
  135.         End;
  136.         If Error = CORRECT Then
  137.             Error := IsFileWritable(FileName);
  138.         If Error <> CORRECT Then
  139.             Writeln(ERR[Error]);
  140.     Until Error = CORRECT;
  141. End;
  142.  
  143. Function MatrixSetingFile(Var FileName: TextFile; Var Matrix: TMass): TErrorCode;
  144. Var
  145.     Error: TErrorCode;
  146.     Rows, Cols: Integer;
  147. Begin
  148.     Rows := 0;
  149.     Cols := 0;
  150.     Writeln('Reading setings of matrix...');
  151.     Error := CORRECT;
  152.     Try
  153.         Read(FileName, Rows);
  154.         Read(FileName, Cols);
  155.     Except
  156.         Error := READING_GO_WRONG;
  157.     End;
  158.     If EOF(FileName) Then
  159.         Error := FILE_NOT_FULL;
  160.     If (Error = CORRECT) And ((Rows < MIN_ARR) Or (Rows > MAX_ARR) Or (Cols < MIN_ARR) Or (Cols > MAX_ARR)) Then
  161.         Error := OUT_OF_RANGE;
  162.     If Error = CORRECT Then
  163.         SetLength(Matrix, Rows, Cols);
  164.  
  165.     MatrixSetingFile := Error;
  166. End;
  167.  
  168. Procedure MatrixSettingConsole(Var Matrix: TMass; Var Rows, Cols: Integer);
  169. Var
  170.     Error: TErrorCode;
  171. Begin
  172.     Repeat
  173.         Error := CORRECT;
  174.         Writeln('Please write size of matrix through the space in the range ', MIN_ARR, ' .. ', MAX_ARR);
  175.         Try
  176.             Readln(Rows, Cols);
  177.         Except
  178.             Error := NON_NUMERIC;
  179.         End;
  180.         If (Error = CORRECT) And ((Rows < MIN_ARR) Or (Rows > MAX_ARR) Or (Cols < MIN_ARR) Or (Cols > MAX_ARR)) Then
  181.             Error := OUT_OF_RANGE;
  182.         If Error <> CORRECT Then
  183.             Write(ERR[Error]);
  184.     Until Error = CORRECT;
  185.     SetLength(Matrix, Rows, Cols);
  186. End;
  187.  
  188. Procedure ReadMatrixFromFile(Var Matrix: TMass);
  189.  
  190. Var
  191.     FileName: TextFile;
  192.     Error: TErrorCode;
  193.     I, J: Integer;
  194. Begin
  195.     Repeat
  196.         WriteLn('Enter the path to the file with extension ".txt" with matrix length and High from ', MIN_ARR, ' .. ', MAX_ARR);
  197.         GetFileNormalReading(FileName);
  198.         Error := MatrixSetingFile(FileName, Matrix);
  199.         If Error = CORRECT Then
  200.             For I := 0 To High(Matrix) Do
  201.                 For J := 0 To High(Matrix[I]) Do
  202.                     If Not EOF(FileName) Then
  203.                     Begin
  204.                         Try
  205.                             Read(FileName, Matrix[I][J]);
  206.                         Except
  207.                             Error := READING_GO_WRONG;
  208.                         End;
  209.                     End
  210.                     Else
  211.                         Error := FILE_NOT_FULL;
  212.  
  213.         If Error <> CORRECT Then
  214.             WriteLn(ERR[Error]);
  215.             CloseFile(FileName);
  216.     Until Error = CORRECT;
  217. End;
  218.  
  219. Procedure ReadColsFromConsole(Var Matrix: TMass; Const I: Integer);
  220. Var
  221.     Error: TErrorCode;
  222.     J: Integer;
  223.     Num: Double;
  224. Begin
  225.     WriteLn('Please enter the col ', I, ' through the space in the range ', MIN_COUNT:7:2, ' .. ', MAX_COUNT:7:2);
  226.     Num := 0;
  227.  
  228.     For J := 0 To High(Matrix[I]) Do
  229.         Repeat
  230.             Error := CORRECT;
  231.             Try
  232.                 Read(Num);
  233.             Except
  234.                 Error := NON_NUMERIC;
  235.             End;
  236.             If (Error = CORRECT) And ((Num < MIN_COUNT) Or (Num > MAX_COUNT)) Then
  237.                 Error := OUT_OF_RANGE;
  238.             If Error = CORRECT Then
  239.                 Matrix[I][J] := Num
  240.             Else
  241.                 WriteLn(ERR[Error]);
  242.         Until Error = CORRECT;
  243. End;
  244.  
  245. Procedure ReadMatrixFromConsole(Var Matrix: TMass);
  246. Var
  247.     I, Rows, Cols: Integer;
  248. Begin
  249.     Rows := 0;
  250.     Cols := 0;
  251.     MatrixSettingConsole(Matrix, Rows, Cols);
  252.     Writeln('Matrix size [', Rows, ',', Cols, ']');
  253.     For I := 0 To High(Matrix) Do
  254.         ReadColsFromConsole(Matrix, I);
  255. End;
  256.  
  257. Function OptionRead(): Integer;
  258. Var
  259.     Error: TErrorCode;
  260.     Option: Integer;
  261. Begin
  262.     Option := 0;
  263.     Repeat
  264.         Error := CORRECT;
  265.         Try
  266.             Readln(Option);
  267.         Except
  268.             Error := NON_NUMERIC;
  269.         End;
  270.         If (Error = CORRECT) And ((Option < 1) Or (Option > MAX_OPTION)) Then
  271.             Error := INCORRECT_CHOICE;
  272.         If Error <> CORRECT Then
  273.             Write(ERR[Error]);
  274.     Until Error = CORRECT;
  275.     OptionRead := Option;
  276. End;
  277.  
  278. Procedure OptionHowToRead(Var Matrix: TMass);
  279. Var
  280.     Option: Integer;
  281. Begin
  282.     Writeln('If you want to read from console enter: 1');
  283.     Writeln('If you want to read from File enter:    2');
  284.     Option := OptionRead();
  285.     If Option = 2 Then
  286.         ReadMatrixFromFile(Matrix)
  287.     Else
  288.         ReadMatrixFromConsole(Matrix);
  289. End;
  290.  
  291. Function FindMinRowCoord(Const Matrix: TMass): Tbool;
  292. Var
  293.     I, J, Count, Col: Integer;
  294.     Min: Double;
  295.     Rmins: TBool;
  296. Begin
  297.     SetLength(Rmins, Length(Matrix), Length(Matrix[0]));
  298.     For I := 0 To High(Matrix) Do
  299.     Begin
  300.         Col := 0;
  301.         Min := Matrix[I][0];
  302.         Count := 0;
  303.         For J := 0 To High(Matrix[I]) Do
  304.             If Matrix[I][J] < Min Then
  305.             Begin
  306.                 Min := Matrix[I][J];
  307.                 Count := 1;
  308.                 Col := J;
  309.             End
  310.             Else
  311.                 If Matrix[I][J] = Min Then
  312.                 Begin
  313.                     Inc(Count);
  314.                 End;
  315.         Rmins[I][Col] := Count = 1;
  316.     End;
  317.     FindMinRowCoord := Rmins;
  318. End;
  319.  
  320. Function FindMaxColCoord(Const Matrix: TMass): TBool;
  321. Var
  322.     I, J, Count, Row: Integer;
  323.     Max: Double;
  324.     Cmaxs: TBool;
  325. Begin
  326.     SetLength(Cmaxs, Length(Matrix), Length(Matrix[0]));
  327.     For J := 0 To High(Matrix[0]) Do
  328.     Begin
  329.         Row := 0;
  330.         Max := Matrix[0][J];
  331.         Count := 0;
  332.         For I := 0 To High(Matrix) Do
  333.             If Matrix[I][J] > Max Then
  334.             Begin
  335.                 Max := Matrix[I][J];
  336.                 Count := 1;
  337.                 Row := I;
  338.             End
  339.             Else
  340.                 If Matrix[I][J] = Max Then
  341.                     Inc(Count);
  342.         Cmaxs[Row][J] := Count = 1
  343.     End;
  344.     FindMaxColCoord := Cmaxs;
  345. End;
  346.  
  347. Function FindSaddlePoint(Var Matrix: TMass; Var Row, Col: Integer): Double;
  348. Var
  349.     I, J: Integer;
  350.     Saddle: Double;
  351.     Rmins, Cmaxs: TBool;
  352.  
  353. Begin
  354.     Rmins := FindMinRowCoord(Matrix);
  355.     Cmaxs := FindMaxColCoord(Matrix);
  356.     Saddle := 0;
  357.     For I := 0 To High(Matrix) Do
  358.         For J := 0 To High(Matrix[I]) Do
  359.             If Rmins[I][J] And Cmaxs[I][J] Then
  360.             Begin
  361.                 Saddle := Matrix[I][J];
  362.                 Row := I;
  363.                 Col := J;
  364.             End;
  365.     FindSaddlePoint := Saddle;
  366. End;
  367.  
  368. Procedure PrintConsole(Const Row, Col: Integer; Const Answer: Double);
  369. Begin
  370.     If (Row <> -1) And (Col <> -1) Then
  371.         WriteLn('Saddle point found at (', Row, ',', Col, ') with value: ', Answer:7:5)
  372.     Else
  373.         WriteLn('No saddle point found');
  374. End;
  375.  
  376. Procedure PrintFile(Const Row, Col: Integer; Const Answer: Double);
  377. Var
  378.  
  379.     FileName: TextFile;
  380. Begin
  381.     WriteLn('Enter the path to the file with extension ".txt" to get answer: ');
  382.     GetFileNormalWriting(FileName);
  383.     Writeln(FileName);
  384.     If (Row <> -1) And (Col <> -1) Then
  385.         Write(FileName, 'Saddle point found at (', Row, ',', Col, ') with value: ', Answer:7:5)
  386.     Else
  387.         Write(FileName, 'No saddle point found');
  388.     CloseFile(FileName);
  389. End;
  390.  
  391. Procedure PrintAnswer(Const Row, Col: Integer; Const Answer: Double);
  392. Var
  393.     Option: Integer;
  394. Begin
  395.     Writeln('If you want to print answer in console enter: 1');
  396.     Writeln('If you want to print answer in File enter:    2');
  397.     Option := OptionRead();
  398.     If Option = 2 Then
  399.         PrintFile(Row, Col, Answer)
  400.     Else
  401.         PrintConsole(Row, Col, Answer);
  402. End;
  403.  
  404. Var
  405.     Row, Col: Integer;
  406.     Matrix: TMass;
  407.     Answer: Double;
  408.  
  409. Begin
  410.     Row := -1;
  411.     Col := -1;
  412.     ProgramTask();
  413.     OptionHowToRead(Matrix);
  414.     Answer := FindSaddlePoint(Matrix, Row, Col);
  415.     PrintAnswer(Row, Col, Answer);
  416.     Writeln('Press Enter to exit');
  417.     Readln;
  418.  
  419. End.
Advertisement
Add Comment
Please, Sign In to add comment