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