Считать матрицу из файла - Free Pascal
Формулировка задачи:
Модифицировать программу из предыдущего задания так, чтобы сначала читались из файла число строк массива, затем число столбцов и, наконец, все элементы массива построчно. Размеры, прочитанные из файла не должны превышать размеры массива, указанные при его создании, в противном случае выдается сообщение об ошибке.
Предыдущее: Написать программу, которая создает двумерный статический массив и заполняет его из
типизированного файла, читая последовательно элементы первой строки, потом второй и т.д.
Если элементов в файле не хватает, то выдается сообщение об ошибке. Файл создать с
помощью программы из предыдущего задания.
Собсна, само задание. Вот код, который я написал, но который довольно таки не верно работает Помогите пожалуйста кто чем сможет.
program typfile;
uses crt;
const y=2; c=10;
type Telem=single;
tfile=file of Telem;
Tmas=array[1..y,1..c] of Telem;
var i,N,G,k,J,mm,nn:longint; f:tfile; W:Telem; Table:Tmas;
begin
clrscr;
writeln('N-?');
readln(N);
k:=0;
Randomize;
assign(f,'fignya123.txt');
rewrite(f);
writeln('nn,mm-?');
readln(nn,mm);
for i:=1 to N+2 do
begin
if(i=0)then write(f,y);
if(i=0)then write(f,c);
W:=Random(10);
write(f,W);
end;
Close(f);
reset(f);
{$I-}
while (i<>2) do
begin
if(i=0) then
begin
read(f,w);
mm:=round(w);
end;
if(i=1) then
begin
read(f,w);
nn:=round(w);
end;
inc(i);
for i:= 1 to y do
for j:= 1 to c do
begin
read(f,w);
Table[i,j]:= w;
end;
if (ioresult <> 0) and (k=0) then
begin writeln('Ошибка! Не хватает элементов в исходном файле.');k:=1;end;
end;
{$I+}
Close(F);
for j:= 1 to y do
begin
for G:=1 to c do
write (Table[j,G]:6:2);
writeln;
end;
readln;
end.Решение задачи: «Считать матрицу из файла»
textual
Листинг программы
label Done;
const
maxm=100; maxn=100; LLIM=-50; RLIM=101; W=3;
var
a: array [1..maxm,1..maxn] of Integer;
m, n, i, j, t: Integer;
f: file of Integer;
begin
Randomize;
Assign(f,'input.dat');
{$IFDEF FCreate}
Rewrite(f);
m:=10; n:=10; Write(f,m,n);
for i:=1 to m do for j:=1 to n do begin
t:=LLIM+Random(RLIM); Write(f,t);
end;
{$ENDIF}
{$I-}
Reset(f);
if IOResult<>0 then begin
WriteLn('*** Ошибка открытия файла.');
Halt;
end;
Read(f,m,n);
if IOResult<>0 then begin
WriteLn('*** Ошибка чтения размера массива.');
goto Done;
end;
if (m>0) and (m<=maxm) and (n>0) and (n<=maxn) then begin
for i:=1 to m do for j:=1 to n do Read(f,a[i,j]);
if IOResult<>0 then begin
WriteLn('*** Ошибка чтения массива: недостаточно данных.');
goto Done;
end;
if not EOF(f) then begin
WriteLn('*** Ошибка чтения массива: избыток данных.');
goto Done;
end;
end else begin
WriteLn('*** Ошибка: размер массива [',m,',',n,'] вне допустимого диапазона ',
'[1..',maxm,',1..',maxn,']');
goto Done;
end;
WriteLn('А[1..',m,',1..',n,']=');
for i:=1 to m do begin for j:=1 to n do Write(' ',a[i,j]:W); WriteLn; end;
Done:
Close(f);
end.
Объяснение кода листинга программы
- Создается файл с именем
input.dat, если он не существует, то создается новый файл. - Записывается размер матрицы 10x10 в файл.
- Заполняется матрица случайными числами от -50 до 100.
- Записывается размер матрицы и сама матрица считываются из файла.
- Проверяется корректность считанного размера матрицы.
- Проверяется корректность считанных данных матрицы.
- Выводится размер матрицы и сама матрица.
- Закрывается файл.