1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
program ReadMatrixFromFile; const NMAX = 100; MMAX = 100; type Matrix = array [1..NMAX, 1..MMAX] of real; var M: Matrix;
(*************************************************** Процедура ввода матрицы из файла ****************************************************) procedure EnterMatrixFromFile (Matr:Matrix);
var n,m,i,j: integer; f:text;
begin assign(f,'matrixdat.txt'); reset(f); i := 1;
while not eof(f) do begin j := 1 ; while not eoln(f) do begin read(f,Matr[i, j]); writeln('Matr[',i,',',j,']',Matr[i,j]); inc(j); end; n:=i; m:=j-1; writeln('n=',n,',','m=',m); readln(f); inc(i); end;
ProtasSoft, ТОЛЬКО приведенный тобой код работает? Я же просил тебя привести описание Matrix, иначе я не могу заставить программу работать так, как ТЫ этого хочешь, тут телепатов нет. Задавай вопросы корректно...
Кстати, чем тебе не понравился мой код? Что именно не работает в нем? И не надо говорить "ВСЕ" или "Просто не работает"... Если ты говоришь, что код нерабочий, будь добр привести пример программы, и файла, для которых произошла ошибка. Голословных утверждений я не принимаю.
Если что-то не так сказал прошу прощения. Далее написал код вместе с функцией попарной обработки строк, но где-то в ней ошибки.
Код
program Matrix_Process; (****************************************************** * Демонстрация работы с двумерными массивами * * (матрицами) * ******************************************************) const NMAX = 100; MMAX = 100; type Matrix = array [1..NMAX, 1..MMAX] of real; var M: Matrix;
(*************************************************** Процедура ввода матрицы из файла ****************************************************) procedure EnterMatrixFromFile (Matr:Matrix);
var n,m,i,j: integer; f:text;
begin assign(f,'matrixdat.txt'); reset(f); i := 1;
while not eof(f) do begin j := 1; while not eoln(f) do begin read(f,Matr[i, j]); writeln('Matr[',i,',',j,']',Matr[i,j]); inc(j); end;
readln(f); inc(i); end; close(f); n:=i; m:=j-1; writeln('n=',n,',','m=',m); end; (***************************************************** Функция обработки всех пар строк матрицы ******************************************************) Function Funky(Matr:Matrix):Matrix; var i,j,k,p: integer; Sum1,Sum2,Sum3: real; begin for k:=1 to n do begin for p:=1 to n do begin Sum1:=0; Sum2:=0;Sum3:=0; for j:=1 to m do begin Sum1:=Sum1+Matr[k,j]; Sum2:=Sum2+Matr[p,j]; end;
for j:=1 to m do Sum3:=Sum3+1/(Matr[k,j]+Matr[p,j])*(Matr[k,j]/Sum1-Matr[p,j]/Sum2)*; end; Funky[k,p]:=Sum1*Sum2*Sum3; writeln('Funky[',k,',',p,']',Funky[k,p]); end; end;
end;
begin EnterMatrixFromFile(M); Funky(Matr); readln; end.
Я убрал все синтаксические ошибки, и кое-что добавил, но так как я не знаю что должна считать твоя ф-я, да и вообще она выглядит крайне странно, дальше разбирайся сам, теперь программа по крайней мере компилируется.
Исходный код
uses crt;
const NMAX = 1000; MMAX = 2000; type
Matrix = array [1..NMAX, 1..MMAX] of real;
var
M: Matrix;
row,col:integer;
procedure EnterMatrixFromFile (Matr:Matrix; var size1,size2:integer);
var
i,j: integer;
f:text;
begin
assign(f,'matrixdat.txt');
reset(f);
i := 1;
while not eof(f) do begin j := 1; while not eoln(f) do begin
Коллеги, вот что у меня получилось с учетом Ваших советов и вроде рабоает. Правда, я не смог справиться с глобальной переменной массива Matr в первой процедуре ввода массива из файла. Может чего подскажите.
Кстати, изменил размерность до 1000Х2000 программа перстала работать.
Исходный код
program Matrix_Process; (****************************************************** * Демонстрация работы с двумерными массивами * * (матрицами) * ******************************************************) const NMAX = 20; MMAX = 20; type Matrix = array [1..NMAX, 1..MMAX] of real; var Matr, M1,M2: Matrix; n,m: integer;
(*************************************************** Процедура ввода матрицы из текстового файла ****************************************************) procedure EnterMatrixFromFile;
var i,j: integer; f:text;
begin assign(f,'matrixdat.txt'); reset(f); i := 1;
while not eof(f) do begin j := 1; while not eoln(f) do begin read(f,Matr[i, j]); writeln('Matr[',i,',',j,']',Matr[i,j]); inc(j); end;
(****************************************************** Процедура печати матрицы реальной размерности (n,m) на экране, располагающая одну строку матрицы на одной строке экрана ******************************************************) procedure PrintMatrix (Matrix_: Matrix; nn, mm: integer); var i, j: integer; begin for i:=1 to nn do begin for j:=1 to mm do writeln('Matrix_[',i,',',j,']',Matrix_[i,j]); writeln; end; end;
(****************************************************** Процедура вывода квадратной матрицы размерности (n,n) в текстовый файл
******************************************************) procedure PrintMatrixToFile (Matrix_: Matrix; nn: integer); var i, j: integer; g:text; begin
assign(g,'matres.txt'); rewrite(g);
for i:=1 to nn do begin for j:=1 to nn do begin write (g,Matrix_[i,j]); end; writeln(g); end; close(g); end;
for k:=1 to nn do begin for p:=1 to nn do begin Sum1:=0; Sum2:=0; Sum3:=0; for j:=1 to mm do begin Sum1:=Sum1+Matrix_[k,j]; Sum2:=Sum2+Matrix_[p,j]; end;
for j:=1 to mm do begin If (Matrix_[k,j]+Matrix_[p,j])<>0 then Sum3:=Sum3 + 1/(Matrix_[k,j]+Matrix_[p,j])* (Matrix_[k,j]/Sum1-Matrix_[p,j]/Sum2)* (Matrix_[k,j]/Sum1-Matrix_[p,j]/Sum2) else Sum3:=Sum3; end; Funk[k,p]:=Sum1*Sum2*Sum3; writeln('Funk[',k,',',p,']',Funk[k,p]);
end; end; PrintMatrixToFile(Funk,nn); end;
begin EnterMatrixFromFile; readln; PrintMatrix (Matr,n,m); PrintMatrixToFile(Matr,n); readln; Funky (matr,n,m); readln;
Кстати, изменил размерность до 1000Х2000 программа перстала работать.
Насколько я вижу, эта программа и не должна работать при больших размерностях - здесь Var тоже был упущен, следовательно при изменении размерности до 1000х2000 программа отказывается работать - просто переполняется стек, так как массив передается не по ссылке, а по значению. Вот так измени:
(****************************************************** Процедура печати матрицы реальной размерности (n,m) на экране, располагающая одну строку матрицы на одной строке экрана ******************************************************) procedure PrintMatrix (Var Matrix_: Matrix; nn, mm: integer); var i, j: integer; begin for i:=1 to nn do begin for j:=1 to mm do writeln('Matrix_[',i,',',j,']',Matrix_[i,j]); writeln; end; end;
(****************************************************** Процедура печати матрицы размерности nn в текстовый файл ******************************************************) procedure PrintMatrixToFile (Var Matrix_: Matrix; nn: integer); var i, j: integer; g:text; begin
assign(g,'matres.txt'); rewrite(g);
for i:=1 to nn do begin for j:=1 to nn do begin write (g,Matrix_[i,j]); end; writeln(g); end; close(g); end;
(*********************************************** Процедура попарной обработки строк матрицы ************************************************) procedure Funky(Var Matrix_: Matrix; nn, mm: integer); var i,j,k,p: integer; Sum1,Sum2,Sum3: real;
begin
for k:=1 to nn do begin for p:=1 to nn do begin Sum1:=0; Sum2:=0; Sum3:=0; for j:=1 to mm do begin Sum1:=Sum1+Matrix_[k,j]; Sum2:=Sum2+Matrix_[p,j]; end;
for j:=1 to mm do begin If (Matrix_[k,j]+Matrix_[p,j])<>0 then Sum3:=Sum3+1/(Matrix_[k,j]+Matrix_[p,j]) *(Matrix_[k,j]/Sum1-Matrix_[p,j]/Sum2)* (Matrix_[k,j]/Sum1-Matrix_[p,j]/Sum2) else Sum3:=Sum3; end; Funk[k,p]:=Sum1*Sum2*Sum3; {writeln('Funk[',k,',',p,']',Funk[k,p]);}
end; end;
end;
(*********************************************** Процедура замены точки на запятую в текстовом файле ************************************************)
while not eoln(g) do begin read(g,char_); if char_='.' then write(f,',') else write (f,char_); end; readln(g); writeln(f); end; close(f); close(g); end;
begin EnterMatrixFromFile; readln; {PrintMatrix (Matr,n,m);} Funky (Matr,n,m); PrintMatrixToFile(Funk,n); RedactirFile; end.
Коллеги, пробовал ниже приведенную программку на матрице размером 200Х200 результат был. Попробовал матрицу размером 600Х400 программа зависает, а если предложить переварить матрицу большего размера, выдается системная ошибка Windows. Есть подозрения, что память все же не хватает. Подскажите как выйти из положения. В качестве выхода хочу попровать очистить память от массива, который уже сохранен в файлю. Как это сделать (если возможно)?
Заархивируй свой исходник вместе с файлом данных и присоедини к сообщению. Тогда можно будет говорить об исправлении. Иначе - никак. Возможно что-то не то именно с файлом данных...
ProtasSoft, та программа, которую ты привел, завершается ошибкой по очень банальной причине: ты объявил тип Matrix как матрицу из 700 строк, а в файле данных у тебя строк БОЛЬШЕ (конкретно - 1227), поэтому при попытке доступа к 701 строке программа и вылетает...
После увеличения количества строк в матрице до 1700 она нормально прочиталась, но в строке
(процедура Funky) происходит RunTime Error 207 (деление на 0) - ты хоть и проверяешь
If (Matrix_[k,j]+Matrix_[p,j])<>0 then ...
но у тебя нулю равно sum2, а на него ты делишь... Это тоже надо проверять... Так что проблемы не в недостатке памяти, просто будь внимательнее... :yes:
Снабдил программу Гаммой-функцией и процедурой интегрирования по симпсону. Возникли какие-то проблемы с компиляцией в старых процедурах. Подскажите где баг.
Если ты про проблему с компиляцией функции Simps, то там просто не определена переменная A, сделай что-то типа:
Function Simps(b:extended;m:integer):extended; var sum, h, a: extended; N, j:Integer; begin N:=1000; a := 0; { так как у тебя интервал начинается с 0 } h:=(b - a)/N; sum:=0.5*(power(b,-1+m/2)*exp(-b/2)); for j:=1 to N-1 do sum:=sum+(j mod 2+1)*power(j*h,-1+m/2)*exp(-j*h/2); Simps:=2*h*sum/3 end;
Больше явных багов не нашел... После этого изменения программа компилируется нормально...