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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2011, 01:15   #1
Антон Лысенко
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 181
По умолчанию паскаль. Функции. Ошибка, не переходит по метке

у меня выводится сообщение что элемент не найден вместе с сообщением элемент найден. Почему не осуществляется переход по метке?
Код:
function SearchEl(var el:integer;a:mas):integer;
  var k,nm,vm:integer;
  label stop;
    begin
     nm:=1; vm:=m;
      repeat
           k:=(nm+vm)div 2;
             if el=a[k] then
                goto stop
             else
               if el<a[k] then
                  vm:=k-1
               else
                  nm:=k+1
      until(nm>vm);
          writeln('element not found!');
          stop: SearchEl:=k
    end;
Антон Лысенко вне форума Ответить с цитированием
Старый 25.02.2011, 08:39   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

начнём с начала - это жутчайший код, он же индусский код, да и другие синонимы есть!
1) метка (и переход) здесь даром не нужна!!

2) после того, как выдастся "element not found" будет возращено какое-то значение K - ведь следующим оператором после writeln идёт SearchEl:=k
Откуда вызывающая программа узнает, что ничего не нашлось?!

3) старайтесь не использовать глобальных переменных в процедурах/функциях.
Раз уж Вы массив передаёте в параметры функции, так и размерность его (которая m - тоже логично передать)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.02.2011, 11:11   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Интересно а что за задание...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.02.2011, 15:20   #4
Антон Лысенко
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 181
По умолчанию

Ну я переделал на такое
Код:
function SearchEl(var el:integer;a:mas):integer;
  var k,nm,vm:integer;
  label stop;
    begin
     nm:=1; vm:=m;
      repeat
           k:=(nm+vm)div 2;
             if el=a[k] then
                goto stop
             else
               if el<a[k] then
                  vm:=k-1
               else
                  nm:=k+1
      until(nm>vm);
          stop: SearchEl:=k
    end;
Код:
  writeln('Enter the desired element');
  readln(el);
  if SearchEl(el,a)>0 then
  writeln('Element is found. Its index =',SearchEl(el,a))
  else
  writeln('element not found!');
покажите более компактный и рациональный код для поиска элемента. Буду учится на примерах.

Последний раз редактировалось Stilet; 25.02.2011 в 15:53.
Антон Лысенко вне форума Ответить с цитированием
Старый 25.02.2011, 15:54   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
код для поиска элемента
Э-э-э это что иммитация бинарного поиска? Что за задание?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.02.2011, 15:56   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Интересно а что за задание...
походу это поиск методом половинного деления в отсортированном массиве.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 25.02.2011, 15:57   #7
Антон Лысенко
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 181
По умолчанию

найти элемент массива с помощью бинарного поиска.
Антон Лысенко вне форума Ответить с цитированием
Старый 25.02.2011, 18:44   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вам сюда, сударь: http://www.programmersforum.ru/showt...288#post729288
Ваш метод мне никак не нравится...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.02.2011, 20:27   #9
Антон Лысенко
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 181
По умолчанию

Во-первых, это не мой метод, а Г.Г.Рапакова и С.Ю.Ржеуцкой.
Во-вторых, я просмотрел много примеров бинарного поиска, то этот был самым доступным и понятным.
В третьих, вот программа которая правильно работает на том коде, что находится в закрытой теме. Только там всё логично, если число меньше середины, то и верхняя граница опускается до середины. Одно отличие, что та программа линейная. Так что ошибка может быть связана с описанием функций.
Код:
program Odnom_mas;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const m=15;
  var mass:array[1..m]of real;
      n,i:integer;
      min,max:real;
      imin,imax:integer;
      flag:integer;
      c:real;
      count:integer;
      x:real;
      ng,vg,t:integer;
      label
           m1;
begin
  write('Ukagite fakticheskiy rasmer massiva:');
  readln(n);
  writeln('vvedite ',n,'elementov massiva:');
  for i:=1 to n do
   read(mass[i]);
   writeln('Bil prinyat massiv:');
   for i:=1 to n do
    write(mass[i]:6:2);
    min:=mass[1];
    max:=mass[i];
    for i:=2 to n do
    begin
     if min>mass[i] then
      begin
      min:=mass[i];
      imin:=i;
      end;
       if max<mass[i] then
       begin
       max:=mass[i];
       imax:=i;
        end
      end;
      writeln;
      writeln('min=',min:6:2,'imin=',imin:2,' max=',max:6:2,'imax=',imax);
       repeat
        flag:=0;
         for i:=1 to n-1 do
          if  mass[i]>mass[i+1] then
           begin
            c:=mass[i];
            mass[i]:=mass[i+1];
            mass[i+1]:=c;
            flag:=1;
           end
        until(flag=0);
       writeln('massiv posle sortirovki:');
       for i:=1 to n do
       write(mass[i]:6:2);
       writeln;
       count:=0;
       for i:=1 to n do
        if round(mass[i]) mod 2=0 then
         count:=count+1;
       writeln('kolichestvo chetnix elementov massiva:',count);

      //Поиск элемента 
     
       writeln('vvedite iskomoe chislo: ');
        readln(x);
        ng:=1; vg:=n; flag:=0;
          repeat
          t:=(ng+vg) div 2;
           if x=mass[t] then
            begin
            flag:=1;
            write('element naiden,ego index=',t);
            goto m1;
          end
           else
           if x<mass[t] then
           vg:=t-1
            else
             ng:=t+1
           until(ng>vg);
           writeln('iskomiy element otsutstvuet v massive');
           m1:readln;
           readln
end.
Антон Лысенко вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прицел переходит в курсор Lotles Компьютерное железо 0 14.12.2010 22:00
msWord как заменить текст по метке Paskal1 Общие вопросы Delphi 0 25.10.2010 12:45
Ошибка в функции Richard22 Общие вопросы Delphi 1 16.05.2010 13:02