Помощь - Поиск - Пользователи - Календарь
Полная версия: Программа на файлы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Demon666
Люди помогите пожалуйста, написал программу, но видимо где то ошибки, помогите пожалуйста найти. Программа должна читать из файла матрицу, в один файл должна забивать нижнетреугольную матрицу (нули под главной диагональю), в другой - верхнедиагональную. а в третий ответ на вопрос - является ли матрица симметричной (т.е матрица равна своей транспонированной)


program matr;
const nmax=10;
n=10;
type
tc=real;
tmas=array[1..nmax, 1..nmax] of tc;
tmatrix=record n:1..n;
c:tmas;
end;

function somn(a,b:real):real;
var c:real;
begin
if (a=0) or (b=0) then c:=0;
if (a>=b) and (b<>0) then c:=a/b
else
if (a<b) and (a<>0) then c:=b/a;

somn:=c;

end;

procedure readf(var f:text; var a:tmatrix);
var i,j:integer;
begin
readln(f, a.n);
for j:=1 to a.n do
for i:=1 to a.n do
read(f, a.c[i][j]);
end;

procedure neal(var a:tmatrix);
var i,j,k:integer; p:real;
begin
i:=1; j:=1;
for i:=1 to a.n do
for j:=i+1 to a.n do begin
p:=somn(a.c[i][1], a.c[i][j]);
for k:=1 to a.n do
a.c[k][j]:=a.c[k][j]-p*a.c[k][1];
end;
end;

procedure trans(var a:tmatrix);
var i,j,k:integer;
p:real;
begin
i:=1;
for k:=0 to a.n-1 do begin
for j:=2 to a.n do begin
p:=a.c[i+k][j+k];
a.c[i+k][j+k]:=a.c[j+k][i+k];
a.c[j+k][i+k]:=p;

end;
end;
end;
function prov(a:tmatrix):boolean;
var i,j:integer;
begin
prov:=true;
for i:=1 to a.n do
for j:=1 to a.n do
if a.c[i][j]<>a.c[j][i] then prov:=false;
end;

var f,f1,f2,f3:text;
a,m,p:tmatrix;
i,j:integer;

begin
assign(f, 'm:\ish.txt');
reset(f);
assign(f1, 'c:\out1.txt');
rewrite(f1);
assign(f2, 'c:\out2.txt');
rewrite(f2);
assign(f3, 'c:\out3.txt');
rewrite(f3);
write(f2, prov(a));
readf(f, a);
m:=a;
neal(a);
for j:=1 to a.n do begin
for i:=1 to a.n do
write(f1, a.c[i][j]);
writeln(f1);
end;

trans(m);
neal(m);
trans(m);
for j:=1 to a.n do begin
for i:=1 to a.n do
write(f3, m.c[i][j]);
writeln(f3);
end;

close(f);
close(f1);
close(f2);
close(f3);
end.



заранее спасибо!!!
Demon666
Help me, please
Lapp
Цитата(Demon666 @ 25.04.2007 22:01) *

Help me, please
Думаешь, по-английски более понятно? smile.gif Я тебе честно скажу, изиняюсь за оффтоп: не хочется смотреть в тему с таким ником. Имею я такое право?.. Сам себе вредишь.. Хочешь быть крутым - будь им, и не проси помощи тогда. А тут приветствуется крутость в кодинге, а не в названиях.

Ладно, давай по делу..
Ошибки есть, ты прав. Все сразу и не найти..
Начнем с чтения файлов. Кстати, зачем ты их держишь в корне С: ? Держи в локальной директории (то есть не пиши весь путь, только имя).
Дальше - ты начинаешь работать с матрицей (prov(a)), еще даже не прочитав ее. Переставь чтение и проверку..
Еще зависит от того, как записан файл. Если судить по тому, как у тебя читается, то все матрица записана в одну строчку. Это немного странно, особенно если посмотреть, как ты записываешь матрицы - нормально, в N строк.

Идем дальше.. Функция prov фактически выдает тебе результат проверки одного числа - последнего в цикле. Посмотри и убедись. Чтобы это исправить, нужно оператор if внутри цикла записать так:

if a.c[i,j]<>a.c[j,i] then begin prov:=false; breake end;

Еще было бы неплохо начинать внутренний цикл с i+1, но это уже детали.. И проверка у тебя не совсем подходит для типа real, но это еще более детали.. smile.gif

Что делает твоя процедура neal, я понять не смог.. Единственное, что могу сказать - первая исполняемая строчка в ней лишняя: в начале цикла значения 1 присвоятся переменным i и j автоматически.

Пока хватит? smile.gif Разбирайся и приходи..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.