Задача на бинарный поиск
Результаты соревнования по прыжкам в длину представлены списком фамилий и массивом результатов 25 участников, упорядоченным в порядке занятых мест. Бинарным поиском определить фамилию спортсмена прыгнувшего 6 метров.
Здарова! Помогите начинающему программисту решить задачу бинарным поиском.
Результаты соревнования по прыжкам в длину представлены списком фамилий и массивом результатов 25 участников, упорядоченным в порядке занятых мест. Бинарным поиском определить фамилию спортсмена прыгнувшего 6 метров.
a:=1;b:=n;{Индексы начала и конца куска поиска}
repeat
m:=(a+b)div 2;
if x[m]>xx then
b:=m
else if x[m]<xx then
a:=m
else
begin
a:=m;
b:=m;
end
until (x[m]=XX)or(a>=b) do
Примерно так
Написал программу, выдает ошибки
подскажите, что неправильно.
Var
C:array [1..25] of real;
a,b:real;
m,n:integer;
begin
writeln ('Введите размер массива');
readln (m);
a:=1;
b:=n;
repeat
m:=(a+b)div 2;
If C[m]>25 then
b:=m
else if C[m]<25 then
a:=m
else
begin
a:=m;
b:=m;
end
until (C[m]=25) or (a>=b) do
write ('C[m]=',C[m]);
readln(C[m]);
end.:)
А как ругается-то?
Вот такую вот фигню выкидывает и ставит курсор после div 2.
Ну а вобще-то с первого взгляда программа нормально написана?
a и b должны быть целые, они же индексы!!!
Кстати, где у тебя задаются элементы массива?
и, еще раз кстати, у меня там описка: не x[m], а m
И еще вопрос: А что такое n ?
Var
C:array [1..25] of real;
a,b,m,n:integer;
begin
writeln ('Введите размер массива');
readln (m);
a:=1;
b:=n;
repeat
m:=(a+b)div 2;
If m>25 then
b:=m
else if m<25 then
a:=m
else
begin
a:=m;
b:=m;
end
until (m=25) or (a>=b) do
write ('C[m]=',C[m]);
readln(C[m]);
end.
I:=1;
While (i<=m) do
Begin
Write (‘C(‘,i,’)=’);
Readln(C;
i:=i+1
End;
Кстати, ошибку после do все равно выкидыввает.
А как ввести элементы массива в моем случае? Я организовал дополнительный цикл
I:=1;
While (i<=m) do
Begin
Write (‘C(‘,i,’)=’);
Readln(C;
i:=i+1
End;
Кстати, ошибку после do все равно выкидыввает.
do после repeat надо убрать.
Кстати, чем тебя не устраивает цикл for при вводе?
n - число элементов(25 в твое случае)
do после repeat надо убрать.
Кстати, чем тебя не устраивает цикл for при вводе?
n - число элементов(25 в твое случае)
Вот опять исправил, какая-то фигня
программа запускается, но после ввода последнего элемента ничего не происходит.
Как мне здесь написать что надо найти шестиметрового прыгуна?
И еще, если n - число элементов, то что тогда m?
Ввод элементов можно и через for сделать, только какая разница?
Var
C:array [1..25] of real;
a,b,m,n:integer;
begin
writeln ('Введите размер массива');
readln (m);
i:=1;
while (i<=m) do
begin
write(‘C(‘,I,’)=’);
readln(C);
i:=i+1;
end;
a:=1;
b:=n;
repeat
m:=(a+b)div 2;
If m>25 then
b:=m
else if m<25 then
a:=m
else
begin
a:=m;
b:=m;
end
until (m=25) or (a>=b);
write ('C[m]=',C[m]);
readln(C[m]);
end.
C:array [1..25] of real;
Лучше всегда делать [0..24]
writeln ('Введите размер массива');
readln (m);
Зачем тебе размер? Он же не динамический
b:=n;
Где ты задаешь N? По умалчанию оно 0, но лучше задавай явно
Наверное, здесь у тебя и ошибка, т.к в первом шагу у тебя m = (1 + 0) div 2 = 0 и во втором if у тебя a = b = 0, и цикл заканчивается