Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Не работает программа, как исправить? Паскаль (http://www.tehnari.ru/f41/t96680/)

Эффект массы 31.05.2014 11:31

Не работает программа, как исправить? Паскаль
 
Нужно написать программу с бинарным поиском в упорядоченном по убыванию массиве, и высчитать временную сложность алгоритма. Но программа не работает, ошибка в процедуре poisc. Не знаю как исправить.
Код:

program pro1;
uses op,obrabotki;
var a:mas;
    n,key:integer;
begin
vvod(a,n);
writeln('Исходный массив');
vivod(a,n);
sort(a,n);
writeln('После сортировки');
vivod(a,n);
write(' Введите число:');
poisc(a,n);
end.

Код:

unit obrabotki;

interface
uses op;
procedure vvod(var a:mas; var n:integer);
procedure vivod (a:mas;n:integer);
procedure sort(var a:mas;n:integer) ;
procedure poisc(a:mas;n:integer);

implementation

procedure vvod(var a:mas;var n:integer);
var i:integer;
begin
writeln ('Введите количество элементов');
readln(n);
writeln('Введите элементы:');
for i:=1 to n do
Readln(a[i]);
end;

procedure vivod (a:mas;n:integer);
var i:integer;
begin
for i:=1 to n do write(a[i]:4);
writeln;
end;

procedure sort(var a:mas;n:integer) ;
var i, temp, n_min : integer;
begin
temp:=0;
for i :=1 to n do begin
for n_min :=1 to n do begin
if a[i] > a[n_min] then begin
temp:= a[i];
a[i]:= a[n_min];
a[n_min]:=temp;
end;

end;

end;
end;

procedure poisc(a:mas;n:integer);
var
  i,l,u,r,m,key:integer;
  begin
  l := 1;
    r := n + 1;
    u:=0;
    inc(u,2);
    readln(key);
    While l < r - 1 do
    begin
      m := (l + r) div 2;
      inc(u);
      if a[m] > key then
      begin
      r := m;
      inc(u,2);
      end
        else
        begin
        l := m;
        inc(u,2);
    end;
    begin
    if a[l] = key then WriteLn(l)
   
    else writeln('Данных элементов нет в массиве');
    end;
    writeln('Временная сложность: ',u);

end;
end;
end.

Код:

unit op;
interface
type mas=array [1..10000] of integer;
implementation
end.


Эффект массы 31.05.2014 11:32

Он не находит число в массиве, всегда пишет, что такого элемента нет. Так же данную запись и временную сложность он показывает по несколько раз. Паскаль ABC

Vladimir_S 31.05.2014 18:42

Цитата:

Сообщение от Эффект массы (Сообщение 1036447)
Он не находит число в массиве, всегда пишет, что такого элемента нет.

Естественно. Потому что массив у Вас отсортирован по убыванию, а поиск построен для массива, отсортированного по возрастанию. Короче говоря, в строке
Цитата:

if a[m] > key then
поменяйте знак неравенства.

Эффект массы 31.05.2014 19:53

Нужно, что бы массив был по убыванию. Как исправить процедуру поиска, что бы она был под убывающий массив?

Vladimir_S 31.05.2014 20:00

Цитата:

Сообщение от Эффект массы (Сообщение 1036553)
Как исправить процедуру поиска, что бы она был под убывающий массив?

Ничего не понимаю! Я же только что написал, как. Хорошо, повторю:
вместо строки

if a[m] > key then

записать

if a[m] < key then

чего ж тут неясно?

Эффект массы 31.05.2014 20:04

Vladimir_S. Туплю, все заработало. Спасибо

Vladimir_S 31.05.2014 20:07

Цитата:

Сообщение от Эффект массы (Сообщение 1036563)
все заработало

Ну и славно. :)

Эффект массы 31.05.2014 20:08

Вложений: 1
Хотя нет:Вложение 187282

Vladimir_S 31.05.2014 20:12

Цитата:

Сообщение от Эффект массы (Сообщение 1036566)
Хотя нет:

Ох, до чего не охота в это дело влезать: и кому сейчас нужны эти бинарные поиски? Ладно, посмотрю. Только уж с временными сложностями сами разбирайтесь, ладно?

Эффект массы 31.05.2014 20:18

Преподаватели требуют


Часовой пояс GMT +4, время: 09:05.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.