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

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

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

 
 Ответить  Открыть новую тему 
> Бинарный поиск. Помогите найти ошибку
сообщение
Сообщение #1





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

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


Помогите найти ошибку. Нужно сгенерировать массив, отсортировать его, а затем бинарным поиском найти заданное число a. Все сделал, но результат поиска всегда один и тот же - "такого нет". Что не так?

program x3;
uses crt;
const n=20;
var m: array [1..n] of integer;
found: boolean;
a,i,fst,lst: integer;
k,j: integer;
begin
clrscr;
randomize;
begin
for i:=1 to n do
m[i]:=random(20);
for i:=1 to n do
write(m[i],' ');
readln;
begin
for i:=2 to n do
for j:=n downto i do
if m[j-1]<m[j] then begin
k:=m[j]; m[j]:=m[j-1];
m[j-1]:=k;
end;
end;
end;
write('otsortirovan:');readln;
for i:=1 to n do
write(m[i],' ');
readln;
writeln('vvedite chislo ot 0 do 20'); readln(a);
begin
fst:=1; lst:=n; found:=false;
repeat
i:=(fst+lst) div 2;
if m[i]=a then found:=true
else if m[i]<a then fst:=i+i
else lst:=i-1
until(found) or (fst>lst); end;
if found=true then writeln ('nomer iskomogo elementa',i)
else writeln('takogo net');
readln;
end.


Про теги не забывай

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


Гость






Обязательно велосипед изобрести?
Выкладывали ведь уже: Бинарный (двоичный) поиск
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Ищущий истину
******

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

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


uses
crt;
const
n=19;
type
telem = integer;
arrtype= array[0..n] of telem;
var
m: arrtype;
found: boolean;
k,j,a_search,i,fst,lst: integer;
begin
{ инициализация ... }
randomize;
for i:=0 to n do begin
m[i]:=random(20);
write(m[i],' ')
end;
writeln(chr(10)+chr(13)+'press enter...');
readln;
{ сортировка пузырьком ...}
for i:=0 to n-1 do
for j:=i+1 to n do
if m[j-1]>m[j] then begin {знак!!!}
k:=m[j];
m[j]:=m[j-1];
m[j-1]:=k;
end;
write('Sort: ');
for i:=0 to n do write(m[i],' '); writeln;
writeln('Enter number ');
readln(a_search);
{ поиск ... }
fst:=0; lst:=n; found:=false;
repeat
i:=(fst+lst) div 2;
if (m[i]=a_search) then
found:=true
else begin
if (m[i] < a_search) then
fst:=i+1 {ВНИМАНИЕ ЗДЕСЬ БЫЛА ОШИБКА i вместо 1 !!!}
else
lst:=i-1
end;
until (found=true) or (fst>lst);
if (found=true) then
writeln ('number = ',i+1) {+1 потому что массив от 0 у нас...}
else writeln('Not found!');
readln;
end.

У тебя были ошибки в программе. Самая главная - i вместо 1.

(добавил позже)
p.s. у предыдущей программы проблеммы с сортировкой, я немного изменил программу, разбив ее логически на процедуры.
Так она нагляднее и легче сопровождается.
uses
crt;
const
n=20;
type
telem = integer;
arrtype= array[1..n] of telem;

Procedure Bubble(Var ar: arrType; n: integer);
Var
i, j, T: Integer;
Begin
For i := 1 To n Do
For j := n DownTo i+1 Do
If ar[Pred(j)] > ar[j] Then { < }
Begin
T := ar[Pred(j)]; ar[Pred(j)] := ar[j]; ar[j] := T
End
End;

Function Bin_Search (m:arrtype; n:integer; a_search: telem) : integer;
var
i,fst,lst : integer;
found : boolean;
begin
fst:=0; lst:=n; found:=false;
repeat
i:=(fst+lst) div 2;
if (m[i]=a_search) then
found:=true
else begin
if (m[i] < a_search) then
fst:=i+1 {ВНИМАНИЕ ЗДЕСЬ БЫЛА ОШИБКА i вместо 1 !!!}
else
lst:=i-1
end;
until (found=true) or (fst>lst);
if (found = true) then bin_search := i+1 else bin_search := -1;
end;

procedure print_arr(a:arrtype; n:integer);
var
i:integer;
begin
for i:=1 to n do write(a[i],' '); writeln
end;

procedure init_arr (var a:arrtype; n:integer);
var
i:integer;
begin
randomize;
for i:=1 to n do a[i]:=random(20);
end;

var
m: arrtype;
result,a_search,i: integer;

begin
init_arr(m,n);
print_arr(m,n);

writeln(chr(10)+chr(13)+'press enter...');
readln;

bubble(m,n);

write('Sort: ');
print_arr(m,n);

writeln('Enter number ');
readln(a_search);
{ поиск ... }

result:=bin_search(m,n,a_search);

if (result > 0) then
writeln ('number = ',result)
else writeln('Not found!');
readln;
end.

p.s. а вообще Вольво прав, используй FAQ....
мне просто не с чем было кофе утром пить вот и "закусил" твоей программой..

Сообщение отредактировано: volvo -


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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