Shlop
@Shlop
Full Stack Developer (PHP/Laravel/JavaScript)

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

Здравствуйте, подскажите пожалуйста вот есть у меня текстовый файл, в нём есть допустим вот две матрицы, над матрицей находиться её размерность, 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
  • Вопрос задан
  • 737 просмотров
Решения вопроса 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
@Leydenfrost
begin
 assign(input,' {имя файла}');
  reset(input);
assign(output,'{имя файла}');
  rewrite(output);

 readln(n);
 for i:=1 to n do
   for j:=1 to n do
    read(a[i, j]);

readln(n2);
for i:=1 to n2 do
  for j:=1 to n2 do
   read(a2[i,j]);

{и решение}
end.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы