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

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

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

 
 Ответить  Открыть новую тему 
> Использование функции в качестве параметра другой функции
сообщение
Сообщение #1


Новичок
*

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

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


Для двух заданных целочисленных массивов К и М разной длины составить процедуру, формирующую третий массив L из элементов массива М, не совпадающих ни с одним из элементов массива f(K1), f(K2)...f(Kn), где n - длина массива К.
На основе этой процедуры сформировать массив из тех элементов строк целочисленной матрицы А, начиная со второй строки, значения которых не совпадают со значениями квадратов элементов первой строки матрицы А.

Помогите, пожалуйста, как в составлении процедуры, так и в применении её к матрице. Заранее огромное спасибо.

Добавлено через 16 мин.
Есть версия программы, но она работает крайне некорректно: условие, по-моему, соблюдается, лишь для третьего столбца матрицы.

Очень надеюсь на вашу помощь.


program pr14;

const
N = 3;

type
Str = array [1..N] of integer;
Func = function (X: integer): integer;

var
A: array [1..N] of Str;
B: array [1..(N*N-N)] of integer;
L: integer;
i, j: integer;

procedure Proc(f: Func; K, M: array of integer; var L: array of integer; var len: integer);
var
i, j: integer;
b: boolean;
begin
for i := 0 to High(M) do begin
b := false;
for j := 0 to High(K) do b := ( M[i] = f(K[j]) );
if not b then begin
L[len] := M[i];
len := len + 1;
end;
end;
end;

function fc(X: integer): integer;far;
begin
fc := Sqr(X);
end;

begin
writeln('vvedite postro4no matricu 3x3');
for i := 1 to N do
begin
for j := 1 to N do read(A[i,j]);
readln;
end;
L := 0;
for i := 2 to N do Proc(fc, A[1], A[i], B, L);
if L > 0 then
for i := 1 to L do WriteLn('B[', i, '] = ', B[i]);
ReadLn;
end.



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


Гуру
*****

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

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


Первое, что бросилось в глаза: у тебя массивы описаны от 1, а перебираются с 0.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Цитата
массивы описаны от 1, а перебираются с 0.
Open Arrays всегда индексируются с нуля, независимо от того, как описан фактический буффер...

Добавлено через 11 мин.
taran,
а вот условие записано неверно: у тебя действительно будет рассматриваться только последний столбец, потому что в B надо результат накапливать (для всех сравнений), а не просто присваивать результат последнего сравнения. Ну, скажем:

procedure Proc(f: Func; K, M: array of integer; var L: array of integer; var len: integer);
var
i, j: integer;
b: boolean;
begin
for i := 0 to High(M) do begin
b := true;
for j := 0 to High(K) do b := b and ( M[i] <> f(K[j]) );
if b then begin
L[len] := M[i];
len := len + 1;
end;
end;
end;
вот так ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

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

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


Спасибо большое. Только разъясните, пожалуйста, что значит вот это:

b := b and ( M[i] <> f(K[j]) )


Я не очень понял, в каком случае какое значение присваивается b.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






В этом случае значение B будет содержать результат, отсутствует ли число M[ i ] в 1-ой строке матрицы... А используется здесь тот факт, что true and true = true, и {что угодно} and false = false.

Смотри: изначально b = true, то есть, считаем, что число отсутствует в первой строке (повторяю, b содержит именно признак отсутствия, а не присутствия)... Теперь проходим по всей первой строке и квадрат каждого элемента сравниваем с нашим числом. Пока
M[ i ] <> {квадрату очередного элемента}
, все в порядке, это неравенство возвращает True, старое значение B тоже True, их "логическое произведение (and)" тоже True, что и записывается в B как его новое значение... А вот как только неравенство, приведенное выше НЕ выполнилось (а значит, один из квадратов-таки равен M[ i ]), получится что B = true (старое значение B) and false (результат неравенства) = false ...

Вот и все, теперь что бы не случилось дальше, B навсегда "ложно", потому что нельзя сделать False and (что-то) и получить True... Результат гарантированно продержится до конца цикла, потом проверяем B, и если оно все-таки не изменилось (а осталось = True), значит, неравенство всегда выполнялось => число M[ i ] не равно ни одному из квадратов...
 К началу страницы 
+ Ответить 

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

 





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