redmanexe

Lab2ExtraDelphi

Nov 17th, 2024
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 8.82 KB | None | 0 0
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. {$R *.res}
  6.  
  7. uses
  8.   SysUtils;
  9.  
  10. Type
  11.     TMatrix = Array of Array of Integer;
  12.     TArray = Array of Integer;
  13.  
  14. Const
  15.     PRINT_TYPE_MIN = 0;
  16.     PRINT_TYPE_MAX = 2;
  17.  
  18.     SCAN_TYPE_MIN = 0;
  19.     SCAN_TYPE_MAX = 1;
  20.  
  21.     MATRIX_LENGTH_MIN = 1;
  22.     MATRIX_LENGTH_MAX = 100;
  23.     MATRIX_VALUES_MIN = 0;
  24.     MATRIX_VALUES_MAX = 10;
  25.  
  26.     ERR_READ_INT_VALUE = -100000000;
  27.  
  28. Function IsTextFile(FilePath: String): Boolean;
  29. Var
  30.     IsTxt: Boolean;
  31.     Len: Integer;
  32. Begin
  33.     Len := Length(FilePath);
  34.     IsTxt := ((Len > 2) And
  35.         (FilePath[Len - 3] = '.') And
  36.         (FilePath[Len - 2] = 't') And
  37.         (FilePath[Len - 1] = 'x') And
  38.         (FilePath[Len] = 't'));
  39.  
  40.     IsTextFile := IsTxt;
  41. End;
  42. Function CheckFileAvailability(FilePath: String; Read: Boolean): Boolean;
  43. Var
  44.     IsAvailable: Boolean;
  45.     Checkable: TextFile;
  46. Begin
  47.     IsAvailable := True;
  48.     AssignFile(Checkable, FilePath);
  49.     Try
  50.         If (Read) Then
  51.             Reset(Checkable)
  52.         Else
  53.         Begin
  54.             If (FileExists(FilePath)) Then
  55.                 Append(Checkable)
  56.             Else
  57.                 Rewrite(Checkable);
  58.         End;
  59.         Close(Checkable);
  60.     Except
  61.         IsAvailable := False;
  62.     End;
  63.  
  64.     If (IsAvailable And Not IsTextFile(FilePath)) Then
  65.         IsAvailable := False;
  66.  
  67.     CheckFileAvailability := IsAvailable;
  68. End;
  69. Function TakeIntValueFromConsole(Description: String): Integer;
  70. Var
  71.     Value: Integer;
  72.     IsCorrect: Boolean;
  73. Begin
  74.     IsCorrect := False;
  75.     Value := 0;
  76.     Repeat
  77.         Write(Description);
  78.         Try
  79.             Readln(Value);
  80.             IsCorrect := True;
  81.         Except
  82.             Writeln('Enter number, not string or anything else!');
  83.         End;
  84.     Until IsCorrect;
  85.  
  86.     TakeIntValueFromConsole := Value;
  87. End;
  88. Function TakeIntValueInRangeFromConsole(Description: String; Min: Integer; Max: Integer): Integer;
  89. Var
  90.     Value: Integer;
  91.     IsCorrect: Boolean;
  92. Begin
  93.     Repeat
  94.         Value := TakeIntValueFromConsole(Description);
  95.         IsCorrect := True;
  96.         If ((Value < Min) Or (Value > Max)) Then
  97.         Begin
  98.             Writeln('Value must be in range from ', Min, ' to ', Max, '!');
  99.             IsCorrect := False;
  100.         End;
  101.     Until IsCorrect;
  102.  
  103.     TakeIntValueInRangeFromConsole := Value;
  104. End;
  105. Function TakeIntValueFromFile(Var FileToRead: TextFile): Integer;
  106. Var
  107.     Value: Integer;
  108. Begin
  109.     Try
  110.         Read(FileToRead, Value);
  111.     Except
  112.         Value := ERR_READ_INT_VALUE;
  113.     End;
  114.  
  115.     TakeIntValueFromFile := Value;
  116. End;
  117. Procedure TakeCorrectFile(Var FileToAssign: TextFile; Input: Boolean);
  118. Var
  119.     FilePath: String;
  120.     IsCorrect: Boolean;
  121. Begin
  122.     Repeat
  123.         If (Input) Then
  124.             Write('Enter path to input file: ')
  125.         Else
  126.             Write('Enter path to output file: ');
  127.  
  128.         ReadLn(FilePath);
  129.         IsCorrect := True;
  130.  
  131.         If (Not CheckFileAvailability(FilePath, Input)) Then
  132.         Begin
  133.             IsCorrect := False;
  134.             WriteLn('This path contains wrong file or file, which cannot be accessed! Enter another path!');
  135.         End;
  136.     Until IsCorrect;
  137.  
  138.     AssignFile(FileToAssign, FilePath);
  139.     If (Input) Then
  140.         Reset(FileToAssign)
  141.     Else
  142.         Rewrite(FileToAssign);
  143. End;
  144.  
  145. Function Calculate(Const Matrix: TMatrix; Var Goods: TArray): Integer;
  146. Var
  147.     I, J, NowGoods: Integer;
  148.     IsGood: Boolean;
  149. Begin
  150.     NowGoods := 0;
  151.     For I := 0 To High(Matrix) Do Begin
  152.         J := 0;
  153.         IsGood := True;
  154.  
  155.         While ((J < High(Matrix[I])) And IsGood) Do
  156.         Begin
  157.             If (Matrix[I][J] < 6) Or (Matrix[I][J] > 8) Then
  158.                 IsGood := False;
  159.             J := J + 1;
  160.         End;
  161.  
  162.         If (IsGood) Then
  163.         Begin
  164.             Goods[NowGoods] := I;
  165.             NowGoods := NowGoods + 1;
  166.         End;
  167.     End;
  168.  
  169.     Calculate := NowGoods;
  170. End;
  171.  
  172. Function ReadMatrixFromFile(): TMatrix;
  173. Var
  174.     Matrix: TMatrix;
  175.     FileToRead: TextFile;
  176.     IsCorrect: Boolean;
  177.     I, J, N, M: Integer;
  178. Begin
  179.     Repeat
  180.         TakeCorrectFile(FileToRead, True);
  181.         M := TakeIntValueFromFile(FileToRead);
  182.         N := TakeIntValueFromFile(FileToRead);
  183.         IsCorrect := True;
  184.         If (N > (MATRIX_LENGTH_MIN - 1)) And (N < (MATRIX_LENGTH_MAX + 1)) And
  185.             (M > (MATRIX_LENGTH_MIN - 1)) And (M < (MATRIX_LENGTH_MAX + 1)) Then
  186.         Begin
  187.             SetLength(Matrix, M);
  188.             For I := 0 To High(Matrix) Do Begin
  189.                 SetLength(Matrix[I], N);
  190.                 For J := 0 To High(Matrix[I]) Do
  191.                 Begin
  192.                     Matrix[I][J] := TakeIntValueFromFile(FileToRead);
  193.                     If (Matrix[I][J] < MATRIX_VALUES_MIN) Or (Matrix[I][J] > MATRIX_VALUES_MAX) Then
  194.                         IsCorrect := False;
  195.                 End;
  196.             End;
  197.         End
  198.         Else
  199.         Begin
  200.             IsCorrect := False;
  201.             If (N < MATRIX_LENGTH_MIN) Then
  202.                 WriteLn('Matrix cannot be smaller, than ', MATRIX_LENGTH_MIN, 'x', MATRIX_LENGTH_MIN, '!');
  203.  
  204.             If (N > MATRIX_LENGTH_MAX) Then
  205.                 WriteLn('Matrix cannot be bigger, than ', MATRIX_LENGTH_MAX, 'x', MATRIX_LENGTH_MAX, '!');
  206.         End;
  207.  
  208.         If (N > (MATRIX_LENGTH_MIN - 1)) And (N < (MATRIX_LENGTH_MAX + 1)) And
  209.             (M > (MATRIX_LENGTH_MIN - 1)) And (M < (MATRIX_LENGTH_MAX + 1)) And Not IsCorrect Then
  210.             WriteLn('File contains wrong values!');
  211.     Until IsCorrect;
  212.  
  213.     ReadMatrixFromFile := Matrix;
  214. End;
  215. Function ReadMatrixFromConsole(): TMatrix;
  216. Var
  217.     M, N, I, J: Integer;
  218.     Matrix: TMatrix;
  219. Begin
  220.     M := TakeIntValueInRangeFromConsole('Enter kids count (value must be in range from ' + IntToStr(MATRIX_LENGTH_MIN) + ' to ' + IntToStr(MATRIX_LENGTH_MAX) + '): ', MATRIX_LENGTH_MIN, MATRIX_LENGTH_MAX);
  221.     N := TakeIntValueInRangeFromConsole('Enter marks count (value must be in range from ' + IntToStr(MATRIX_LENGTH_MIN) + ' to ' + IntToStr(MATRIX_LENGTH_MAX) + '): ', MATRIX_LENGTH_MIN, MATRIX_LENGTH_MAX);
  222.     SetLength(Matrix, M);
  223.     For I := 0 To High(Matrix) Do Begin
  224.         SetLength(Matrix[I], N);
  225.         For J := 0 To High(Matrix[I]) Do
  226.             Matrix[I][J] := TakeIntValueInRangeFromConsole('Mark #' + IntToStr(I + 1) + ' for kid #' + IntToStr(J + 1) + ' (value must be in range from ' + IntToStr(MATRIX_VALUES_MIN) + ' to ' + IntToStr(MATRIX_VALUES_MAX) + '): ', MATRIX_VALUES_MIN, MATRIX_VALUES_MAX);
  227.     End;
  228.  
  229.     ReadMatrixFromConsole := Matrix;
  230. End;
  231. Function ReadMatrix(): TMatrix;
  232. Var
  233.     ReadType: Integer;
  234.     Matrix: TMatrix;
  235. Begin
  236.     WriteLn;
  237.     WriteLn('How to read values for calculations?');
  238.     WriteLn('0 - From keyboard (console)');
  239.     WriteLn('1 - From file');
  240.     ReadType := TakeIntValueInRangeFromConsole('Enter read type: ', SCAN_TYPE_MIN, SCAN_TYPE_MAX);
  241.     If (ReadType = 1) Then
  242.         Matrix := ReadMatrixFromFile()
  243.     Else
  244.         Matrix := ReadMatrixFromConsole();
  245.  
  246.     ReadMatrix := Matrix;
  247. End;
  248.  
  249. Function SaveResultIntoFile(Const Goods: TArray; GoodsCount: Integer): Boolean;
  250. Var
  251.     Saved: Boolean;
  252.     FileToSave: TextFile;
  253.     I: Integer;
  254. Begin
  255.     Saved := True;
  256.     TakeCorrectFile(FileToSave, False);
  257.  
  258.     For I := 0 To (GoodsCount - 1) Do
  259.     Begin
  260.         Write(FileToSave, Goods[I] + 1);
  261.         Write(FileToSave, ' ');
  262.     End;
  263.     Close(FileToSave);
  264.  
  265.     SaveResultIntoFile := Saved;
  266. End;
  267. Procedure PrintResultIntoConsole(Const Goods: TArray; GoodsCount: Integer);
  268. Var
  269.     I: Integer;
  270. Begin
  271.     WriteLn;
  272.     WriteLn('Indexes of goodies: ');
  273.     For I := 0 To (GoodsCount - 1) Do
  274.     Begin
  275.         Write(Goods[I] + 1);
  276.         Write(' ');
  277.     End;
  278.     WriteLn;
  279. End;
  280. Procedure PrintResult(Const Goods: TArray; GoodsCount: Integer);
  281. Var
  282.     WriteType: Integer;
  283.     Saved: Boolean;
  284.  
  285. Begin
  286.     Saved := False;
  287.     WriteLn;
  288.     WriteLn('Where post result?');
  289.     WriteLn('0 - Only into console');
  290.     WriteLn('1 - Only into file');
  291.     WriteLn('2 - Into console and into file');
  292.     WriteType := TakeIntValueInRangeFromConsole('Enter write type: ', PRINT_TYPE_MIN, PRINT_TYPE_MAX);
  293.     Case WriteType Of
  294.         0: Begin
  295.             PrintResultIntoConsole(Goods, GoodsCount);
  296.         End;
  297.         1: Begin
  298.             Saved := SaveResultIntoFile(Goods, GoodsCount);
  299.         End;
  300.         2: Begin
  301.             Saved := SaveResultIntoFile(Goods, GoodsCount);
  302.             PrintResultIntoConsole(Goods, GoodsCount);
  303.         End;
  304.     End;
  305.  
  306.     If (Saved) Then
  307.         WriteLn('Result saved into file!');
  308. End;
  309.  
  310. Var
  311.     Matrix: TMatrix;
  312.     Goods: TArray;
  313.     GoodsCount: Integer;
  314.  
  315. Begin
  316.     Matrix := ReadMatrix();
  317.     SetLength(Goods, Length(Matrix));
  318.     GoodsCount := Calculate(Matrix, Goods);
  319.     PrintResult(Goods, GoodsCount);
  320.     WriteLn('Press [ENTER] to close program...');
  321.     ReadLn;
  322. End.
Advertisement
Add Comment
Please, Sign In to add comment