![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
ProtasSoft |
![]()
Сообщение
#21
|
Новичок ![]() Группа: Пользователи Сообщений: 33 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот этот код работает
[/quote] Сообщение отредактировано: ProtasSoft - 16.08.2005 9:26 |
volvo |
![]()
Сообщение
#22
|
Гость ![]() |
ProtasSoft, ТОЛЬКО приведенный тобой код работает? Я же просил тебя привести описание Matrix, иначе я не могу заставить программу работать так, как ТЫ этого хочешь, тут телепатов нет. Задавай вопросы корректно...
Кстати, чем тебе не понравился мой код? Что именно не работает в нем? И не надо говорить "ВСЕ" или "Просто не работает"... Если ты говоришь, что код нерабочий, будь добр привести пример программы, и файла, для которых произошла ошибка. Голословных утверждений я не принимаю. ![]() |
ProtasSoft |
![]()
Сообщение
#23
|
Новичок ![]() Группа: Пользователи Сообщений: 33 Пол: Мужской Репутация: ![]() ![]() ![]() |
Если что-то не так сказал прошу прощения.
Далее написал код вместе с функцией попарной обработки строк, но где-то в ней ошибки. Код 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. |
klem4 |
![]()
Сообщение
#24
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Цитата где-то в ней ошибки. 1) для функции funky не определены размеры прочтенного массива 2) непонятная рекурсия в той-же ф-и (вызываешь ф-ю в ней самой с совершенно непонятными параметрами) 3) синтаксические ошибки Сообщение отредактировано: klem4 - 16.08.2005 10:42 -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
klem4 |
![]()
Сообщение
#25
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Я убрал все синтаксические ошибки, и кое-что добавил, но так как я не знаю что должна считать твоя ф-я, да и вообще она выглядит крайне странно, дальше разбирайся сам, теперь программа по крайней мере компилируется.
Исходный код 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";'
|
volvo |
![]()
Сообщение
#26
|
Гость ![]() |
klem4, как ты думаешь, что будет в массиве Matr после вызова этой процедуры? Ничего не забыл? ;) Var, например...
procedure EnterMatrixFromFile(Matr: Matrix; var size1, size2: integer); |
klem4 |
![]()
Сообщение
#27
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Да, это я проглядел :yes: ... ProtasSoft в заголовке этой ф-и перед Matr:Matrix
поставь var -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
ProtasSoft |
![]()
Сообщение
#28
|
Новичок ![]() Группа: Пользователи Сообщений: 33 Пол: Мужской Репутация: ![]() ![]() ![]() |
Коллеги, вот что у меня получилось с учетом Ваших советов и вроде рабоает.
Правда, я не смог справиться с глобальной переменной массива 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; 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 |
volvo |
![]()
Сообщение
#29
|
Гость ![]() |
Цитата(ProtasSoft @ 16.08.05 15:48) Кстати, изменил размерность до 1000Х2000 программа перстала работать. ![]() Насколько я вижу, эта программа и не должна работать при больших размерностях - здесь Var тоже был упущен, следовательно при изменении размерности до 1000х2000 программа отказывается работать - просто переполняется стек, так как массив передается не по ссылке, а по значению. Вот так измени: procedure Funky(Var Matrix_: Matrix; nn, mm: integer); |
ProtasSoft |
![]()
Сообщение
#30
|
Новичок ![]() Группа: Пользователи Сообщений: 33 Пол: Мужской Репутация: ![]() ![]() ![]() |
Изменил , все равно не работает.
![]() |
volvo |
![]()
Сообщение
#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 И все заработает ![]() |
ProtasSoft |
![]()
Сообщение
#32
|
Новичок ![]() Группа: Пользователи Сообщений: 33 Пол: Мужской Репутация: ![]() ![]() ![]() |
Я извиняюсь, вроде заработало.
|
ProtasSoft |
![]()
Сообщение
#33
|
Новичок ![]() Группа: Пользователи Сообщений: 33 Пол: Мужской Репутация: ![]() ![]() ![]() |
Коллеги, вот что у меня получилось
Исходный код 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. |
ProtasSoft |
![]()
Сообщение
#34
|
Новичок ![]() Группа: Пользователи Сообщений: 33 Пол: Мужской Репутация: ![]() ![]() ![]() |
Коллеги, пробовал ниже приведенную программку на матрице размером
200Х200 результат был. Попробовал матрицу размером 600Х400 программа зависает, а если предложить переварить матрицу большего размера, выдается системная ошибка Windows. Есть подозрения, что память все же не хватает. Подскажите как выйти из положения. В качестве выхода хочу попровать очистить память от массива, который уже сохранен в файлю. Как это сделать (если возможно)? Сообщение отредактировано: volvo - 5.03.2009 19:18 Прикрепленные файлы ![]() ![]() |
volvo |
![]()
Сообщение
#35
|
Гость ![]() |
Заархивируй свой исходник вместе с файлом данных и присоедини к сообщению. Тогда можно будет говорить об исправлении. Иначе - никак. Возможно что-то не то именно с файлом данных...
|
volvo |
![]()
Сообщение
#36
|
Гость ![]() |
ProtasSoft, та программа, которую ты привел, завершается ошибкой по очень банальной причине: ты объявил тип Matrix как матрицу из 700 строк, а в файле данных у тебя строк БОЛЬШЕ (конкретно - 1227), поэтому при попытке доступа к 701 строке программа и вылетает...
После увеличения количества строк в матрице до 1700 она нормально прочиталась, но в строке Sum3:=Sum3+((1/(Matrix_[k,j]+Matrix_[p,j]))* (процедура Funky) происходит RunTime Error 207 (деление на 0) - ты хоть и проверяешь If (Matrix_[k,j]+Matrix_[p,j])<>0 then ... но у тебя нулю равно sum2, а на него ты делишь... Это тоже надо проверять... Так что проблемы не в недостатке памяти, просто будь внимательнее... :yes: |
ProtasSoft |
![]()
Сообщение
#37
|
Новичок ![]() Группа: Пользователи Сообщений: 33 Пол: Мужской Репутация: ![]() ![]() ![]() |
Огромное спасибо. Заработало!
:flowers: Сообщения разделены в тему Библиотека математических функций Сообщение отредактировано: volvo - 18.08.2005 14:43 Прикрепленные файлы ![]() |
ProtasSoft |
![]()
Сообщение
#38
|
Новичок ![]() Группа: Пользователи Сообщений: 33 Пол: Мужской Репутация: ![]() ![]() ![]() |
Снабдил программу Гаммой-функцией и процедурой интегрирования по симпсону. Возникли какие-то проблемы с компиляцией в старых процедурах. Подскажите где баг.
Прикрепленные файлы ![]() |
volvo |
![]()
Сообщение
#39
|
Гость ![]() |
Если ты про проблему с компиляцией функции Simps, то там просто не определена переменная A, сделай что-то типа:
Function Simps(b:extended;m:integer):extended; Больше явных багов не нашел... После этого изменения программа компилируется нормально... |
ProtasSoft |
![]()
Сообщение
#40
|
Новичок ![]() Группа: Пользователи Сообщений: 33 Пол: Мужской Репутация: ![]() ![]() ![]() |
После запуска проги выскакивает системная ошибка.
Исправленный исходник и файл данных в аттаче. Прикрепленные файлы ![]() ![]() |
![]() ![]() |
![]() |
Текстовая версия | 22.06.2025 8:37 |