Помощь - Поиск - Пользователи - Календарь
Полная версия: Программа на файлы
Форум «Всё о Паскале» > 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 Разбирайся и приходи..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.