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
  • Вопрос задан
  • 62 просмотра
Решения вопроса 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.
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
Blogman Оренбург
от 15 000 до 45 000 руб.
Blogman Оренбург
от 15 000 до 50 000 руб.
22 июля 2018, в 20:41
10000 руб./за проект
22 июля 2018, в 20:13
2000 руб./за проект