Люди, помогите, пожалуйста, написать программу! Очень надо!
Даны две действительные матрицы разной размерности. Используя процедуры реорганизовать массивы следующим образом: каждый столбец массива упорядочить по невозрастанию, если его предпоследний элемент отличается более чем на 15% от среднего арифметического элементов столбца, находящихся в нечетных строках, в противном случае столбец упорядочить по неубыванию. Использование вспомогательных рабочих массивов допускается.
мисс_граффити
19.05.2007 15:17
Сам пробовал что-то делать?
infiniti
19.05.2007 16:13
Цитата(мисс_граффити @ 19.05.2007 12:17)
Сам пробовал что-то делать?
Пробовал. Как я понял процедура должна считать среднее арифметическое элементов нечетных строк каждого столбца, а затем нужно в другой процедуре сравнивать 0.15 от среднего с последним элементом столбца. Но я не шарю в Паскале, и как это в нем организовать не понимаю.
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:= 1to k doBeginFor J:= 1to r doBegin
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:= 1to k doBeginFor J:= 1to r doBegin
Write('X[',I,J,']='); Readln(X[I,J]);
Begin
Writeln('Matrica',l);
For D:= 1to m doBeginFor C:= 1to n doBegin
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:= 1to k doBeginFor J:= 1to r doBegin
Write('m1[',I,J,']='); Readln(m1[I,J]);
Begin
Writeln('Matrica',l);
For D:= 1to m doBeginFor C:= 1to n doBegin
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: arrayof real;
m, n: integer);
var i, j: integer;
beginfor i := 0to pred(m) dobeginfor j := 0to 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: arrayof real;
m, n: integer);
var i, j: integer;
beginfor i := 0to pred(m) dobeginfor j := 0to pred(n) do
write(mx[i * n + j]:5:2);
writeln;
end;
end;
procedure sort(var mx: arrayof real;
m, n: integer; in_col: integer; by: boolean);
var
T: real;
i, j: integer;
beginfor i := 1to m dofor j := m downto i + 1Doif (mx[(in_col) + pred(j - 1) * n] >
mx[(in_col) + pred(j) * n]) = by thenbegin
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: arrayof real;
m, n: integer);
var
rows, cols, count: integer;
before_last, s: real;
beginfor cols := 0to pred(n) dobegin
s := 0; count := 0;
for rows := 0to pred(m) doif odd(rows + 1) thenbegin
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
Огромное спасибо!!! Потараюсь до конца разобраться.
infiniti
20.05.2007 22:20
VOLVO! Cпасибо огромное!!! Вчера добавил еще одну матрицу, все работает. Но не все понятно. С процедурой принт все ясно, а вот дальше Что обозначено за in_col? Что такое by: boolean? Нам такое не давали. rows - ряды, cols-столбцы,count-счетчик - так? И напишите, пожалуйста где что считается
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.