Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2014, 16:24   #1
Тетрадь
Пользователь
 
Регистрация: 03.11.2013
Сообщений: 37
По умолчанию Не работает программа, как исправить? Паскаль

Нужно написать программу с бинарным поиском в упорядоченном по убыванию массиве, и высчитать временную сложность алгоритма. Но программа не работает, ошибка в процедуре 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 op;
interface
type mas=array [1..10000] of integer;
implementation
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.
Тетрадь вне форума Ответить с цитированием
Старый 29.05.2014, 16:27   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Текст ошибки засекречен?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.05.2014, 16:32   #3
Тетрадь
Пользователь
 
Регистрация: 03.11.2013
Сообщений: 37
По умолчанию

Он не находит число в массиве, всегда пишет, что такого элемента нет. Так же данную запись и временную сложность он показывает по несколько раз.
Тетрадь вне форума Ответить с цитированием
Старый 29.05.2014, 19:00   #4
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
он показывает по несколько раз
Дык выкиньте свои writeln за цикл и будет по 1 разу показывать
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 29.05.2014, 20:41   #5
Тетрадь
Пользователь
 
Регистрация: 03.11.2013
Сообщений: 37
По умолчанию

Он не находит число в массиве, всегда пишет, что такого элемента нет.
Тетрадь вне форума Ответить с цитированием
Старый 31.05.2014, 14:08   #6
Тетрадь
Пользователь
 
Регистрация: 03.11.2013
Сообщений: 37
По умолчанию

Кто может помочь? сам не могу исправить
Тетрадь вне форума Ответить с цитированием
Старый 31.05.2014, 17:02   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Допустим я:
Код:
procedure poisc(a:mas;c:integer);
var b,i,stp,key:integer;
begin
 readln(key);
 b:=1;stp:=0;
 { Начинаем цикл пока разница между границами не будет равна 2 что
 скажет о том что искать больше нечего, т.е между граничными элементами
 уже ничего нет}
 while (c-b)>1 do begin
 {Это колво шагов для статистики}
   inc(stp);
   {Становимся посередине искомого подмассива}
   i:=b+(c-b) div 2;
   {если найден то выйти вернув номер найденого по порядку}
   if a[i]=key then begin writeln('Found ',key,' in ',i,'. Steps of Maya =',stp); break;;end;
   {иначе сравним}
   if a[i]<key then
    {Если искомое меньше центрального то сдвигаем верхнюю границу
    Считая что за центром искомого нет и быть не может}
    c:=i
   else
    {Иначе искомого нет слева от центра, тогда сдвигаем нижнюю границу}
    b:=i;
 end; writeln('done...');
end;
Взято отсюда:
http://www.programmersforum.ru/showt...288#post729288

Годится?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.05.2014, 17:07   #8
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Код:
type mas=array [1..10000] of integer;

var a:mas;
  n,key:integer;

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(m:mas;count:integer);
var
  it,i,first,last:integer;
  found:boolean;
begin
it:=0;
First := 1;
Last := n;
Found:=False; {Элемент не найден}
repeat {Повторять поиск}
I := (First + Last) div 2; {Разделить на две части}
if M[I] = key then Found:=True
else
begin
if M[I] > key then First := I+1 {Искать элемент в правой части}
else Last := I-1; {Искать элемент в левой части}
end;
it:=it+1; {Увеличить счетчик числа итераций}
until (Found) or (First>Last); {Завершить, если найдется искомый элемент или будет просмотрен весь массив}
if Found then Writeln('Искомый элемент ',key,' в массиве занимает ',I,'-ю позицию')
else
Writeln('В массиве нет искомого элемента ',key);
Writeln('Поиск выполнен За ',it,' итераций');
end;
begin
vvod(a,n);
writeln('Исходный массив');
vivod(a,n);
sort(a,n);
writeln('После сортировки');
vivod(a,n);
write(' Введите число:');
readln(key);
poisc(a,n);

end.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 31.05.2014, 17:26   #9
Тетрадь
Пользователь
 
Регистрация: 03.11.2013
Сообщений: 37
По умолчанию

Из 10 элементов он находит 6300 позицию элемента
Тетрадь вне форума Ответить с цитированием
Старый 31.05.2014, 17:32   #10
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

У меня нормально отработало
Изображения
Тип файла: jpg 2014-05-31 17-31-24 Free Pascal IDE.jpg (27.2 Кб, 125 просмотров)
ZX Spectrum-128 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает программа, как исправить? паскаль Тетрадь Помощь студентам 3 05.05.2014 15:41
помогите исправить ошибки в командной строке . программа не работает почему то((( Эльвира 4947 Операционные системы общие вопросы 0 17.12.2013 22:11
помогите исправить ошибки. программа не работает почему то Эльвира 4947 Помощь студентам 0 09.12.2013 16:54
Не работает функция click() в Opera, как исправить? Arassir JavaScript, Ajax 8 24.05.2012 16:34
Конструкция case of работает некорректно! Как исправить? SkAndrew Общие вопросы Delphi 6 06.04.2008 00:21