Shlop
@Shlop
Начинающий программист

Как считать матрицы из файла?

Здравствуйте, подскажите пожалуйста вот есть у меня текстовый файл, в нём есть допустим вот две матрицы, над матрицей находиться её размерность, 4 и 3. Задача у меня стоит такая что в текстовом файле находятся квадратные матрицы, целочисленные, порядка n, и нужно преобразовать файл, удалив из каждой матрицы элементы побочной диагонали. И я вот не совсем понимаю. Считываем вот первую строку "4" теперь 4 раза по 4 элемента читаем. А как считать следующую матрицу?
const N = 4;
var
  f1: text;
  j,i,k,l,endline : integer;
  
begin
assign(f1,'D:\in.txt');
reset(f1);
  while not Eoln(f1) do begin
    Readln(f1,endline);
    //Считываем 4 раза по 4 элемента
    inc(j);
  end;
  close(f1);
end.

Ведь на следующей итерации будет 1, подскажите пожалуйста заранее благодарю за ответ.
4
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
3
1 2 3
1 2 3
1 2 3
  • Вопрос задан
  • 44 просмотра
Решения вопроса 1
  • AnnTHony
    @AnnTHony
    Интроверт
    program ChangeMatrix;
    
    const
      FileIn = 'C:\Users\admin\Documents\in.txt';
      FileOut = 'C:\Users\admin\Documents\out.txt';
    
    var
      fin, fout: Text;
      n: integer;
      matrix: array of array of string;
      row, col: integer;
      src: string;
      target: array of string;
      counter: integer;
    
    function Split(sep: string; source: string): array of string;
    var
      i: integer;
      position: integer;
    begin
      result := Nil;
      SetLength(result, n);
      
      for i := 0 to n - 1 do
      begin
        position := Pos(sep, source);
        if position > 0 then
        begin
          result[i] := Copy(source, 1, position - 1);
          Delete(source, 1, position + Length(sep) - 1);
        end
        else
          result[i] := source;
      end;
    end;
    
    function Join(sep: string; source: array of string): string;
    var
      i: integer;
    begin
      result := source[0];
      
      for i := 1 to n - 1 do
        result := Concat(result, sep, source[i]);
    end;
    
    begin
      Assign(fin, FileIn);
      Reset(fin);
      
      Assign(fout, FileOut);
      Rewrite(fout);
      
      While not EoF(fin) do
      begin
        // Читаем размер матрицы
        Readln(fin, n);
        // Обнуляем матрицу
        matrix := Nil;
        // Задаем размеры матрицы
        SetLength(matrix, n);
        for row := 0 to n - 1 do
          SetLength(matrix[row], n);
        // Читаем значения и заполняем матрицу
        for row := 0 to n - 1 do
        begin
          Readln(fin, src);
          target := Split(' ', src);
          for col := 0 to n - 1 do
            matrix[row][col] := target[col];
          begin
          end;
        end;
        // Удаляем элементы побочной диагонали
        counter := 0;
        row := n - 1;
        col := 0;
        while counter < n do
        begin
          matrix[row][col] := '*';
          Dec(row);
          Inc(col);
          Inc(counter);
        end;
        // Записываем результат в файл
        Writeln(fout, n);
        for row := 0 to n - 1 do
        begin
          Writeln(fout, Join(' ', matrix[row]));
        end;
        
      end;
      
      Close(fout);
      Close(fin);
    end.


    С перезаписью исходного файла:

    program ChangeMatrix;
    
    const
      DataFile = 'C:\Users\Jonathan\Documents\in.txt';
    
    var
      fdata: Text;
      n: integer;
      matrix: array of array of string;
      change: array of string;
      cursor: integer;
      row, col: integer;
      src: string;
      target: array of string;
      counter: integer;
    
    function Split(sep: string; source: string): array of string;
    var
      i: integer;
      position: integer;
    begin
      result := Nil;
      SetLength(result, n);
      
      for i := 0 to n - 1 do
      begin
        position := Pos(sep, source);
        if position > 0 then
        begin
          result[i] := Copy(source, 1, position - 1);
          Delete(source, 1, position + Length(sep) - 1);
        end
        else
          result[i] := source;
      end;
    end;
    
    function Join(sep: string; source: array of string): string;
    var
      i: integer;
    begin
      result := source[0];
      
      for i := 1 to n - 1 do
        result := Concat(result, sep, source[i]);
    end;
    
    begin
      cursor := 0;
      Assign(fdata, DataFile);
      Reset(fdata);
      
      While not EoF(fdata) do
      begin
        // Читаем размер матрицы
        Readln(fdata, n);
        // Обнуляем матрицу
        matrix := Nil;
        // Задаем размеры матрицы
        SetLength(matrix, n);
        SetLength(change, Length(change) + n + 1);
        change[cursor] := IntToStr(n);
        Inc(cursor);
        for row := 0 to n - 1 do
          SetLength(matrix[row], n);
        // Читаем значения и заполняем матрицу
        for row := 0 to n - 1 do
        begin
          Readln(fdata, src);
          target := Split(' ', src);
          for col := 0 to n - 1 do
            matrix[row][col] := target[col];
          begin
          end;
        end;
        // Удаляем элементы побочной диагонали
        counter := 0;
        row := n - 1;
        col := 0;
        while counter < n do
        begin
          matrix[row][col] := '*';
          change[cursor + row] := Join(' ', matrix[row]);
          Dec(row);
          Inc(col);
          Inc(counter);
        end;
        Inc(cursor, n);
      end;
      
      Close(fdata);
      
      Assign(fdata, DataFile);
      Rewrite(fdata);
        // Записываем результат в файл
        for row := 0 to cursor - 1 do
        begin
          Writeln(fdata, change[row]);
        end;
      Close(fdata);
    end.
    Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы