IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

3 страниц V < 1 2 3 >  
Closed Topic Открыть новую тему 
> Обработка прямоугольных матриц
ProtasSoft
сообщение 16.08.2005 9:25
Сообщение #21


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


Вот этот код работает

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;

close(f);
end;

begin
EnterMatrixFromFile(M);
readln;
end.


[/quote]

Сообщение отредактировано: ProtasSoft - 16.08.2005 9:26
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.08.2005 9:36
Сообщение #22


Гость






ProtasSoft, ТОЛЬКО приведенный тобой код работает? Я же просил тебя привести описание Matrix, иначе я не могу заставить программу работать так, как ТЫ этого хочешь, тут телепатов нет. Задавай вопросы корректно...

Кстати, чем тебе не понравился мой код? Что именно не работает в нем? И не надо говорить "ВСЕ" или "Просто не работает"... Если ты говоришь, что код нерабочий, будь добр привести пример программы, и файла, для которых произошла ошибка. Голословных утверждений я не принимаю. angry.gif
 К началу страницы 
+ Ответить 
ProtasSoft
сообщение 16.08.2005 10:28
Сообщение #23


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


Если что-то не так сказал прошу прощения.
Далее написал код вместе с функцией попарной обработки строк, но где-то в ней ошибки.

Код
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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 16.08.2005 10:40
Сообщение #24


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Цитата
где-то в ней ошибки.


1) для функции funky не определены размеры прочтенного массива

2) непонятная рекурсия в той-же ф-и (вызываешь ф-ю в ней самой с совершенно непонятными параметрами)

3) синтаксические ошибки

Сообщение отредактировано: klem4 - 16.08.2005 10:42


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 16.08.2005 11:29
Сообщение #25


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Я убрал все синтаксические ошибки, и кое-что добавил, но так как я не знаю что должна считать твоя ф-я, да и вообще она выглядит крайне странно, дальше разбирайся сам, теперь программа по крайней мере компилируется.

Исходный код
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

read(f,Matr[i, j]);
writeln('Matr[',i,',',j,']',Matr[i,j]);
inc(j);
end;

readln(f); inc(i);
end;

close(f);

size1:=i;
size2:=j-1;

writeln('n=',size1,',','m=',size2);
end;


Function Funky(var Matr:Matrix; size1,size2:integer):Matrix;
var

i,j,k,p: integer;
Sum1,Sum2,Sum3: real;

begin

for k:=1 to size1 do
for p:=1 to size1 do begin

Sum1:=0; Sum2:=0;Sum3:=0;

for j:=1 to size2 do begin

Sum1:=Sum1+Matr[k,j];
Sum2:=Sum2+Matr[p,j];
end;

for j:=1 to size2 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;




Begin

EnterMatrixFromFile(M,row,col);

Funky(M,row,col);

readln;

End.


ЗЫ правильность чтения я не проверял, только исправил явные ошибки!


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.08.2005 12:52
Сообщение #26


Гость






klem4, как ты думаешь, что будет в массиве Matr после вызова этой процедуры? Ничего не забыл? ;) Var, например...
procedure EnterMatrixFromFile(Matr: Matrix; var size1, size2: integer);
 К началу страницы 
+ Ответить 
klem4
сообщение 16.08.2005 12:54
Сообщение #27


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Да, это я проглядел :yes: ... ProtasSoft в заголовке этой ф-и перед Matr:Matrix
поставь var


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
ProtasSoft
сообщение 16.08.2005 15:48
Сообщение #28


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


Коллеги, вот что у меня получилось с учетом Ваших советов и вроде рабоает.
Правда, я не смог справиться с глобальной переменной массива Matr в первой процедуре ввода массива из файла.
Может чего подскажите.

Кстати, изменил размерность до 1000Х2000 программа перстала работать. unsure.gif

Исходный код
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;

readln(f); inc(i);
end;
close(f);
n:=i-1;
m:=j-1;
writeln('n=',n,',','m=',m);
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;

procedure Funky(Matrix_: Matrix; nn, mm: integer);
var
i,j,k,p: integer;
Sum1,Sum2,Sum3: real;
Funk:Matrix;

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;
PrintMatrixToFile(Funk,nn);
end;

begin
EnterMatrixFromFile;
readln;
PrintMatrix (Matr,n,m);
PrintMatrixToFile(Matr,n);
readln;
Funky (matr,n,m);
readln;

end.


Сообщение отредактировано: volvo - 9.09.2005 10:00
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.08.2005 16:35
Сообщение #29


Гость






Цитата(ProtasSoft @ 16.08.05 15:48)
Кстати, изменил размерность до 1000Х2000 программа перстала работать. unsure.gif

Насколько я вижу, эта программа и не должна работать при больших размерностях - здесь Var тоже был упущен, следовательно при изменении размерности до 1000х2000 программа отказывается работать - просто переполняется стек, так как массив передается не по ссылке, а по значению. Вот так измени:
procedure Funky(Var Matrix_: Matrix; nn, mm: integer);
 К началу страницы 
+ Ответить 
ProtasSoft
сообщение 16.08.2005 16:51
Сообщение #30


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


Изменил , все равно не работает. unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.08.2005 17:05
Сообщение #31


Гость






Значит, так... Поменяй следующее:

1.
procedure PrintMatrix (Matrix_: Matrix; nn, mm: integer);

на
procedure PrintMatrix (Var Matrix_: Matrix; nn, mm: integer);


2.
procedure PrintMatrixToFile (Matrix_: Matrix; nn: integer);

на
procedure PrintMatrixToFile (Var Matrix_: Matrix; nn: integer);


3.
procedure Funky(Matrix_: Matrix; nn, mm: integer);
var
i,j,k,p: integer;
Sum1,Sum2,Sum3: real;
Funk:Matrix;
...

на
var
Funk:Matrix;

procedure Funky(Var Matrix_: Matrix; nn, mm: integer);
var
i,j,k,p: integer;
Sum1,Sum2,Sum3: real;
...

И все заработает smile.gif
 К началу страницы 
+ Ответить 
ProtasSoft
сообщение 16.08.2005 17:25
Сообщение #32


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


Я извиняюсь, вроде заработало.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
ProtasSoft
сообщение 17.08.2005 11:59
Сообщение #33


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


Коллеги, вот что у меня получилось

Исходный код
program Matrix_Process;
(******************************************************
* Демонстрация работы с двумерными массивами *
* (матрицами) *
******************************************************)
const
NMAX = 3000;
MMAX = 3000;
type
Matrix = array [1..NMAX, 1..MMAX] of real;
var
Funk, Matr: 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;

readln(f); inc(i);
end;
close(f);
n:=i-1;
m:=j-1;
writeln('Размеры входной матрицы: ‘Строки n=',n,',','Солбцы m=',m);
end;

(******************************************************
Процедура печати матрицы реальной размерности (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;

(***********************************************
Процедура замены точки на запятую в текстовом файле
************************************************)

procedure RedactirFile;
var
f,g:text;
char_:char;

begin

assign(g,'matres.txt');
reset(g);
assign (f,'matres_v.txt');
rewrite(f);

while not eof(g) do
begin

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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
ProtasSoft
сообщение 18.08.2005 10:52
Сообщение #34


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


Коллеги, пробовал ниже приведенную программку на матрице размером
200Х200 результат был.
Попробовал матрицу размером 600Х400 программа зависает, а если предложить переварить матрицу большего размера, выдается системная ошибка Windows. Есть подозрения, что память все же не хватает.
Подскажите как выйти из положения.
В качестве выхода хочу попровать очистить память от массива, который уже сохранен в файлю. Как это сделать (если возможно)?

Сообщение отредактировано: volvo - 5.03.2009 19:18


Прикрепленные файлы
Прикрепленный файл  matrix20.pas ( 4.88 килобайт ) Кол-во скачиваний: 155
Прикрепленный файл  matrix.zip ( 9.37 килобайт ) Кол-во скачиваний: 119
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.08.2005 11:05
Сообщение #35


Гость






Заархивируй свой исходник вместе с файлом данных и присоедини к сообщению. Тогда можно будет говорить об исправлении. Иначе - никак. Возможно что-то не то именно с файлом данных...
 К началу страницы 
+ Ответить 
volvo
сообщение 18.08.2005 11:39
Сообщение #36


Гость






ProtasSoft, та программа, которую ты привел, завершается ошибкой по очень банальной причине: ты объявил тип Matrix как матрицу из 700 строк, а в файле данных у тебя строк БОЛЬШЕ (конкретно - 1227), поэтому при попытке доступа к 701 строке программа и вылетает...

После увеличения количества строк в матрице до 1700 она нормально прочиталась, но в строке
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));

(процедура Funky) происходит RunTime Error 207 (деление на 0) - ты хоть и проверяешь
If (Matrix_[k,j]+Matrix_[p,j])<>0 then ...

но у тебя нулю равно sum2, а на него ты делишь... Это тоже надо проверять...
Так что проблемы не в недостатке памяти, просто будь внимательнее... :yes:
 К началу страницы 
+ Ответить 
ProtasSoft
сообщение 18.08.2005 12:18
Сообщение #37


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


Огромное спасибо. Заработало!
:flowers:
Сообщения разделены в тему Библиотека математических функций

Сообщение отредактировано: volvo - 18.08.2005 14:43


Прикрепленные файлы
Прикрепленный файл  matrix21.pas ( 5.21 килобайт ) Кол-во скачиваний: 225
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
ProtasSoft
сообщение 19.08.2005 16:55
Сообщение #38


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


Снабдил программу Гаммой-функцией и процедурой интегрирования по симпсону. Возникли какие-то проблемы с компиляцией в старых процедурах. Подскажите где баг.


Прикрепленные файлы
Прикрепленный файл  matrix25.pas ( 7.33 килобайт ) Кол-во скачиваний: 158
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 19.08.2005 17:13
Сообщение #39


Гость






Если ты про проблему с компиляцией функции 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;

Больше явных багов не нашел... После этого изменения программа компилируется нормально...
 К началу страницы 
+ Ответить 
ProtasSoft
сообщение 19.08.2005 17:34
Сообщение #40


Новичок
*

Группа: Пользователи
Сообщений: 33
Пол: Мужской

Репутация: -  0  +


После запуска проги выскакивает системная ошибка.
Исправленный исходник и файл данных в аттаче.


Прикрепленные файлы
Прикрепленный файл  matrix.zip ( 9.37 килобайт ) Кол-во скачиваний: 128
Прикрепленный файл  matrix25.pas ( 7.33 килобайт ) Кол-во скачиваний: 162
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

3 страниц V < 1 2 3 >
Closed Topic Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 22.06.2025 8:37
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"