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

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

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

 
 Ответить  Открыть новую тему 
> Задача с матрицами, Прошу помощи в решении.
сообщение
Сообщение #1


Новичок
*

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

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


Проблема не дающая заснуть уже четвертый день:
Дана целая матрица размера nxm. Для каждой строки матрицы найти сумму четных элементов и произведение нечетных. Результаты оформить в виде матрицы (nx2). В полученной матрице упорядочить (переставить) строки по возрастанию второго элемента в строке.
Буду признателен за любую помощь.

Сообщение отредактировано: jetman -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


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

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

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


А что уже готово, какие моменты неопнятны/не получаются ? Вот загляни в наш FAQ по массивам и матрицам, может найдешь ответы на свои вопросы : http://forum.pascal.net.ru/index.php?showtopic=2694


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


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

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

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


На усмотрение модератора выкладываю свое решение, захотелось отвлечься и решил сделать задачу :p2:

код временно скрыт... Пусть автор сначала скажет что у него конктретно не получается. админ.

вырезанно



Сообщение отредактировано: Altair -


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


Ищущий истину
******

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

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


АВТОР ПРОГРАММЫ: klem4
uses crt;
const
n=3;
m=4;
type

TArr = array[1..n, 1..m] of integer;

var
arr : TArr;

result : TArr;

t : byte;

procedure InitArray(var x : TArr);
const
rnd = 11;
var
i,j : byte;
begin
randomize;
for i := 1 to n do
for j := 1 to m do
x[i,j] := random(rnd);
end;

procedure PrintArray(x : TArr ; sizeN, sizeM : byte);
var
i,j : byte;
begin
for i := 1 to sizeN do begin
writeln;
for j := 1 to sizeM do
write(x[i,j] : 2, ' ');
end;
writeln;
end;

function Addition(x : TArr; i : byte) : integer;
var
j : byte;
S : integer;
begin

s := 0;
j := 2;

while(j<=m) do begin
inc(s, x[i,j]);
inc(j, 2);
end;

Addition := s;

end;

function Multiplication(x : TArr; i : byte) : integer;
var
j : byte;
p : integer;
begin

p := 1;
j := 1;

while(j<=m) do begin
p := p*x[i,j];
inc(j, 2);
end;

Multiplication := p;

end;

procedure SortResult(var x : TArr);
var
i,temp : byte;
flag : boolean;
begin

flag := false;

repeat

flag := true;

for i := 1 to n-1 do
if not(x[i, 2]>=x[succ(i), 2]) then begin

flag := false;

temp := x[i, 1];
x[i, 1] := x[succ(i), 1];
x[succ(i), 1] := temp;

temp := x[i, 2];
x[i, 2] := x[succ(i), 2];
x[succ(i), 2] := temp;

end;

until flag;

end;

Begin

clrscr;

InitArray(arr);

PrintArray(arr, n, m);

for t := 1 to n do begin
result[t, 1] := Addition(arr, t);
result[t, 2] := Multiplication(arr, t);
end;

PrintArray(result, n, 2);

SortResult(result);

PrintArray(result, n, 2);

readln;
End.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

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

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



program test;
uses crt;
Const
NN=10;
MM=10;
type
TElem = integer;
Matrix = array[1..NN,1..MM] of integer;
Procedure ReadMatr(var A:Matrix; var n,m:word );
var
i,j:word;
begin
clscr;
repeat
write('Enter stroks: '); readln(N)
until (N>0) and (N<=NN);
repeat
write('Enter stolbs: '); readln(M)
until (M>0) and (M<=MM);
For i:=1 to n do
begin
For j:=1 to m do
begin
write('A[',i,j,']= ');
readln(A[i,j])
end
end
end;
begin

For i:=1 to n do
begin
For j:=1 to m do
begin
if i mod 2 = 0 then
...........................


Первый момент: неясно как Для каждой строки матрицы найти сумму четных элементов и произведение нечетных.

Procedure PrintMatr(A:Matrix; n,m:word);
Var
i,j:word;
begin
For i:=1 to n do
begin
For j:=1 to m do write(A[i,j],' ');
writeln
end
end;
var
n,m:word;
a:matrix;
Begin
Readmatr(a,n,m);
PrintMatr(a,n,m);3
readln;
end.


А второй: как результаты оформить в виде матрицы (nx2). В полученной матрице упорядочить (переставить) строки по возрастанию второго элемента в строке.
В общем-то получается что ничего неясно... Сделал я похоже в своей жизни вторую ошибку. unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Еще один вариант, более простой и, по-моему, более правильно интерпретирующий условие (пока тоже скрыто) :
uses crt;
const
n=3;
m=4;
type
TVec = array[1 .. m] of integer;
TArr = array[1 .. n] of TVec;


procedure InitArray(var x : TArr);
var i, j : byte;
begin
randomize;
for i := 1 to n do
for j := 1 to m do
x[i, j] := random(11);
end;

procedure PrintArray(x : TArr ; sizeN, sizeM : byte);
var i, j : byte;
begin
for i := 1 to sizeN do begin
writeln;
for j := 1 to sizeM do
write(x[i,j]: 2, ' ');
end;
writeln;
end;

function Addition(x : TArr; i : byte) : integer;
var
j : byte;
S : integer;
begin
s := 0;
for j := 1 to m do
if not odd(x[i, j]) then
inc(s, x[i, j]);
Addition := s;
end;

function Multiplication(x : TArr; i : byte) : integer;
var
j : byte;
p : integer;
begin
p := 1;
for j := 1 to m do
if odd(x[i, j]) then
p := p * x[i, j];
Multiplication := p;
end;

procedure SortResult(var x : TArr);
var
i: byte;
flag: boolean;
T: TVec;
begin
flag := false;
repeat

flag := true;
for i := 1 to n-1 do
if x[i, 2] < x[succ(i), 2] then begin
flag := false;
T := x[i]; x[i] := x[succ(i)]; x[succ(i)] := T
end;

until flag;
end;

var
arr, _result : TArr;
t: byte;

Begin
clrscr;
InitArray(arr);
PrintArray(arr, n, m);

for t := 1 to n do begin
_result[t, 1] := Addition(arr, t);
_result[t, 2] := Multiplication(arr, t);
end;

PrintArray(_result, n, 2);
SortResult(_result);
PrintArray(_result, n, 2);
readln;
End.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Цитата(jetman @ 19.10.2005 10:06)
Первый момент: неясно как Для каждой строки матрицы найти сумму четных элементов и произведение нечетных.

const m = ...; n = ...;
{ a - сама матрица, i - номер строки, в которой искать сумму }
function sum(a: matrix; i: byte): integer;
var j, s: integer;
begin
s := 0;
for j := 1 to m do
if not odd(a[i, j]) then inc(s, a[i, j]);
sum := s;
end;
Для умножения - аналогично...

Цитата(jetman @ 19.10.2005 10:06)
как результаты оформить в виде матрицы (nx2). В полученной матрице упорядочить (переставить) строки по возрастанию второго элемента в строке.

Посмотри FAQ: Методы сортировок
и заодно вот это: FAQ: Как задать матрицу, чтобы быстро поменять местами ее строки
Этого должно хватить.

Цитата(jetman @ 19.10.2005 10:06)
Сделал я похоже в своей жизни вторую ошибку.  unsure.gif
"Не сразу Москва строилась" (С)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

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

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


:fire: :help:
Я в тупике (точнее тупик в моей голове) :ypr: . Ну не могу я написать эту :ryg: программу. Мож чего не догнал :orangun: И так еще раз и попорядку:
1. Мне надо ВВЕСТИ матрицу в память (точно вот так):

program test;
uses crt;
const
NN=10;
MM=10;
type
TElem = integer;
Matrix = array[1..NN,1..MM] of integer;
Procedure ReadMatr(var A:Matrix; var n,m:word );
var
i,j:word;
begin
clrscr;
repeat
write('Enter stroks: '); readln(N)
until (N>0) and (N<=NN);
repeat
write('Enter stolbs: '); readln(M)
until (M>0) and (M<=MM);
For i:=1 to n do
begin
For j:=1 to m do
begin
write('A[',i,j,']= ');
readln(A[i,j])
end
end
end;



2.Для каждой строки матрицы найти сумму четных элементов и произведение нечетных.

Сумма ЧЕТНЫХ:

function sum(a: matrix; i: byte): integer;
var j, s, n: integer;
begin
s := 0;
for j:= 1 to n do
if odd(a[i, j]) then inc(s, a[i, j]);
sum := s;
end;



Произведение НЕЧЕТНЫХ:

function umn(a: matrix; i: byte): integer;
var j, r, n: integer;
begin
r := 0;
for j:= 1 to n do
if not odd(a[i, j]) then (r, a[i, j])*(r, a[i,j]);
umn := r;
end;



3. Вывести s и r виде матрицы матрицы (nx2). В полученной матрице упорядочить (переставить) строки по возрастанию второго элемента в строке.

???



В итоге если это правильно написать и составить по пунктам 1, 2, 3 должно работать, но как это сделать не понятно???
:help:
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






jetman, во-первых, посмотри пост №6 (я его только что открыл, раньше ты его не мог видеть, ну и пост №4 заодно...), а во вторых:
function umn(a: matrix; i: byte): integer;
var j, r, n: integer;
begin
r := 0; { <-- Здесь первая ошибка !!! }
for j:= 1 to n do
if not odd(a[i, j]) then (r, a[i, j])*(r, a[i,j]); { <-- Вторая ошибка !!! }
umn := r;
end;

Первая ошибка: после того, как ты R присвоил 0, неважно, что ты будешь делать дальше, у тебя произведение ВСЕГДА будет равно 0... Нулем инициализируется переменная при сложении; при умножении надо инициализировать единицей...

Вторая: (r, a[i, j])*(r, a[i,j]) ... blink.gif Что бы этим хотел сделать? Вот так находится произведение:
...
if not odd(a[i, j]) then r := r * a[i, j];
...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

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

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


Я конечно дико извиняюсь unsure.gif , но ведь приведенные вами программы работают по принципу случайных чисел, а мне (как я понял) нужно вводит матрицу самому (вручную) или я опять чего-то непонял blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Ну, так замени
     x[i,j] := random(11);
на
begin
write('x[', i, ',', j, '] = '); readln(x[i,j]);
end;
в процедуре InitArray...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

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

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



program test;

uses crt;

const

n=5; {Должен ведь ограничивать максимальный размер матрицы,

m=5; но почему то этого не делает}

type

TVec = array[1 .. m] of integer;

TArr = array[1 .. n] of TVec;

procedure InitArray(var x : TArr);

var i, j, m, n : byte;

begin

clrscr;

repeat

begin;

write('Enter lines quantity, please: ');

readln(n);

end;

until (n>0) and (n<=n);

repeat

begin

write('Enter columns quantity, please: ');

readln(m)

end

until (m>0) and (m<=m);

for i := 1 to n do

for j := 1 to m do

begin;

write('x[', i, ',', j, '] = '); readln(x[i,j]);

end;

end;

procedure PrintArray(x : TArr ; sizeN, sizeM : byte);

var i, j : byte;

begin

for i := 1 to sizeN do begin

writeln;

for j := 1 to sizeM do

write(x[i,j]: 2, ' ');

end;

writeln;

end;

function Addition(x : TArr; i : byte) : integer;

var

j : byte;

S : integer;

begin

s := 0;

for j := 1 to m do

if not odd(x[i, j]) then

inc(s, x[i, j]);

Addition := s;

end;

function Multiplication(x : TArr; i : byte) : integer;

var

j : byte;

p : integer;

begin

p := 1;

for j := 1 to m do

if odd(x[i, j]) then

p := p * x[i, j];

Multiplication := p;

end;

procedure SortResult(var x : TArr);

var

i: byte;

flag: boolean;

T: TVec;

begin

flag := false;

repeat

flag := true;

for i := 1 to n-1 do

if x[i, 2] < x[succ(i), 2] then begin

flag := false;

T := x[i]; x[i] := x[succ(i)]; x[succ(i)] := T

end;

until flag;

end;

var

arr, _result : TArr;

t: byte;

Begin

clrscr;

InitArray(arr);

PrintArray(arr, n, m);

for t := 1 to n do begin

_result[t, 1] := Addition(arr, t);

_result[t, 2] := Multiplication(arr, t);

end;

writeln('Interval result');

PrintArray(_result, n, 2);

writeln('Final result');

SortResult(_result);

PrintArray(_result, n, 2);

writeln('Press enter for exit');

readln;

End.



Получилось вот так, но есть одна проблема лишние нули (и как я понимаю неверный результат).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Цитата(jetman @ 21.10.2005 6:08)
{ Должен ведь ограничивать максимальный размер матрицы, но почему то этого не делает}

:yes: Должен... При условии, что ты будешь матрицу вводить, как положено! Смотри внимательно:
procedure InitArray(var x : TArr);
var i, j, m, n : byte;
begin
clrscr;
repeat
(*
begin;
{ Это лишнее: Repeat ... Until сами являются операторными скобками }
*)

write('Enter lines quantity, please: '); readln(n);

(*
end;
{ Это тоже, соответственно }
*)
until (n>0) and (n<=n);
{
А вот теперь объясни мне, с каким именно N здесь: (n <= N)
происходит сравнение??? Это условие выполнится ВСЕГДА!
n = n в любом случае (ты работаешь с одним и тем же числом,
т.к. локальная переменная перекрывает глобальную)...
}

... { дальше - то же самое... }
end;
Вывод: никогда не давай локальным переменным тех же имен, что и глобальным... Вот правильный вариант InitArray:
program test;
uses crt;
const
_n=5; _m=5;

type
TVec = array[1 .. _m] of integer;
TArr = array[1 .. _n] of TVec;

var
m, n: integer;

procedure InitArray(var x : TArr);
var
i, j: byte;
begin
clrscr;
repeat
write('Enter lines quantity, please: '); readln(n);
until (n>0) and (n<=_n);

repeat
write('Enter columns quantity, please: '); readln(m)
until (m>0) and (m<=_m);

for i := 1 to n do
for j := 1 to m do begin;
write('x[', i, ',', j, '] = '); readln(x[i,j]);
end;
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

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

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


smile.gif Все работает, поверить не могу, ОГРОМНОЕ Вам человеческое спасибо volvo, klem4, altair
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 29.04.2024 18:49
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name