Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ использование процедур

Автор: infiniti 19.05.2007 14:13

Люди, помогите, пожалуйста, написать программу! Очень надо! mega_chok.gif

Даны две действительные матрицы разной размерности. Используя процедуры реорганизовать массивы следующим образом: каждый столбец массива упорядочить по невозрастанию, если его предпоследний элемент отличается более чем на 15% от среднего арифметического элементов столбца, находящихся в нечетных строках, в противном случае столбец упорядочить по неубыванию. Использование вспомогательных рабочих массивов допускается.

Автор: мисс_граффити 19.05.2007 15:17

Сам пробовал что-то делать?

Автор: infiniti 19.05.2007 16:13

Цитата(мисс_граффити @ 19.05.2007 12:17) *

Сам пробовал что-то делать?

Пробовал. Как я понял процедура должна считать среднее арифметическое элементов нечетных строк каждого столбца, а затем нужно в другой процедуре сравнивать 0.15 от среднего с последним элементом столбца. Но я не шарю в Паскале, и как это в нем организовать не понимаю. wacko.gif

Автор: volvo 19.05.2007 16:23

Процедур на самом деле лучше сделать 3, а не одну: первая будет печатать матрицу (потому как тебе придется ее печатать как минимум 2 раза, ДО и ПОСЛЕ преобразования), вторая - считать среднее арифметическое и определять направление сортировки, а третья - собственно сортировать данные...

Подумай, для начала, как ты представляешь себе передачу матрицы любого размера в процедуру... Если ты сделаешь это правильно - вся остальная задача решается элементарно...

Автор: infiniti 19.05.2007 16:36

Мне, в принципе не нужно брать матрицы любого размера, можно взять две конкретные, но разной размерности.

Автор: volvo 19.05.2007 16:43

Ну, а я про что?... Они же

Цитата
две конкретные, но разной размерности.
, и просто так ты их в процедуру не передашь... Надо придумать, как ДА можно передать 2 разноразмерные матрицы...

(для информации - программа давно готова, но вот тут я бы предпочел не выкладывать готовое решение, а подождать, пока ты хоть немного продвинешься дальше самостоятельно...)

Автор: infiniti 19.05.2007 16:56

Я думаю так

 
Type matr = Array[1..4,1..5] of integer; Var A,B: matr;
Procedure VVOD(Var X: matr;k,r: integer; e: char);
Var I,J: integer;
Begin
Writeln('Matrica',e);
For I:= 1 to k do
Begin
For J:= 1 to r do
Begin
Write('X[',I,J,']='); Readln(X[I,J]);
End;
End;
End;


Автор: volvo 19.05.2007 16:58

Хорошо... А теперь покажи, как в ЭТУ ЖЕ процедуру передать И матрицу 4*5, И матрицу 6*7, например... У тебя же матрицы РАЗНОГО размера, прочти условие внимательно!!!

Автор: infiniti 19.05.2007 17:06

Может так

Type matr = Array[1..4,1..5] of integer; Var A,B: matr; 
Procedure VVOD(Var X,Y: matr;k,r,m,n: integer; e,l: char);
Var I,J,D,C: integer;
Begin
Writeln('Matrica',e);
For I:= 1 to k do
Begin
For J:= 1 to r do
Begin
Write('X[',I,J,']='); Readln(X[I,J]);
Begin
Writeln('Matrica',l);
For D:= 1 to m do
Begin
For C:= 1 to n do
Begin
Write('Y[',D,C,']='); Readln(Y[D,C]);
End;
End;
End;
End;
End;
End;


Автор: volvo 19.05.2007 17:10

Да не так... Я больше очевидного говорить не буду... Ты ОПИСЫВАЕШЬ уже матрицы одинаковыми!!!

Type
matrix1 = array[1 .. 5, 1 .. 7] of integer;
matrix2 = array[1 .. 4, 1 .. 8] of integer;

var
m1: matrix1;
m2: matrix2;


А вот теперь попробуй ОБЕ матрицы (и m1, и m2) заполнить в своей процедуре!

Автор: infiniti 19.05.2007 17:22

Type matr1 = Array[1..4,1..5]; matr2 = Array[1..6,1..7]of integer; Var m1: matr1; m2:matr2;
Procedure VVOD(Var m1,m2: matr;k,r,m,n: integer; e,l: char);
Var I,J,D,C: integer;
Begin
Writeln('Matrica',e);
For I:= 1 to k do
Begin
For J:= 1 to r do
Begin
Write('m1[',I,J,']='); Readln(m1[I,J]);
Begin
Writeln('Matrica',l);
For D:= 1 to m do
Begin
For C:= 1 to n do
Begin
Write('m2[',D,C,']='); Readln(m2[D,C]);
End;
End;
End;
End;
End;
End;


Так?

Автор: мисс_граффити 19.05.2007 18:09

Во-первых, не стоит забывать про форматирование текста программ.
Во-вторых... Нет, это не решение.
А если нам нужно 3 матрицы? А если 10?

Я бы вот в какую сторону посмотрела: у нас нигде нет работы с матрицей целиком. Все задания идут по отдельному столбцу... Это первый вариант.
Второй... Работу с динамической памятью вы еще не проходили?


Автор: infiniti 19.05.2007 18:27

Насчет форматирования - согласен, но для меня щас это не главное. Это не решение - это начальная часть программы, где описываются матрицы.У меня есть конкретная задача с двумя матрицами. Если бы я самостоятельно, без помощи мог все сделать я бы здесь не сидел. У нас было 4 лекции по Паскалю и понять мне особо ничего не удалось. Информатика последний семестр и не профильный предмет. На последний вопрос я думаю отвечать не надо.

Автор: volvo 19.05.2007 19:07

Ну вот посмотри, как я бы делал печать матрицы:

procedure print(const mx: array of real;
m, n: integer);
var i, j: integer;
begin
for i := 0 to pred(m) do begin
for j := 0 to pred(n) do
write(mx[i * n + j]:5 :2);
writeln;
end;
end;

const
a: array[1 .. 5, 1 .. 5] of real = (
(1.0, 2.0, 3.0, 4.0, 5.0),
(2.5, 7.3, 4.8, 5.8, 2.9),
(3.5, 6.7, 8.2, 9.5, 2.6),
(5.5, 6.7, 3.8, 4.65, 9.4),
(1.1, 2.7, 7.3, 0.5, 0.8)
);

begin
print(a[1], 5, 5);
end.


Посмотри, как организована работа с матрицей... В эту процедуру можно передать как матрицу 5x5, так и 10x8, и любую другую...

Автор: infiniti 19.05.2007 19:49

С печатью матрицы понятно. Мне нужно составить программу для двух конкретных матриц, каких я хочу сам, например 2*3 и 3*4, данные тоже выбираю я, т.е. мне нужна конкретно эта задача с моими данными. Задача мне понятна, просто я слабо представляю как реализовать ее в Паскале. Например как считать среднее значение элементов нечетных строк и затем упорядочивать столбцы. Моему преподу нужно будет лишь объяснить где какие переменные и какие операторы и процедуры что делают.

Автор: volvo 19.05.2007 20:01

Ну, я смотрю, сам ты ничего делать не хочешь... Как хочешь... Держи:

const
a: array[1 .. 5, 1 .. 5] of real = (
(1.0, 2.0, 3.0, 4.0, 5.0),
(2.5, 7.3, 4.8, 5.8, 2.9),
(3.5, 6.7, 8.2, 9.5, 2.6),
(5.5, 6.7, 3.8, 4.65, 9.4),
(1.1, 2.7, 7.3, 0.5, 0.8)
);

procedure print(const mx: array of real;
m, n: integer);
var i, j: integer;
begin
for i := 0 to pred(m) do begin
for j := 0 to pred(n) do
write(mx[i * n + j]:5:2);
writeln;
end;
end;

procedure sort(var mx: array of real;
m, n: integer; in_col: integer; by: boolean);
var
T: real;
i, j: integer;
begin
for i := 1 to m do
for j := m downto i + 1 Do
if (mx[(in_col) + pred(j - 1) * n] >
mx[(in_col) + pred(j) * n]) = by then
begin
T := mx[(in_col) + pred(j - 1) * n];
mx[(in_col) + pred(j - 1) * n] := mx[(in_col) + pred(j) * n];
mx[(in_col) + pred(j) * n] := T;
end;
end;

procedure convert(var mx: array of real;
m, n: integer);
var
rows, cols, count: integer;
before_last, s: real;
begin
for cols := 0 to pred(n) do begin
s := 0; count := 0;
for rows := 0 to pred(m) do
if odd(rows + 1) then begin
s := s + mx[rows * n + cols];
inc(count);
end;
s := s / count;

before_last := mx[(m - 2)*n + 0];
sort(mx, m, n, cols, abs(before_last - s) / s > 0.15);

writeln('col = ', cols, '; sum = ', s:6:2);
end;
end;

begin
print(a[1], 5, 5);
convert(a[1], 5, 5);
print(a[1], 5, 5);
end.

Добавишь еще одну матрицу - отработает и на ней тоже... Успехов...

Автор: infiniti 19.05.2007 20:14

Огромное спасибо!!! good.gif Потараюсь до конца разобраться.

Автор: infiniti 20.05.2007 22:20

VOLVO!
Cпасибо огромное!!! Вчера добавил еще одну матрицу, все работает. Но не все понятно.
С процедурой принт все ясно, а вот дальше dry.gif Что обозначено за in_col? Что такое by: boolean? Нам такое не давали. rows - ряды, cols-столбцы,count-счетчик - так? И напишите, пожалуйста где что считается unsure.gif