• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Не работает программа, как исправить? Паскаль

Регистрация
31 Май 2014
Сообщения
16
Реакции
0
Баллы
0
Не работает программа, как исправить? Паскаль

Нужно написать программу с бинарным поиском в упорядоченном по убыванию массиве, и высчитать временную сложность алгоритма. Но программа не работает, ошибка в процедуре 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.
 
Он не находит число в массиве, всегда пишет, что такого элемента нет. Так же данную запись и временную сложность он показывает по несколько раз. Паскаль ABC
 
Он не находит число в массиве, всегда пишет, что такого элемента нет.
Естественно. Потому что массив у Вас отсортирован по убыванию, а поиск построен для массива, отсортированного по возрастанию. Короче говоря, в строке
поменяйте знак неравенства.
 
Нужно, что бы массив был по убыванию. Как исправить процедуру поиска, что бы она был под убывающий массив?
 
Как исправить процедуру поиска, что бы она был под убывающий массив?
Ничего не понимаю! Я же только что написал, как. Хорошо, повторю:
вместо строки

if a[m] > key then

записать

if a[m] < key then

чего ж тут неясно?
 
Хотя нет: Снимок.webp
 
Преподаватели требуют
Да уж понятно, что не студенческая инициатива - изучать эти допотопные алгоритмы для ламповых ЭВМ.
В общем, так. Нарисовал я тестовую программку в своем Free Pascal, работает безупречно, сверьте. А за возможные глюки этого (не при дамах будь сказано) АВС я не отвечаю.
Код:
Const
 n=10;
 a:Array [1..n] of Integer=(89,9,7,6,5,4,3,3,2,1);

var
 i,l,r,m,key:integer;

begin       
 write('   i: ');
 for i:=1 to n do write(i:4);
 writeln;
 write('a[i]: ');
 for i:=1 to n do write(a[i]:4);
 writeln;
 writeln;
 writeln;
 repeat
  write('Key (0 to exit) = ');
  readln(key);
  if key<>0 then
   begin
    l:=1;
    r:=n+1;
    While l<r-1 do
     begin
      m:=(l+r) div 2;
      if a[m]<key then
       begin
        r:=m;
       end
      else
       begin
        l:=m;
       end;
     end;
    if a[l]=key then WriteLn('i= ',l)
    else writeln('No such elements in the array');
    writeln;
   end;
 until key=0;
end.
 

Вложения

  • FP01.webp
    FP01.webp
    9 KB · Просмотры: 38
Назад
Сверху