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

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

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

 
 Ответить  Открыть новую тему 
> Матрица, Сортировка по суме элементов столбцов
TS*
сообщение 10.12.2006 0:01
Сообщение #1


Пионер
**

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

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


Всем добрый вечер. Не компилируеться програмка, зависает на процедуре сумирования элементов столбцов:

uses
crt;
const
m=5; n=7;
type
realm = array[1..n] of real;
var
mA: array[1..m] of realm;
mS: array[1..n] of real;
tr: boolean;
e, v: integer; rr, tt: integer;

procedure fill_matrix(var mF: array of realm;ll, mm: integer);
var
l, m: integer;
begin
randomize;
for l:=1 to ll do begin
for m:=1 to mm do
begin
mF[l, m]:=random(300)-150;
end; end;
end;

function suma_el_st(mT: array of realm;i, j: integer): real;
var
k: integer;
suma: real;
begin
suma:=0;
for k:=1 to i do
suma:=suma+mT[k, j];
suma_el_st:=suma;
end;

procedure perestanovka_st(mP: array of realm; x, y: integer);
var
f: integer;
begin
for f:=1 to m do
begin
mP[x, f]:=mP[x, f]+mP[y, f];
mP[y, f]:=mP[x, f]-mP[y, f];
mP[x, f]:=mP[x, f]-mP[y, f];
end;
end;

begin
fill_matrix(mA, m, n);
{sort}
repeat
tr:=true;
for e:=1 to n-1 do begin
if suma_el_st(mA, e, n) < suma_el_st(mA, e, n+1) then begin
perestanovka_st(mA, n, n+1);
tr:=false;
end;
end;
until tr;

for rr:=1 to n do begin
for tt:=1 to m do
begin
write(mA[rr, tt]);
end;
writeln;
end;
end.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Алена
сообщение 10.12.2006 0:14
Сообщение #2


Гость






       mP[x, f]:=mP[x, f]+mP[y, f];
mP[y, f]:=mP[x, f]-mP[y, f];
mP[x, f]:=mP[x, f]-mP[y, f];
Это ты так пытаешься менять элементы местами? Смысл?

Второе - Array of ... индексируется с 0, а не с 1-цы...
 К началу страницы 
+ Ответить 
Bokul
сообщение 10.12.2006 0:21
Сообщение #3


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Цитата
Не компилируеться програмка, зависает на процедуре сумирования элементов столбцов

Ну во-первых, если программа не компилируется, то она и зависнуть не может. Такая пакость происходит только в RunTime, т.е. уже после компиляции и запуска.
Во-вторых, ошибка происходит в процедуре perestanovka_st. Ты хочешь поменять местами столбцы массива не вводя вспомогательную переменную, грубо говоря так:
a:=a+b;
b:=a-b';
a:=a-b;
но паскаль не умеет отнимать и складывать массивы. У тебя есть два выхода:
1 Если программируешь на Fpc воспользуйся Перегрузкой операций
2 меняй их значения используя 3-ью переменную.


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TS*
сообщение 10.12.2006 0:31
Сообщение #4


Пионер
**

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

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


Цитата(Алена @ 9.12.2006 23:14) *

       mP[x, f]:=mP[x, f]+mP[y, f];
mP[y, f]:=mP[x, f]-mP[y, f];
mP[x, f]:=mP[x, f]-mP[y, f];
Это ты так пытаешься менять элементы местами? Смысл?

Второе - Array of ... индексируется с 0, а не с 1-цы...


Спасибо, не знал что арей оф индексируеться с [0]. А менять местами элементы просто нравиться без дополнительной переменной. Одного не понимаю, почему в 6-ом столбце все элементы всегда рвны 0 ?

Цитата(Bokul @ 9.12.2006 23:21) *

Ну во-первых, если программа не компилируется, то она и зависнуть не может. Такая пакость происходит только в RunTime, т.е. уже после компиляции и запуска.
Во-вторых, ошибка происходит в процедуре perestanovka_st. Ты хочешь поменять местами столбцы массива не вводя вспомогательную переменную, грубо говоря так:
a:=a+b;
b:=a-b';
a:=a-b;
но паскаль не умеет отнимать и складывать массивы. У тебя есть два выхода:
1 Если программируешь на Fpc воспользуйся Перегрузкой операций
2 меняй их значения используя 3-ью переменную.


Где идет зависание "видно" при комбинацыи Ctrl + Break, и я не отнимаю масивы, а элементы. При вводе дополнительной переменной проблема осталась wacko.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Bokul
сообщение 10.12.2006 0:50
Сообщение #5


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Цитата
и я не отнимаю масивы, а элементы

Извиняюсь перепутал.


У тебя походу идет переполнение стека + почему ты в процедуре perestanovka_st переменную mP: array of realm не под Var поставил? Какая от нее тогда польза? Поставь Var, должно помочь.

Сообщение отредактировано: Bokul - 10.12.2006 0:51


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TS*
сообщение 10.12.2006 2:07
Сообщение #6


Пионер
**

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

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


Цитата(Bokul @ 9.12.2006 23:50) *

Извиняюсь перепутал.
У тебя походу идет переполнение стека + почему ты в процедуре perestanovka_st переменную mP: array of realm не под Var поставил? Какая от нее тогда польза? Поставь Var, должно помочь.


Спсибо, точно вар забыл smile.gif . А как в даном случае избаится от переполнения стека?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Алена
сообщение 10.12.2006 2:13
Сообщение #7


Гость






А каким образом у тебя возникает переполнение? Где именно? При таких маленьких размерах массивов его быть просто не должно, кроме того, Var - это передача "по ссылке", что не приближает Stack Overflow, а наоборот, отдаляет его...
 К началу страницы 
+ Ответить 
TS*
сообщение 10.12.2006 2:45
Сообщение #8


Пионер
**

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

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


Цитата(Алена @ 10.12.2006 1:13) *

А каким образом у тебя возникает переполнение? Где именно? При таких маленьких размерах массивов его быть просто не должно, кроме того, Var - это передача "по ссылке", что не приближает Stack Overflow, а наоборот, отдаляет его...


Переполнение стека выкидает у Bokula на компиляторе, у меня програмка раз запускаеться и исполняеться, раз запускаеться и зависает на функции сумирования или процедуре подсчета столбцов

Сообщение отредактировано: TS* - 10.12.2006 2:46
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Алена
сообщение 10.12.2006 9:37
Сообщение #9


Гость






TS*, ты выбрал не самый правильный способ представления данных... У тебя в процедуру перестановки передается массив строк, а работать тебе нужно с массивом столбцов...

Но поскольку телепатией я не владею, и что у тебя N - число строк или столбцов - не знаю( а гадать не буду) - то жду твоего ответа...

Сообщение отредактировано: Алена - 10.12.2006 9:37
 К началу страницы 
+ Ответить 
TS*
сообщение 10.12.2006 12:45
Сообщение #10


Пионер
**

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

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


Цитата(Алена @ 10.12.2006 8:37) *

TS*, ты выбрал не самый правильный способ представления данных... У тебя в процедуру перестановки передается массив строк, а работать тебе нужно с массивом столбцов...

Но поскольку телепатией я не владею, и что у тебя N - число строк или столбцов - не знаю( а гадать не буду) - то жду твоего ответа...


столбцов
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
-xxx-
сообщение 10.12.2006 12:48
Сообщение #11


Гость






напиши в конце как получилась гтовая прога плз
 К началу страницы 
+ Ответить 
TS*
сообщение 10.12.2006 15:04
Сообщение #12


Пионер
**

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

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


uses
crt;
const
m=5;{stroki}
n=7;{stolbcu}
type
realm = array[1..n] of real;
var
mA: array[1..m] of realm;
mS: array[1..n] of real;
tr: boolean;
e, v: integer; rr, tt: integer;

procedure fill_matrix(var mF: array of realm;ll, mm: integer);
var
l, m: integer;
begin
randomize;
for l:=0 to ll-1 do begin
for m:=0 to mm-1 do
begin
mF[l, m]:=random(300)-150;
end; end;
end;

function suma_el_st(mT: array of realm;i, j: integer): real;
var
k: integer;
suma: real;
begin
suma:=0;
for k:=0 to i-1 do
suma:=suma+mT[k, j];
suma_el_st:=suma;
end;

procedure perestanovka_st(var mP: array of realm; x, y: integer);
var
f: integer;
ss: real;
begin
for f:=0 to m-1 do
begin
ss:=mP[x, f];
mP[x, f]:=mP[y, f];
mP[y, f]:=ss;
end;
end;

begin
fill_matrix(mA, m, n);
{sort}
repeat
tr:=true;
for e:=1 to n-1 do begin
if suma_el_st(mA, e, n) < suma_el_st(mA, e, n+1) then begin
perestanovka_st(mA, n, n+1);
tr:=false;
end;
end;
until tr;

writeln;writeln;writeln;
for rr:=1 to n do begin
for tt:=1 to m do
begin
write(mA[rr, tt]);
end;
writeln;
end;
end.


Сообщение отредактировано: volvo - 27.03.2010 12:44
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Алена
сообщение 10.12.2006 16:35
Сообщение #13


Гость






TS* no1.gif Не то... Смотри, что она у меня выводит:
Прикрепленное изображение
(особенное внимание - на нижнюю строку)

А теперь сравни с этим:
uses
crt;
const
m=5;
n=7; { columns count }
type
realm = array[1..m] of real;
var
mA: array[1..n] of realm;
tr: boolean;
curr_col, curr_line: integer;

e, v: integer;

procedure fill_matrix(var mF: array of realm;
const num_lines, num_columns: integer);
var
lines, cols: integer;
begin
randomize;
for cols := 0 to num_columns - 1 do
for lines := 1 to num_lines do begin
mF[cols][lines] := random(300)-150;
end;

end;

function suma_el_st(const mT: array of realm;
const col_to_sum, num_lines: integer): real;
var
k: integer;
suma: real;
begin

suma:=0;
for k := 1 to num_lines do
suma:=suma+mT[col_to_sum - 1][k];
suma_el_st:=suma;

end;

procedure perestanovka_st(var mP: array of realm;
const change_from, change_to: integer);
var
f: integer;
T: realm;
begin
T := mP[change_from - 1];
mP[change_from - 1] := mP[change_to - 1];
mP[change_to - 1] := T;
end;

begin
fill_matrix(mA, m, n);
writeln;
writeln;
for curr_line := 1 to m do begin
for curr_col := 1 to n do
write(mA[curr_col][curr_line]:8:3);
writeln;
end;

{sort}
repeat
tr:=true;
for e:=1 to n-1 do begin
if suma_el_st(mA, e, m) < suma_el_st(mA, e+1, m) then begin
perestanovka_st(mA, e, e+1);
tr:=false;
end;
end;
until tr;

writeln;
writeln;
for curr_line := 1 to m do begin
for curr_col := 1 to n do
write(mA[curr_col][curr_line]:8:3);
writeln;
end;
readln;
end.
 К началу страницы 
+ Ответить 
TS*
сообщение 11.12.2006 3:23
Сообщение #14


Пионер
**

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

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


Цитата(Алена @ 10.12.2006 15:35) *

TS* no1.gif Не то... Смотри, что она у меня выводит:


Спасибо, логично названные переменные, а то видимо где то перепутал столбцы со строками smile.gif А какое преимущество дает const в параметрах функцый?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Bokul
сообщение 11.12.2006 3:50
Сообщение #15


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

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


Цитата
А какое преимущество дает const в параметрах функцый?

Есть два преимущества:
1 предохраняет от случайного изменения переменной.
2 экономит память в стеке. Без const процедура сначала скопирует переменную себе в стек, и только потом начнет работать с ней, а так она сазу работает с указателем на настоящую переменную, защищая данные расположены по адресу этого указателя от изменений.


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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