Считать и вывести матрицу из файла - Pascal ABC
Формулировка задачи:
Помогите! Проблема в том что программа считывает мтрицу. В файле находится матрица ввида
2 3 4 6
6 7 8 2
5 2 9 4
6 9 0 2
но программа выводит ее
2 3 4 6 6 7 8 2 5 2
9 4 6 9 0 2 0 0 0 0
0 0 0 0 0 0 0 0 0 0
. . . . . . . . . . . . .
0 0 0 0 0 0 0 0 0 0
Листинг программы
- uses crt;
- const t=0.000001;{îãðГ*Г*ГЁГ·ГЁГўГ*ГҐГ¬ Г·ГЁГ±Г«Г*, áëèçêèå ГЄ Г*îëþ, Г*Г* Г*ГЁГµ äåëèòü}
- n=10;
- type Tmatr=array[1..10,1..10]of real;
- //Procedure Chtenie(a:Tmatr;n:integer);
- // var
- // f:text; c:char;
- {ÏðîöåäóðГ* Г§Г*ïîëГ*ГҐГ*ГЁГї (ГЁГ*ГЁГ¶ГЁГ*ëèçГ*Г¶ГЁГЁ) Г¬Г*Г±Г±ГЁГўГ* ГЁГ§ ГґГ*éëГ*}
- //Var i ,j: Integer; {i,j - ГЅГІГ® ïåðåìåГ*Г*Г*Гї äëÿ Г°Г*áîòû Г± ýëåìåГ*ГІГ*ìè Г¬Г*Г±Г±ГЁГўГ*}
- //Begin
- //End;
- procedure Per(n,k:integer;a:Tmatr;var p:integer);{ïåðåñòГ*Г*îâêГ* ñòðîê Г± Г¬Г*ГЄГ±. ГЈГ«Г*ГўГ*ûì ýëåìåГ*òîì}
- var z:real;
- j,i:integer;
- begin
- z:=abs(a[k,k]);
- i:=k;
- p:=0;
- for j:=k+1 to n do
- begin
- if abs(a[j,k])>z then
- begin
- z:=abs(a[j,k]);
- i:=j;
- p:=p+1;
- end;
- end;
- if i>k then
- for j:=k to n do
- begin
- z:=a[i,j];
- a[i,j]:=a[k,j];
- a[k,j]:=z;
- end;
- end;
- function znak(p:integer):integer;{èçìåГ*ГҐГ*ГЁГҐ Г§Г*Г*ГЄГ* ïðè ïåðåñòГ*Г*îâêå ñòðîê Г¬Г*òðèöû}
- begin
- if p mod 2=0 then
- znak:=1 else znak:=-1;
- end;
- function znak1(i,m:integer):integer;{èçìåГ*ГҐГ*ГЁГҐ Г§Г*Г*ГЄГ* ïðè ïåðåñòГ*Г*îâêå ñòðîê ïðè Г*Г*õîæäåГ*ГЁГЁ äîïîëГ*ГҐГ*ГЁГ©}
- begin
- if (i+m) mod 2=0 then
- znak1:=1 else znak1:=-1;
- end;
- procedure opr(n,p:integer;a:Tmatr;var det:real;var f:byte);{Г*Г*õîæäåГ*ГЁГҐ îïðåäåëèòåëÿ Г¬Г*òðèöû}
- var k,i,j:integer;
- r:real;
- begin
- det:=1.0;f:=0;
- for k:=1 to n do
- begin
- if a[k,k]=0 then per(k,n,a,p);
- det:=znak(p)*det*a[k,k];
- if abs(det)<t then
- begin
- f:=1;
- writeln('ГЋГЎГ°Г*ГІГ*îé Г¬Г*òðèöû Г*ГҐГІ!');
- readln;
- exit;
- end;
- for j:=k+1 to n do
- begin
- r:=a[j,k]/a[k,k];
- for i:=k to n do
- a[j,i]:=a[j,i]-r*a[k,i];
- end;
- end;
- end;
- procedure opr1(n,p:integer;d:Tmatr;var det1:real);{Г*Г*õîæäåГ*ГЁГҐ îïðåäåëåГ*ГЁГ© äëÿ äîïîëГ*ГҐГ*ГЁГ©}
- var k,i,j:integer;
- r:real;
- begin
- det1:=1.0;
- for k:=2 to n do
- begin
- if d[k,k]=0 then per(n,k,d,p);
- det1:=znak(p)*det1*d[k,k];
- for j:=k+1 to n do
- begin
- r:=d[j,k]/d[k,k];
- for i:=k to n do
- d[j,i]:=d[j,i]-r*d[k,i];
- end;
- end;
- end;
- Procedure Peresch(n,p:integer;var b:Tmatr;det1:real;var e:Tmatr);{âû÷èñëåГ*ГЁГҐ äîïîëГ*ГҐГ*ГЁГ©}
- var i,m,k,j:integer;
- z:real;
- d,c:Tmatr;
- begin
- for i:=1 to n do
- for m:=1 to n do
- begin
- for j:= 1 to n do {ïåðåñòГ*Г*îâêГ* ñòðîê}
- begin
- z:=b[i,j];
- for k:=i downto 2 do
- d[k,j]:=b[k-1,j];
- for k:=i+1 to n do
- d[k,j]:=b[k,j];
- d[1,j]:=z;
- end;
- for k:=1 to n do {ïåðåñòГ*Г*îâêГ* ñòîëáöîâ}
- begin
- z:=d[k,m];
- for j:=m downto 2 do
- c[k,j]:=d[k,j-1];
- for j:=m+1 to n do
- c[k,j]:=d[k,j];
- c[k,1]:=z;
- end;
- Opr1(n,p,c,det1);{âû÷èñëåГ*ГЁГҐ îïðåäåëèòåëåé}
- e[i,m]:=det1*znak1(i,m);{âû÷èñëåГ*ГЁГҐ äîïîëГ*ГҐГ*ГЁГ©}
- end;
- end;
- procedure Transp(a:Tmatr; n:integer;var at:Tmatr);{ГІГ°Г*Г*Г±ГЇГ®Г*èðîâГ*Г*ГЁГҐ Г¬Г*òðèöû}
- var k,j:integer;
- begin
- for k:= 1 to n do
- for j:=1 to n do
- at[k,j]:=a[j,k];
- end;
- Procedure Proverka(a,b:Tmatr; n:integer;var c:Tmatr);{ïðîâåðêГ* - ГіГ¬Г*îæåГ*ГЁГҐ ïðÿìîé Г¬Г*òðèöû Г*Г* îáðГ*ГІГ*ГіГѕ}
- var k,j,i:integer;
- z:real;
- begin
- for k:=1 to n do
- for j:=1 to n do
- begin
- c[k,j]:=0;
- for i:=1 to n do
- begin
- z:=a[i,j]*b[k,i];
- c[k,j]:=c[k,j]+z;
- end;
- end;
- end;
- procedure Vyvod(var a:Tmatr; n:integer);{âûâîä Г¬Г*òðèö Г*Г* ГЅГЄГ°Г*Г*}
- var k,j:integer;
- begin
- for k:=1 to n do
- begin
- for j:=1 to n do
- write(a[k,j],' ' );
- writeln;
- end;
- end;
- var k,j,i,p:integer;{n-Г°Г*çìåð Г¬Г*òðèöû,k-Г±Г·ГҐГІГ·ГЁГЄ ГЇГ® ñòðîêГ*Г¬,j-Г±Г·ГҐГІГ·ГЁГЄ ГЇГ® ñòîëáöГ*Г¬,p-Г±Г·ГҐГІГ·ГЁГЄ ïåðåñòГ*Г*îâîê}
- a,at,b,c,e:Tmatr;{a-èñõîäГ*Г*Гї, at-ГІГ°Г*Г*Г±ГЇГ®Г*èðîâГ*Г*Г*Г*Гї, b-Г¬Г*òðèöГ* äîïîëГ*ГҐГ*ГЁГ©, e-îáðГ*ГІГ*Г*Гї, Г±-ïðîâåðêГ*}
- det,det1:real;{det-îïðåäåëèòåëü èñõîäГ*îé Г¬Г*òðèöû,det1-îïðåäåëèòåëè-äîïîëГ*ГҐГ*ГЁГї}
- f1:text;{ïðèçГ*Г*ГЄ Г*åñóùåñòâîâГ*Г*ГЁГї îáðГ*ГІГ*îé Г¬Г*òðèöû}
- f:byte ;
- begin
- clrscr;
- //Chtenie(a,n); {Г·ГЁГІГ*ГҐГ¬ Г¬Г*òðèöó Г± äèñêГ*}
- assign(f1,'input.txt');
- reset(f1);
- For i:=1 To 10 do {ââîä Г¬Г*Г±Г±ГЁГўГ* ГЁГ§ ГґГ*éëГ*}
- for j:=1 to 10 do
- Read(f1, a[i,j]); {Г·ГІГҐГ*ГЁГҐ i-ГЈГ® ýëåìåГ*ГІГ*}
- close(f1);
- writeln('ÈñõîäГ*Г*Гї Г¬Г*òðèöГ*:');
- Vyvod(a,n);
- Opr(n,p,a,det,f); {Г±Г·ГЁГІГ*ГҐГ¬ îïðåäåëèòåëü}
- if f=1 then exit;
- Transp(a,n,b); {ГІГ°Г*Г*Г±ГЇГ®Г*èðóåì Г¬Г*òðèöó}
- Peresch(n,p,b,det1,e); {Г±Г·ГЁГІГ*ГҐГ¬ äîïîëГ*ГҐГ*ГЁГї}
- writeln('Obratnaja matrica:');
- for k:=1 to n do
- for j:=1 to n do
- e[k,j]:=e[k,j]/det; {ñîçäГ*ГҐГ¬ îáðГ*ГІГ*ГіГѕ Г¬Г*òðèöó}
- Vyvod(e,n);
- writeln('Proverka:');
- Proverka(a,e,n,c); {äåëГ*ГҐГ¬ ïðîâåðêó}
- Vyvod(c,n);
Решение задачи: «Считать и вывести матрицу из файла»
textual
Листинг программы
- procedure readfile(var f1:textfile;var a:TMatr;var n:integer);
- var i,j:integer;
- begin
- assign(f1,'input.txt');
- reset(f1);
- read(f1,n);
- for i:=1 to n do
- for j:=1 to n do
- read(f1, a[i,j]);
- closefile(f1);
- end;
Объяснение кода листинга программы
- В процедуре
readfile
объявлены три переменные:f1
,a
иn
. Переменнаяf1
типаtextfile
, переменнаяa
типаTMatr
(предполагается, что это матрица), а переменнаяn
типаinteger
(предполагается, что это число). - Переменная
f1
присваивается значение'input.txt'
. Это означает, что файл будет считываться из указанного места. - Функция
reset(f1)
используется для сброса файла перед чтением. - Функция
read(f1,n)
используется для чтения n строк из файла в переменнуюa
. - В цикле
for i:=1 to n do
происходит чтение каждой строки из файла и присваивание ее соответствующему элементу матрицыa
. - После завершения чтения файла вызывается функция
closefile(f1)
. - Код не содержит вложенных списков.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д