Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите понять смысл функции 
V
    Опции темы
Kruger2
Дата 17.1.2011, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



Код

/*Двоичный поиск в массиве*/

#include <stdio.h>
#define SIZE 15

int binarySearch(int [], int, int, int);
void printHeader(void);
void printRow(int[], int, int, int);

main ()
{
     int a[SIZE], i, key, result;
     
     for (i=0; i<=SIZE-1; i++)
         a[i] = 2 * i;
     
     printf("Enter a number between 0 and 28: ");
     scanf("%d", &key);
         
     printHeader();
     result = binarySearch(a, key, 0, SIZE - 1);
      
      if(result != -1)
         printf("\n%d found in array element %d\n", key, result);
      else 
         printf("\n%d not found\n", key);
         
         system("pause");
         return 0;                
     
}

int binarySearch(int b[], int searchKey, int low, int high)
{
    int middle;
    
    while (low <= high) {
          middle = (low + high) /2;
          
          printRow(b, low, middle, high);
          
          if (searchKey == b[middle])
             return middle;
          else if (searchKey < b[middle])
               high = middle - 1;
          else
          low = middle + 1; 
          }
    return -1;
    }
    
    /*Печатает заголовок для выводимых данных*/
    
void printHeader(void)
{
     
     int i;
     
     printf("\nSubscripts: \n");
     
     for (i = 0; i <= SIZE - 1; i++)
         printf("%3d ", i);
         
     printf("\n");
     
     for (i = 1; i <= 4 * SIZE; i++)
         printf("-");
         
     printf("\n");
}    

/*Выводит строку данных, показывающих часть массива, обрабатываемую в настоящее время*/
void printRow(int b[], int low, int mid, int high)
{
     int i;
     
     for (i =0; i <= SIZE - 1; i++)
         if (i < low || i > high)
            printf ("    ");
         else if (i == mid)
              printf("%3d*", b[i]);
         else 
              printf("%3d ", b[i]);
              
     printf("\n");
}


Не совсем понимаю что делает функция binarySearch

Код

int binarySearch(int b[], int searchKey, int low, int high)
{
    int middle;
    
    while (low <= high) {
          middle = (low + high) /2;
          
          printRow(b, low, middle, high);
          
          if (searchKey == b[middle])
             return middle;
          else if (searchKey < b[middle])
               high = middle - 1;
          else
          low = middle + 1; 
          }
    return -1;
    }


Low и High это встроенные команды? т.е. они действительно ищут наименьшее и наибольшее, либо в данном случае это просто переменные?

Код

 middle = (low + high) /2;

    
a [] {1, 2, 3, 4,5} (1+5)/2=3 значит лоу и хай это всё таки наименьшее и  наибольшее?

Код

if (searchKey == b[middle])
             return middle;
          else if (searchKey < b[middle])
               high = middle - 1;
          else
          low = middle + 1; 


Откуда взялся массив б мидл? и что он выводит?


Код

/*Выводит строку данных, показывающих часть массива, обрабатываемую в настоящее время*/
void printRow(int b[], int low, int mid, int high)
{
     int i;
     
     for (i =0; i <= SIZE - 1; i++)
         if (i < low || i > high)
            printf ("    ");
         else if (i == mid)
              printf("%3d*", b[i]);
         else 
              printf("%3d ", b[i]);
              
     printf("\n");
}


для чего тут служит цикл фор?





Что выводит программа я видел, запустил и увидел. Но каким образом выводится нижняя часть мне непонятно, поэтому прошу помочь понять этоsmile

Это сообщение отредактировал(а) Kruger2 - 17.1.2011, 18:33
PM MAIL   Вверх
mes
Дата 17.1.2011, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Kruger2 @  17.1.2011,  17:31 Найти цитируемый пост)
Low и High это встроенные команды? т.е. они действительно ищут наименьшее и наибольшее, либо в данном случае это просто переменные?

Цитата(Kruger2 @  17.1.2011,  17:31 Найти цитируемый пост)
 int low, int high)
{
    int middle;

просто переменные..

Добавлено через 1 минуту и 56 секунд
Цитата(Kruger2 @  17.1.2011,  17:31 Найти цитируемый пост)
a [] {1, 2, 3, 4,5} (1+5)/2=3 значит лоу и хай это всё таки наименьшее и  наибольшее?

при чем тут значения содержимого массива ? нужны ведь только его индексы.. 
т.е. (0+4) /2 = 2; smile

Добавлено через 3 минуты и 13 секунд
Цитата(Kruger2 @  17.1.2011,  17:31 Найти цитируемый пост)
Откуда взялся массив б мидл? и что он выводит?

b[middle] это одно из значений массива b[] , который был передан в функцию..

Добавлено через 6 минут и 36 секунд
Цитата(Kruger2 @  17.1.2011,  17:31 Найти цитируемый пост)
для чего тут служит цикл фор?

хм.. как для чего ? для того чтоб в определенном диапазоне проитерировать i, и в зависимости от его значения вывести нужное.. 


--------------------
PM MAIL WWW   Вверх
БелАмор
Дата 17.1.2011, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: нет
Всего: 17



Цитата(mes @  17.1.2011,  20:27 Найти цитируемый пост)
просто переменные..

А почему бы их не назвать просто параметрами функции?
PM   Вверх
Albor
Дата 18.1.2011, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(Kruger2 @  17.1.2011,  17:31 Найти цитируемый пост)
Не совсем понимаю что делает функция binarySearch

Данная функция осуществляет бинарный поиск (метод деления пополам) в массиве. Массив, в котором осуществляется поиск, должен быть отсортирован.
Не удивительно, что смысл не понятен. Прототип функции должен быть либо таким:
Код

int binarySearch(int * array,int size_array, int searchKey);
либо таким:
Код

int binarySearch(int * start_search,int * end_search, int searchKey);
Во втором случае можно организовать поиск на участке массива (можно и в первом случае такое сделать, но будет менее понятно). 
Возвращаемое значение может быть не индексом, а указателем на найденный элемент – чаще всего это удобнее, ведь ищем мы обычно для того, чтобы что-то сделать с этим элементом.

PM MAIL ICQ   Вверх
mes
Дата 18.1.2011, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(БелАмор @  17.1.2011,  20:34 Найти цитируемый пост)
А почему бы их не назвать просто параметрами функции? 

параметры бывают разными  smile в данном случае (в контексте того вопроса) главное, что это обычные переменные.. 
smile




--------------------
PM MAIL WWW   Вверх
Kruger2
Дата 18.1.2011, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



Цитата(mes @  17.1.2011,  20:27 Найти цитируемый пост)
Цитата(Kruger2 @  17.1.2011,  17:31 )
 int low, int high)
{
    int middle;

просто переменные..

Добавлено через 1 минуту и 56 секунд
Цитата(Kruger2 @  17.1.2011,  17:31 )
a [] {1, 2, 3, 4,5} (1+5)/2=3 значит лоу и хай это всё таки наименьшее и  наибольшее?

при чем тут значения содержимого массива ? нужны ведь только его индексы.. 
т.е. (0+4) /2 = 2; 


Но ведь ни переменной low ни high не присвоено никакое начальное значение, как она определяет, что является лоу, а что хай?




Цитата(mes @  17.1.2011,  20:27 Найти цитируемый пост)
Цитата(Kruger2 @  17.1.2011,  17:31 )
для чего тут служит цикл фор?

хм.. как для чего ? для того чтоб в определенном диапазоне проитерировать i, и в зависимости от его значения вывести нужное..  


Код

for (i =0; i <= SIZE - 1; i++)
         if (i < low || i > high)
            printf ("    ");
         else if (i == mid)
              printf("%3d*", b[i]);
         else 
              printf("%3d ", b[i]);


  if (i < low || i > high) если i меньше че лоу (опять таки непонятно чему равно это лоу? где его начальное значение?) И i больше хай (зачем и? мол i= middle? но чему равно мидл, если лоу+хай неизвестны и их надо разделить на 2?

else 
              printf("%3d ", b[i]);
есть условие, если >, <, и =, откуда ещё элс? третий вариант бывает?


if (searchKey == b[middle])
searchKey тоже не присвоено никакое значение, как он узнает, что он равен массиву б, в индексе middle, который мне тоже непонятно чему равен?

PM MAIL   Вверх
Albor
Дата 18.1.2011, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(Kruger2 @  18.1.2011,  14:32 Найти цитируемый пост)
Но ведь ни переменной low ни high не присвоено никакое начальное значение, как она определяет, что является лоу, а что хай?

Функция main(), вызывая binarySearch(), передаёт в неё параметры, в том числе и low и hight. Естественно, в main() эти переменные называются по другому, а внутри binarySearch() превращаются в low и hight. То же самое пороисходит и с массивом. Теперь понятно?
PM MAIL ICQ   Вверх
Kruger2
Дата 18.1.2011, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



Непонятно, что бы начать вычисления лоу и хай должны же быть чему то равны? ну какой то цифре или индексу?

а так получается чему то равно, но чему непонятно. откуда берутся данные для этой переменной? ведь какие то данные в первоначальных вычислениях должны быть?

Добавлено через 9 минут и 50 секунд
Код

int binarySearch(int b[], int searchKey, int low, int high)
{
    int middle;
    
    while (low <= high) {
          middle = (low + high) /2;
          
          printRow(b, low, middle, high);
          
          if (searchKey == b[middle])
             return middle;
          else if (searchKey < b[middle])
               high = middle - 1;
          else
          low = middle + 1; 
          }
    return -1;
    }


Объявили переменные low, high и middle 

пока лоу < хай 
middle = (low + high) /2;

т.е. берется случайно число лоу и случайно хай и сравнивается? так что ли?

вызываем функцию printRow


PM MAIL   Вверх
Albor
Дата 18.1.2011, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 2
Всего: 9



Цитата(Kruger2 @  18.1.2011,  15:09 Найти цитируемый пост)
Непонятно,

Я так понимаю - разбираемся чисто теоретически, дебаггер отсутствует?
Берём твой код и добавляем коментарии:
Код

main ()
{
     int a[SIZE], i, key, result;
     
     for (i=0; i<=SIZE-1; i++)
         a[i] = 2 * i;// заполняем массив
     
     printf("Enter a number between 0 and 28: ");// просим ввести число от 0 до 28
     scanf("%d", &key); // записываем это число в переменную key
         
     printHeader();
     result = binarySearch(a,// внутри функции массив a будет называться b, 
key, // в searchKey копируется значение key, 
0, // это значение будет присвоено переменной low
SIZE - 1); // переменной hight будет присвоено значение 14 (15-1)

      
      if(result != -1)
         printf("\n%d found in array element %d\n", key, result);
      else 
         printf("\n%d not found\n", key);
         
         system("pause");
         return 0;                
     
}


PM MAIL ICQ   Вверх
Kruger2
Дата 18.1.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



вооот, теперь понял, спасибоsmile
 smile  smile 
надо было раздел с функциями читать внимательнееsmile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0847 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.