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

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

Форум «Всё о Паскале» _ Задачи _ Замена элементов матрицы

Автор: ZanakZ 17.12.2007 16:36

Нужно решить задачу :

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

Заранее спасибо.

Автор: Ozzя 17.12.2007 16:57

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

Автор: Гость 17.12.2007 17:22

Цитата(Ozzя @ 17.12.2007 12:57) *

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

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

Автор: Айра 17.12.2007 17:40

Цитата
Заменить нулями в матрице

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

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

Автор: ZanakZ 18.12.2007 1:20

Цитата(Айра @ 17.12.2007 13:40) *

a[i,j]:=0;

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

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

Автор: Айра 18.12.2007 3:01

Основной цикл должен выглядить примерно так:


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 18.12.2007 3:11

Цитата
не получается включить в него отрицательные числа
Это невозможно... Множества могут хранить только значения в диапазоне 0 .. 255

Автор: Айра 18.12.2007 3:30

Цитата
Это невозможно...

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

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

Автор: volvo 18.12.2007 3:46

Можно, кто мешает поэлементно проверять наличие во множестве и вывод элемента, если он там есть? Почитай вот тут: http://volvo71.narod.ru/faq_folder/set_type.htm

Автор: ZanakZ 19.12.2007 4:32

Цитата(Айра @ 17.12.2007 23:30) *

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

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

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

Автор: Айра 19.12.2007 10:46

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

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

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

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

Автор: ZanakZ 19.12.2007 17:06

Цитата(Айра @ 19.12.2007 6:46) *

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

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

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

У меня почему-то всегда выводится 0. :-((

Автор: volvo 19.12.2007 17:15

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

Автор: Айра 19.12.2007 17:17

Цитата
У меня почему-то всегда выводится 0. :-((

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

Автор: ZanakZ 19.12.2007 17:37


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 19.12.2007 18:05

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

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

Еще один совет: компилируй программы с {$R+} в первой строке, это поможет тебе выявлять некоторые ошибки...

Автор: ZanakZ 6.01.2008 6:24

Всё запускается! Большое спасибо! rolleyes.gif