Консультация № 176421
31.01.2010, 21:31
0.00 руб.
0 15 3
Добрый вечер,пожалуйста помогите решить одну вот такую задачу:
Получить массива В из массива А,удалением n-й строки и к-го столбца


Обсуждение

Неизвестный
31.01.2010, 21:46
общий
А как заполнять исходную матрицу, как задавать ее ранг? Далее все понятно
Неизвестный
31.01.2010, 22:35
общий
это ответ
Здравствуйте, angel.nero.
Я так понял, вам надо из двумерного массива удалить n столбец и k стлобец, а правельнее будет сказать, удалить их из матрицы. Для этого надо удалить из массива все элементы с индексами: [n,i], где i изменяется от 1 до N_str (N_str - кол-во строк) и элементы с индексами [j,k], где j изменяется от 1 до K_st (K_st - кол-во столбцов). Следует учесь, что при удалении размерность массива (матрицы) уменьшится и станет равной (N_str-1)*(K_st-1). Поэтому предлагаетю следующий алгоритм:
1) Удаляем строку n. Для этого сдвигаем все строки массива M с индексом строки i>=n на еденицу влево.
2) Удаляем столбец. Для этого сдвигаем все стролбцы массива M с индексом стлбца j>=k на еденицу влево.
3) По желанию обнуляем последюю строку и столбец массива с индексами строки и столбца равными соответственно N_str и K_st
Всё это на языке паскаль будет выглядеть так:
//удаление строки--------------------
for i:=n to N_str do
for j:=1 to K_st do M[i,j]:=M[i+1,j]; //сдвиг в лево строк
//удаление столбца-----------------
for i:=1 to N_str-1 do //так как из матрицы уже удалена одна строка, то их число можно взять равны N_str-1
for j:=k to K_st-1 do M[i,j]:=M[i,j+1]; //сдвиг в лево столбцов
//Обнуление последних строк и столбца:
for j:=1 to K_st do M[N_str,j]:=0; //обнуление строки
for i:=1 to N_str do M[i,K_st]:=0; //обнуление столбца
//конец
При выводе следует учесть что размерность массива (матрицы) уменьшилась и стала равной (N_str-1)*(K_st-1). Соответственно обнуление последних элементов строки и столбца можно
давно
Мастер-Эксперт
319965
1463
01.02.2010, 11:56
общий
riaman:
Наверно все же должно быть два массива - A и B и элементы массива A нужно записывать в массив B.
Неизвестный
01.02.2010, 14:59
общий
Наверное вы правы, star9491. Смотря какие цели приследуются. Если просто учебные, то да, лучше со вторым массивом и навернон это проще. А если пишется рабочая программа, то исходя из задач. Может в поставленной задаче не надо будет сохранять исходную матрицу, тогда в целях экономии ресурсов, лучше использовать одни массив. Потом, в предложенном мною варианте удаление происходит из самой матрицы, а не создается копия, что более точно соответстует поставленной задаче - именно удалить из..., а не создать новую без...
давно
Мастер-Эксперт
319965
1463
01.02.2010, 17:30
общий
это ответ
Здравствуйте, angel.nero.

Как мне показалось, что по смылу задачи в ней должнв фигурировать два массива A и B. Поэтому я решил написать второй вариант.
Пусть массив A имеет размер m на s и, соответственно массв B - размер m-1 на s-1. Тогда массив B можно получить следующим образом:

for i:=1 to m-1 do
for j:=1 to s-1 do
if (i<n)and(j<k) then b[i,j]:=a[i,j]
else if j<k then b[i,j]:=a[i+1,j]
else b[i,j]:=a[i+1,j+1];
Неизвестный
01.02.2010, 18:19
общий
03.02.2010, 19:15
это ответ
Можно так:
Смотрите приложение.

Приложение:
const
n=5; m=5;
var i,j,k,l,ii,jj:integer;
a: array [1..n,1..m] of integer; {матрица NxM}
b: array [1..n-1,1..m-1] of integer;

begin
randomize;
ii:=1; jj:=1;
repeat {защита против "дурака": k д.б. <= n, а l д.б. <= m}
writeln('Enter k < ',n+1);
readln(k);
writeln('Enter l < ',m+1);
readln(l);
until ((k<=n) and (l<=m));
writeln('Massiv a:');
for i:=1 to n do
begin
for j:=1 to m do
begin
a[i,j]:=random(10); {заполняем матрицу случайными значениями}
write(a[i,j]:4); {выводим матрицу A}
end;
writeln;
end;
writeln('Massiv b:');
for i:=1 to n do
begin
for j:=1 to m do
begin
if (i<>k) and (j<>l) then
begin
b[ii,jj]:=a[i,j];
write(b[ii,jj]:4);
inc(jj);
if (jj>m-1) then {переход на новую строку...}
begin
inc(ii); jj:=1; writeln;
end;
end;
end;
end;
readln;
end.
Неизвестный
01.02.2010, 18:52
общий
Добрый вечер,уважаемые эксперты!Задавать исх.матрицу необходимо с клавиатуры.Цели учебные,поэтому лучше два массива
Неизвестный
01.02.2010, 19:07
общий
angel.nero:
С клавиатуры заполнять так:
for i:=1 to n do
for j:=1 to m do
read(a[i,j]);

И в своем ответе(Ответ № 259133) я использую как раз два массива. Просто замените случайный ввод, на ввод с клавиатуры. Хотя imho это долго и неудобно.
давно
Мастер-Эксперт
319965
1463
02.02.2010, 14:33
общий
angel.nero:
Наверно удобнее при вводе отмечать индексы массива, например:
for i:=1 to m do
for j:=1 to s do
begin
Write('a[',i,',',j,']=');
Readln(a[i,j]);
end;
давно
Профессионал
304622
583
03.02.2010, 14:05
общий
Лейла:
А вы сами-то свою прогамму запускали навыполнение?!! Она нерабочая -- "Range check error"! А в алгоритме две грубые ошибки как минимум.
давно
Старший Модератор
31795
6196
03.02.2010, 16:36
общий
Код:
for i:=1 to m-1 do
for j:=1 to n-1 do
b[ i , j ]:=a[ i + ord( k<=i ), j + ord( l <= j )];


Так по моему кравсивее, но работать не будет в PascalABC.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
03.02.2010, 16:39
общий
Лейла:
Код:
for i:=1 to n do
begin
for j:=1 to m do
begin
if (i<>k) and (j<>l) then {если это не k-ая строка и не l-ый столбец}
begin
b[ii,jj]:=a[i,j]; {занесем значение в массив b}
write(b[ii,jj]:4); {по ходу выводим матрицу Б}
inc(ii); inc(jj);
end;
end;
writeln;
end;

Подумайте над выделеными строками.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
03.02.2010, 19:09
общий
Зенченко Константин Николаевич:
Ну, и бред я написала. inc(ii); inc(jj); Если jj>m-1 нужно переходить на новую строчку
Замените мою программу, пожалуйста, на эту
Код:
const
n=5; m=5;
var i,j,k,l,ii,jj:integer;
a: array [1..n,1..m] of integer; {матрица NxM}
b: array [1..n-1,1..m-1] of integer;

begin
randomize;
ii:=1; jj:=1;
repeat {защита против "дурака": k д.б. <= n, а l д.б. <= m}
writeln('Enter k < ',n+1);
readln(k);
writeln('Enter l < ',m+1);
readln(l);
until ((k<=n) and (l<=m));
writeln('Massiv a:');
for i:=1 to n do
begin
for j:=1 to m do
begin
a[i,j]:=random(10); {заполняем матрицу случайными значениями}
write(a[i,j]:4); {выводим матрицу A}
end;
writeln;
end;
writeln('Massiv b:');
for i:=1 to n do
begin
for j:=1 to m do
begin
if (i<>k) and (j<>l) then
begin
b[ii,jj]:=a[i,j];
write(b[ii,jj]:4);
inc(jj);
if (jj>m-1) then {переход на новую строку...}
begin
inc(ii); jj:=1; writeln;
end;
end;
end;
end;
readln;
end.
Неизвестный
03.02.2010, 19:13
общий
Сергей Бендер:
Ну, одна ошибка была. Я бы ее сразу заметила, если бы мой компилятор выдал мне Range check error
давно
Профессионал
304622
583
04.02.2010, 09:43
общий
Лейла:
Цитата: 302450
Я бы ее сразу заметила, если бы мой компилятор выдал мне Range check error


Дык! Меню Options -> Compiler и в разделе Runtime errors включаем пунктик Range checking (да и остальные три тоже). Настоятельно рекомендуется в учебных задачах.

(И не забыть ещё Options -> Save.)
Форма ответа