Advertisement
Guest User

Matrix

a guest
Oct 21st, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 5.78 KB | None | 0 0
  1.  простопросотprogram Laba_2_3;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   SysUtils,
  7.   Windows;
  8.  
  9. const
  10.    Max = 2147483647;
  11.    Min = Low(Integer);
  12.    Accuracy = 3;
  13.    NotValidMatrix = 1;
  14.  
  15. type
  16.    IntegerMatrix = array of array of Integer;
  17.  
  18. procedure ReadFName(var MyFile: TextFile);
  19. var
  20.    FName: String;
  21.    IsValidInput: Boolean;
  22. begin
  23.    IsValidInput := False;
  24.    repeat
  25.       Writeln('Введите название файла для ввода данных в фомате Name.txt:');
  26.       Readln(FName);
  27.       if FileExists(FName) then
  28.       begin
  29.          AssignFile(MyFile, FName);
  30.          Reset(MyFile);
  31.          if Eof(MyFile) then
  32.             Writeln('Файл пустой.')
  33.          else
  34.             IsValidInput := True;
  35.       end
  36.       else
  37.          Writeln('Ошибка ввода. Данного файла не существует.');
  38.    until IsValidInput;
  39. end;
  40.  
  41. procedure ReadOutputName(var Output: TextFile);
  42. var
  43.    FName: String;
  44.    IsValidInput: Boolean;
  45. begin
  46.    IsValidInput := False;
  47.    repeat
  48.       Writeln('Введите названия файла для вывода данных в формате Name.txt:');
  49.       Readln(FName);
  50.       if Copy(Fname, length(FName) - 3, 4) = '.txt' then
  51.       begin
  52.          AssignFile(Output, FName);
  53.          try
  54.             Rewrite(Output);
  55.             IsValidInput := True;
  56.          except
  57.             Writeln('Не удалось создать файл с таким названием.')
  58.          end;
  59.       end
  60.       else
  61.          Writeln('Название файла введено в неверном формате.');
  62.    until IsValidInput;
  63. end;
  64.  
  65. function IsValidMatrix(var MyFile: TextFile; var LenMat: Integer): Boolean;
  66. var
  67.    i, j, k: Integer;
  68.    Temp: String;
  69.    IsSquareMatrix: Boolean;
  70. begin
  71.    i := 0;
  72.    IsSquareMatrix := True;
  73.    While not Eof(MyFile) do
  74.    begin
  75.       Readln(MyFile, Temp);
  76.       Inc(i);
  77.    end;
  78.    if i = NotValidMatrix then
  79.    begin
  80.       IsValidMatrix := False;
  81.       Writeln('Количество строк и столбцов матрице не может равняться 1.');
  82.       CloseFile(MyFile);
  83.    end
  84.    else
  85.    begin
  86.       Reset(MyFile);
  87.       While (not Eof(MyFile)) and (IsSquareMatrix) do
  88.       begin
  89.          Readln(MyFile, Temp);
  90.          j := 0;
  91.          Temp := Temp + ' ';
  92.          for k := 2 to length(Temp) do
  93.             if (Temp[k] = ' ') and (Temp[k - 1] <> ' ') then
  94.                   Inc(j);
  95.          if i <> j then
  96.             IsSquareMatrix := False;
  97.       end;
  98.       if IsSquareMatrix then
  99.       begin
  100.          IsValidMatrix := True;
  101.          LenMat := i;
  102.       end
  103.       else
  104.       begin
  105.          IsValidMatrix := False;
  106.          Writeln('Матрица не является квадратной. Количество строк и столбцов должно совпадать.');
  107.          CloseFile(MyFile);
  108.       end;
  109.    end;
  110. end;
  111.  
  112. function ReadMatrix(var MyFile: TextFile; var IntMatrix: IntegerMatrix; LenMat: Integer): Boolean;
  113. var
  114.    i, j, Border: Integer;
  115.    Error: String;
  116.    IsValidMatrix: Boolean;
  117. begin
  118.    Reset(MyFile);
  119.    Border := Max div LenMat;
  120.    LenMat := LenMat - 1;
  121.    IsValidMatrix := True;
  122.    Error := ' ';
  123.    for i := 0 to LenMat do
  124.    begin
  125.       for j := 0 to LenMat do
  126.       begin
  127.          try
  128.             Read(MyFile, IntMatrix[i, j]);
  129.             if IntMatrix[i, j] > Border then
  130.             begin
  131.                Error := Error + '[' + IntToStr(i + 1) + ', ' + IntToStr(j + 1) + '] ';
  132.                IsValidMatrix := False;
  133.             end;
  134.          except
  135.             Error := Error + '[' + IntToStr(i + 1) + ', ' + IntToStr(j + 1) + '] ';
  136.             IsValidMatrix := False;
  137.          end;
  138.       end;
  139.       Readln(MyFile);
  140.    end;
  141.    if not IsValidMatrix then
  142.    begin
  143.       Write('Ошибка ввода. Элементы матрицы должны принадлежать промежутку от ', Min, ' до ', Border, '. Номера элементов массива, не соответствующих условию:');
  144.       Writeln(Error);
  145.    end;
  146.    CloseFile(MyFile);
  147.    ReadMatrix := IsValidMatrix;
  148. end;
  149.  
  150. procedure Main();
  151.  
  152. var
  153.    MyFile, Output: TextFile;
  154.    i, j, Len, Counter: Integer;
  155.    Sum: Real;
  156.    Matrix: IntegerMatrix;
  157.    IsValidInput: Boolean;
  158.  
  159. begin
  160.    SetConsoleCp(1251);
  161.    SetConsoleOutputCp(1251);
  162.    Len := 0;
  163.    IsValidInput := False;
  164.    Writeln('Данная программа вычисляет среднее арифметическое значение положительных элементов каждого столбца квадратной матрицы.');
  165.    repeat
  166.       repeat
  167.          ReadFName(MyFile);
  168.          IsValidInput:= IsValidMatrix(MyFile, Len);
  169.       until IsValidInput;
  170.    SetLength(Matrix, Len, Len);
  171.    IsValidInput := ReadMatrix(MyFile, Matrix, Len);
  172.    until IsValidInput;
  173.    Dec(Len);
  174.    ReadOutputName(Output);
  175.    Writeln('Среднее арифметическое элементов:');
  176.    for j := 0 to Len do
  177.    begin
  178.       Sum := 0;
  179.       Counter := 0;
  180.       for i := 0 to Len do
  181.          if Matrix[i, j] > 0 then
  182.          begin
  183.             Sum := Sum + Matrix[i, j];
  184.             Inc(Counter);
  185.          end;
  186.       Write(j + 1, ' столбец: ');
  187.       if Counter = 0 then
  188.       begin
  189.          Writeln('в данном столбце отсутствуют положительные элементы.');
  190.          Write(Output, -1, ' ')
  191.       end
  192.       else
  193.       begin
  194.          Sum := Sum / Counter;
  195.          Writeln(Sum:Length(IntToStr(Trunc(Sum))) + Accuracy + 1: Accuracy);
  196.          Write(Output, Sum:Length(IntToStr(Trunc(Sum))) + Accuracy + 1: Accuracy, ' ');
  197.       end;
  198.    end;
  199.    CloseFile(Output);
  200. end;
  201.  
  202. begin
  203.    Main;
  204.    Readln;
  205. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement