
Пусть задан массив Аi={34, 16, 16, 2, 2, 0, -4, -4}, фрагмент программы L:=1; r:=n; flag:=false;
Repeat m:=(l+r)div 2; if a[m]>key then l:=m+1 else if a[m]=key then flag:=true else r:=m-1; until flag or (l>r); Чему будет равно значение переменной m после выполнения цикла, при key=-4?

Ответы на вопрос

т.к. n заранее не дано(и это все лишь фрагмент кода) то m при разных n будет получаться разный. n лежит в промежутке [-2;8]
потому, что тут m:=(l+r)div 2; при n<-2 получается индекс <0
и при n>8 в цикле индекс >7
а массив у нас всего 8 элементов
Поэтому в цикле я вывел все значения m при всех возможных значениях n
Надеюсь понятно объяснил.
при n=-2 m=0
при n=-1 m=0
при n=0 m=0
при n=1 m=1
при n=2 m=2
при n=3 m=3
при n=4 m=4
при n=5 m=5
при n=6 m=6
при n=7 m=6
при n=8 m=6
Pascal
var
a:array [0..7] of integer = (34, 16, 16, 2, 2, 0, -4, -4);
l, n, m, key, r:integer;
flag:boolean;
begin
for n:=-2 to 8 do begin
key:=-4;
L:=1;
r:=n;
flag:=false;
Repeat
m:=(l+r)div 2;
if a[m]>key then
l:=m+1
else
if a[m]=key then
flag:=true
else
r:=m-1;
until flag or (l>r);
writeln('при n=',n,' m=', m);
end;
end.




Для понимания значения переменной m после выполнения цикла, необходимо проанализировать код.
В данном фрагменте программы используется алгоритм бинарного поиска, предполагая, что массив a[] уже отсортирован в порядке убывания (с учетом условия l:=1; r:=n;).
Переменная key задает значение, которое мы ищем в массиве. В данном случае key=-4.
В начале цикла устанавливаются начальные значения для переменных l, r и flag. Затем выполняется цикл, пока flag равен false и l не станет больше r.
На каждой итерации цикла значение m вычисляется как среднее между l и r (m:=(l+r)div 2). Затем происходит проверка условий.
- Если a[m] > key, то мы знаем, что значение key находится во второй половине массива, поэтому устанавливаем l:=m+1 для сужения диапазона поиска.
- Если a[m] = key, то мы нашли искомый элемент, поэтому устанавливаем flag:=true, и цикл прекращается.
- Если a[m] < key, то мы знаем, что значение key находится в первой половине массива, поэтому устанавливаем r:=m-1 для сужения диапазона поиска.
Цикл продолжается до тех пор, пока flag равен false и l не станет больше r.
В данном случае, при key=-4, первое условие (a[m] > key) не выполняется ни на одной итерации цикла, так как все значения в массиве меньше -4.
При первой итерации цикла: l=1, r=8, m=(1+8)div 2=4. Так как a[4]=2 < key=-4, выполняется ветвь "else r:=m-1", и значение r становится равным 3.
При второй итерации цикла: l=1, r=3, m=(1+3)div 2=2. Так как a[2]=16 > key=-4, выполняется ветвь "if a[m]>key then l:=m+1", и значение l становится равным 3.
Теперь условие l > r не выполняется, поэтому цикл прекращается.
Таким образом, после выполнения цикла значение переменной m будет равно 2.


Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili