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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2008, 11:31   #1
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию bsearch в С++

Приведите, пожалуйста, пример работы со встроенной функцией bsearch в С. Никак не могу понять, какие у нее параметры

Последний раз редактировалось Иллидан; 24.04.2008 в 12:09.
Иллидан вне форума Ответить с цитированием
Старый 24.04.2008, 13:45   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Иллидан Посмотреть сообщение
Приведите, пожалуйста, пример работы со встроенной функцией bsearch в С. Никак не могу понять, какие у нее параметры
Интернет трещит по швам от количества примеров bsearch...
http://www.cplusplus.com/reference/c...b/bsearch.html
http://msdn2.microsoft.com/en-us/lib...bs(VS.71).aspx
http://opengroup.org/onlinepubs/0079...h/bsearch.html
B_N вне форума Ответить с цитированием
Старый 25.04.2008, 18:52   #3
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию

Спасибо, B_N. Ознакомился со всеми ссылками. Подскажите, как отсортировать массив структур по одному из полей с помощью встроенного qsort.
Код:
struct Monstr
{
int a;
int b;

};

Monstr vsadnik[10];
Мне надо отсортироваить этот массив по полю а, а потом применить бинарный поиск.
Иллидан вне форума Ответить с цитированием
Старый 25.04.2008, 19:20   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Ёлки-палки, ну на тех же страницах ссылки на qsort.... Они всегда идут рука об руку с bsearch.... Думаете, мой вариант будет сильно отличаться?
Код:
Перенёс пример ниже.

Последний раз редактировалось B_N; 25.04.2008 в 20:40.
B_N вне форума Ответить с цитированием
Старый 25.04.2008, 20:30   #5
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию

Спасибо. И еще один вопрос, если можно. Как сделать, что-бы bsearch просматривала не весь массив, а только диапазон, который я задам. Наример, [2..9]?
Иллидан вне форума Ответить с цитированием
Старый 25.04.2008, 20:34   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Иллидан Посмотреть сообщение
Спасибо. И еще один вопрос, если можно. Как сделать, что-бы bsearch просматривала не весь массив, а только диапазон, который я задам. Наример, [2..9]?
Передавайте в качестве стартового адреса massiv[2], а в качестве числа элементов (9-2). По-моему, вполне очевидно...
------------------------------------------
Держите, проще, пример целиком.
Код:
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

#define N 15

struct my_struct {
	long field_a;
	long field_b;
};

int compare( const void *elem1, const void *elem2 )
{
	return ((struct my_struct *)elem1)->field_a > ((struct my_struct *)elem2)->field_a 
		? 1 : (((struct my_struct *)elem1)->field_a < ((struct my_struct *)elem2)->field_a ? -1 : 0);
}

long main()
{
	long i;
	struct my_struct vector[N];
	struct my_struct test, *found;


	srand(time(NULL));
	for(i = 0; i < N ; printf("%2d | ", vector[i++].field_a = rand() % 100));
	puts("\n------------");

	test = vector[N >> 1];

	qsort(vector, sizeof(vector) / sizeof(*vector), sizeof(*vector), compare);

	for(i = 0; i < N ; printf("%2d | ", vector[i++].field_a));
	puts("\n------------");

	found = (struct my_struct *)bsearch(&test, vector, sizeof(vector) / sizeof(*vector), sizeof(*vector), compare);
	if(found) printf("'%d' found at 0x%p (vector[%d])\n", test.field_a, found, (found - vector));
	else printf("'%d' Not found\n", test.field_a);

	found = (struct my_struct *)bsearch(&test, &vector[2], (7 - 2), sizeof(*vector), compare);
	if(found) printf("'%d' found at 0x%p (vector[%d])\n", test.field_a, found, (found - vector));
	else printf("'%d' Not found\n", test.field_a);

	getchar();
	return 0;
}

Последний раз редактировалось B_N; 25.04.2008 в 20:39.
B_N вне форума Ответить с цитированием
Ответ


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