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

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

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

 
 Ответить  Открыть новую тему 
> Не получается в матрице удалять отдельные элементы.помогите, может другой подход нужен?
Евгения141294
сообщение 18.08.2013 15:36
Сообщение #1





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

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


Требуется разработать алгоритм и программу расчета матрицы содержащей в себе все четные числа другой матрицы. Размер матрицы задан 6*6

У меня получилось только оставить четные числа,а как составить матрицу содержащую только четные другой не могу понять как сделать((




Program lr4;
uses crt;
const n=6;

type matrA = array[1..n, 1..n] of integer;
matrB = array[1..n, 1..n] of string;
matrC = array[1..n, 1..n] of string;
Var
i,j,S:integer;
V:string;
a:matrA;
b:matrB;
c:matrC;

procedure vvod;
var i,j:integer;
begin
textattr:=green;
gotoxy (20,4);
writeln ('Ввведите элемент массива :');
for i:=1 to n do
begin
for j:=1 to n do
begin

textattr:=yellow;
write ('A[',i,',',j,']=');
read (A[i,j]);

S:=A[i,j];
Str (S,V);
C[j,i]:=V;
B[j,i]:=C[j,i];
end;
end;
end;
function chot:integer;
begin
chot:=A[i,j];
end;

begin

clrscr;
vvod;

for i:=1 to n do
begin
for j:=1 to n do
begin
if A[i,j] mod 2 <> 0 then
B[i,j]:=' '
else
begin
A[i,j]:=chot;
S:=A[i,j];
Str(S,V);
B[i,j]:=V;
end;

end;
end;


clrscr;
gotoxy (1,9);
for i:=1 to n do
begin
for j:=1 to n do
begin
write (A[i,j]);
write (' ');
end;
writeln ('');
end;
readln;

gotoxy(1,20);
for i:=1 to n do
begin
for j:=1 to n do
begin
write (B[i,j]:3);
write (' ');
end;
writeln ('');
end;
readln;
end.


Сообщение отредактировано: Евгения141294 - 18.08.2013 15:55
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 18.08.2013 19:15
Сообщение #2


Бывалый
***

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

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


А можно привести полностью условие задачи так, как оно записано в методичке.
Я просто не могу понять, что делать с нечётными числами. Да и с чётными тоже непонятно.

Предположим, что чётные остаются на своих местах, а нечётные заменяются на число 1.

Тогда прога может выглядеть так:

var
A, B : matrA; <------ пусть обе матрицы будут целочисленными
..................................
begin
{ввод исходных даных}
vvod; <------- исправленная подпрограмма с учётом другого типа матрицы B
{обработка}
for i:=1 to n do
for j:=1 to n do
if Odd(A[i, j]) then <------ Odd(x) эквивалент x mod 2 <> 0
B[i, j]:=1
else
B[i, j]:=A[i, j];
{вывод результатов}
for i:=1 to n do
begin
for j:=1 to n do
Write(B[i, j]:4);
WriteLn; <------ можно так вместо WriteLn('')
end;
end.


Или же нужно построить новую матрицу, состоящую из имеющихся чётных чисел. Например, в исходной матрице 6x6 содержится 21 чётное число. Из этих 21 чисел можно организовать матрицу 3x7.

В общем, что нужно-то получить в итоге?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Евгения141294
сообщение 19.08.2013 15:52
Сообщение #3





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

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


нужно новую матрицу сформировать ,что бы она содержала только четные числа первой матрицы

примерно вот так думаю:
Прикрепленное изображение


только я не совсем понимаю как это сделать(

Сообщение отредактировано: Евгения141294 - 19.08.2013 15:54
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 20.08.2013 6:10
Сообщение #4


Бывалый
***

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

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


Ну, такую "матрицу" можно "заполнить" очень просто
  for i:=1 to n do
begin
for j:=1 to n do
if NOT Odd(A[i, j]) then
Write(A[i, j]:4);
WriteLn;
end;


Но мы же понимаем, что это не матрица.

Т.к. исходного условия я от тебя не дождался, то могу фантазировать. Давай сформируем результирующую матрицу по следующему принципу:
- просматриваем всю матрицу A и в список EvenList сохраняем только чётные числа из неё
- после завершения просмотра у нас есть список EvenList и количество чётных чисел EvenNum
- если EvenNum=0, то завершаем программу с сответствующим собщением
- У нас есть число EvenNum, и мы можем его перебором всех комбинаций разложить на два множителя Nb и Mb. Эти множители и будут размерностью новой матрицы B. Можно даже постараться отдать приоритет квадратным матрицам, задав критерий не только Nb*Mb=EvenNum, но и (Nb+Mb)->min - очевидно, что сумма сторон квадратной матрицы меньше чем у прямоугольной.
- теперь у нас есть и список чётных и размерность новой матрицы - заполняем её.

Вуаля. Выводим результат - матрицу B.

Для приведённого на твоём скриншоте примера результат будет:
Код
   2   4   6   8
   8   6   4   2
   2   4   6   8
   4   0   2   4


Пробуешь?
Подкину фрагмент для поиска Nb и Mb
  Nb:=1;
Mb:=EvenNum;
for i:=2 to round(sqrt(EvenNum)+1) do
if EvenNum mod i = 0 then
begin
j:=EvenNum div i;
if (i+j)< (Nb+Mb) then
begin
Nb:=i;
Mb:=j;
end;
end;

И ещё, чтобы при отладке не водить матрицу, можно задать её константой
const
n = 6;

type
matrA = array[1..n, 1..n] of integer;

const
A : matrA =
(
(1, 2, 3, 4, 5, 6),
(7, 8, 9, 9, 8, 7),
(6, 5, 4, 3, 2, 1),
(1, 2, 3, 4, 5, 6),
(9, 8, 7, 4, 5, 0),
(1, 2, 3, 5, 4, 7)
);
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Евгения141294
сообщение 20.08.2013 9:31
Сообщение #5





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

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


я просто не нашла условие задачи,как в методичке))
так я поняла ))
спасибо большое,я попробую

а если мы сохранили четные числа в список, как заполнить им матрицу В?


Сообщение отредактировано: Евгения141294 - 20.08.2013 11:25
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 20.08.2013 12:41
Сообщение #6


Бывалый
***

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

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


Например, по-порядку следования в списке. С 1 по Nb - первая строка матрицы, с (Nb+1) по 2*Nb - вторая строка матрицы...
  for i:=1 to Nb do
for j:=1 to Mb do
B[i, j]:=EvenList[(i-1)*Nb+j];


--------------------------------
Прошу прощения. Строка матрицы, конечно же от 1 до Mb. И
  for i:=1 to Nb do
for j:=1 to Mb do
B[i, j]:=EvenList[(i-1)*Mb+j];


Сообщение отредактировано: Федосеев Павел - 20.08.2013 18:15
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Евгения141294
сообщение 22.08.2013 12:45
Сообщение #7





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

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


Так вроде бы работает,кроме одного
Я когда сохраняю в список,он у меня как то частично сохраняет,ошибка где-то?


begin
EvenNum:=0;
for i:=1 to n do
begin
for j:=1 to n do
begin
if not Odd(A[i,j]) then
(EvenList[i]):=A[i,j];
if not Odd(A[i,j]) then
EvenNum:=EvenNum+1;
end;
end;
for i:=1 to EvenNum do
begin
write (EvenList[i]);
end;
writeln;
writeln (EvenNum);


Сообщение отредактировано: Евгения141294 - 22.08.2013 13:04
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
-Федосеев Павел-
сообщение 22.08.2013 21:30
Сообщение #8


Гость







...............
if not Odd(A[i, j]) then
begin
EvenList[EvenNum]:=A[i, j];
EvenNum:=EvenNum+1;
end;


 К началу страницы 
+ Ответить 
-Федосеев Павел-
сообщение 22.08.2013 21:41
Сообщение #9


Гость






Вернее, наоборот

for i:=1 to n do
for j:=1 to n do
if not Odd(A[i, j]) then
begin
EvenNum:=EvenNum+1;
EvenList[EvenNum]:=A[i, j];
end;
if EvenNum=0 then
begin
WriteLn('Чётных чисел в матрице нет.');
Halt;
end;
 К началу страницы 
+ Ответить 
Евгения141294
сообщение 23.08.2013 19:36
Сообщение #10





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

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


А если у меня четных чисел например 17 ?
он мне строкой выдаёт эти 17 чисел
вот что у меня получилось

Program lr4;
uses crt;
const n=6;

type matrA = array[1..n, 1..n] of integer;
matrB = array[1..n, 1..n] of integer;


Var
i,j,EvenNum,Nb,Mb:integer;

EvenList:array[1..36] of integer;
a:matrA;
b:matrB;


procedure vvod;
var i,j:integer;
begin
textattr:=green;
gotoxy (20,4);
writeln ('‚ўҐ¤ЁвҐ н«Ґ¬Ґ­в ¬ ббЁў :');
for i:=1 to n do
begin
for j:=1 to n do
begin

textattr:=yellow;
write ('A[',i,',',j,']=');
read (A[i,j]);
end;
end;
end;


begin

clrscr;
vvod;
EvenNum:=0;
for i:=1 to n do
begin
for j:=1 to n do
begin
if not Odd(A[i,j]) then
begin
EvenNum:=EvenNum+1;
EvenList[EvenNum]:=A[i,j];
end;
end;
end;

if EvenNum=0 then
begin
WriteLn('Чётных чисел в матрице нет.');
Halt;
end;

writeln;
writeln (EvenNum);

Nb:=1;
Mb:=EvenNum;
for i:=2 to round(sqrt(EvenNum)+1) do
if EvenNum mod i = 0 then
begin
j:=EvenNum div i;
if (i+j)< (Nb+Mb) then
begin
Nb:=i;
Mb:=j;
end;
end;

For i:=1 to Nb do
for j:=1 to Mb do
B[i,j]:=EvenList[(i-1)*Mb+j];

for i:=1 to Nb do
begin
for j:=1 to Mb do
begin
write (B[i,j]:3);
write (' ');
end;
writeln ('');
end;


readln;
readln;
end.




Сообщение отредактировано: Евгения141294 - 23.08.2013 19:43
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 23.08.2013 20:49
Сообщение #11


Бывалый
***

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

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


Значит получится матрица 1x17 - из одной строки.
Боюсь, что уточнение формулировки условия ты получишь при защите лабы. Но у тебя есть задатки - подправишь прогу на месте.

Ещё, как говорят комивояжёры, "товар вдогонку"...
Могу порекомендовать использовать форматтеры исходных текстов для паскаля перед сдачей преподавателю. Рекомендую JCF (Jedy Code Format) - именно им я обработал твой исходник для лучшего понимания.

PS У тебя в компиляторе выключены опции проверки на корректность диапазона - поэтому прога не завершилась аварийно. Добавь в начале программы строку {$R+} и увидишь "вылет" на результате 1х17

const
nn = n*n;
type
massA = array [1..nn] of integer; <------ удобнее описать все типы, а потом их использовать.

type
matrB = array [1..n, 1..nn] of integer; <------ именно nn - мы ведь можем получить 2x17 или 1x31

var
i, j : integer;
EvenNum : integer; {количество чётных чисел в исходной матрице}
EvenList: massA;
Nb, Mb : integer; {размерность новой матрицы}
A : matrA;
B : matrB;

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 20.07.2025 0:32
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"