Помощь - Поиск - Пользователи - Календарь
Полная версия: Замена элементов матрицы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
ZanakZ
Нужно решить задачу :

Даны целые числа a1,..,a10 , целочисленная квадратная матрица порядка n. Заменить нулями в матрице те элементы с четной суммой индексов, для которых имеются равные среди a1,..,a10 .

Заранее спасибо.
Ozzя
ZanakZ
А что не понятно в этой задаче?
Гость
Цитата(Ozzя @ 17.12.2007 12:57) *

ZanakZ
А что не понятно в этой задаче?

Непонятно, как заменить эти самые элементы и что такое 'равные среди a1,..,a10'.
Айра
Цитата
Заменить нулями в матрице

a[i,j]:=0;
Цитата
'равные среди a1,..,a10'.

допусти последовательность у тебя: 1,2,3,4,5,6,7,8,9,10, а элемент матрицы 2.. он равен одному из элементов последовательноти, значит заменяем его на 0 (если еще и индексы подходящие), а если эл-т матрицы =11, то, т.к. числа 11 в пол-ти нет, оставляем его в покое))
ZanakZ
Цитата(Айра @ 17.12.2007 13:40) *

a[i,j]:=0;

допусти последовательность у тебя: 1,2,3,4,5,6,7,8,9,10, а элемент матрицы 2.. он равен одному из элементов последовательноти, значит заменяем его на 0 (если еще и индексы подходящие), а если эл-т матрицы =11, то, т.к. числа 11 в пол-ти нет, оставляем его в покое))

А как это выглядит на примере? Объясните, пожалуйста, хотя бы в общих словах, как это делать, а то что-то непонятно...
Айра
Основной цикл должен выглядить примерно так:

var posl: array[1..n] of integer; //поcледовательность символов
l: boolean; // true, если элемент матрицы не равен эл-т посл-ти, false в противном случае
...
for i:=1 to n do
for j:=1 to n do
begin
l:=true;
k:=1;
if not odd(i+j) then
begin
while (k<=n) and l do
begin
if m[i,j]=posl[k] then
begin
m[i,j]:=0;
l:=false;
end;
inc(k);
end;
end;
end;


А если описать последовательность как множество, то цикл будет намного проще:

for i:=1 to n do
for j:=1 to n do
if (not odd(i+j)) and (m[i,j] in posl) then m[i,j]:=0; //если сумма индексов четная и эл-т входит в множество, то..


Правда у меня возникла проблема с описанием множества (я их еще не проходила wink.gif) - не получается включить в него отрицательные числа.. надо покопаться в FAQ'е..
volvo
Цитата
не получается включить в него отрицательные числа
Это невозможно... Множества могут хранить только значения в диапазоне 0 .. 255
Айра
Цитата
Это невозможно...

Жаль.. А еще я так поняла, что вывести элементы множества тоже нельзя?

to ZanakZ: значит при использовании множества числа последовательности могут быть только в диапазоне 0..255
volvo
Можно, кто мешает поэлементно проверять наличие во множестве и вывод элемента, если он там есть? Почитай вот тут: Множества
ZanakZ
Цитата(Айра @ 17.12.2007 23:30) *

Жаль.. А еще я так поняла, что вывести элементы множества тоже нельзя?

to ZanakZ: значит при использовании множества числа последовательности могут быть только в диапазоне 0..255

Понятно. У меня ещё один вопрос: а какую(ие) переменную(ые) мы выводим на экран в самом конце программы?
Айра
Цитата
У меня ещё один вопрос: а какую(ие) переменную(ые) мы выводим на экран в самом конце программы?

Ну, по идее, мы выводим нашу матрицу, только уже измененную..

..если делать первым способом, когда последовательность представлена массивом, можно вывести и его, для наглядности)))

добавлено: в принципе и при использовании множества можно вывести последовательность измененных элементов, почитай ссылку volvo..
ZanakZ
Цитата(Айра @ 19.12.2007 6:46) *

Ну, по идее, мы выводим нашу матрицу, только уже измененную..

..если делать первым способом, когда последовательность представлена массивом, можно вывести и его, для наглядности)))

добавлено: в принципе и при использовании множества можно вывести последовательность измененных элементов, почитай ссылку volvo..

У меня почему-то всегда выводится 0. :-((
volvo
Цитата
У меня почему-то всегда выводится 0.
Почему-то программы, при запуске которой "всегда выводится 0" не видно...
Айра
Цитата
У меня почему-то всегда выводится 0. :-((

К сожалению мои телепатические способности сейчас на нуле..
Выложи весь свой код smile.gif
ZanakZ

program pr5;
var posl: array[1..255] of integer;
m:array [1..25,1..25] of integer;
l: boolean;
i,j,k,n:integer;
begin
writeln ('vvedite elementy');
readln (n);
for i:=1 to n do
begin
writeln ('vvedite element posled n',i);
readln (posl[i]);
end;
for i:=1 to n do
for j:=1 to n do
begin
writeln ('vvedite elementy matritzy');
readln (m[i,j]);
l:=true;
k:=1;
if not odd(i+j) then
begin
while (k<=n) and l do
begin
if m[i,j]=posl[k] then
begin
m[i,j]:=0;
l:=false;
end;
inc(k);
end;
end;
end;
writeln (m[i,j],' ');
end.

.
Прошу строго не судить, я ещё новичок в Паскале.
volvo
Ноль у тебя выводится по одной простой причине: ты распечатываешь значение m[i, j] ПОСЛЕ того, как циклы и по I и по J уже закончились (вот они, проблемы неправильного форматирования исходников... Была бы "лесенка" - увидел бы сам сразу же, или вообще не совершил бы такой ошибки), при этом значения I и J считаются неопределенными, кстати...

Выводи матрицу ПОСЛЕ цикла заполнения полностью (а не один элемент).

Еще один совет: компилируй программы с {$R+} в первой строке, это поможет тебе выявлять некоторые ошибки...
ZanakZ
Всё запускается! Большое спасибо! rolleyes.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.