Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
// Упражнение на работу с указателями на функции
// ---------------------------------------------
// Требуется изменить функции, разработанные во
// втором упражнении таким образом, чтобы их можно
// было применить не только к целочисленным массивам.
// Подход к решению задачи следующий:
// - в функции вместо указателя на целочисленный массив
// передается указатель без типа (void *) реально
// указывающий на начало обрабатываемого массива
// и число, задающее размер элемента массива с тем,
// чтобы можно было по массиву перемещаться;
// - помимо этого добавляется еще один аргумент,
// являющийся указателем на функцию, вычисляющую
// условие, используемое в реализации алгоритма
// соответствующей функции (так, например, вместо
// 2-х функций для поиска минимума и максимума можно
// использовать одну функцию для поиска "лучшего"
// значения, а мера "хорошести" определяется другой
// функцией, указатель на которую передается в качестве
// аргумента)
// Для примера приведена заготовка для функции
// последовательного поиска
int search_seq(
void * arr, // В массиве, начинающемуся по адресу, задаваемому arr,
int elem_size, // размер элементов которого в байтах равен elem_size,
void * wanted, // ищем элемент с ключом (признаком), лежащем по адресу wanted,
int (*compare)(void *elem, void *key)) // осуществляя сравнение при помощи compare
{
int n=-1;
for(int i;i<(sizeof(arr)/sizeof(elem_size)-1);++i)
{
if ((*compare)(&arr[i],wanted)) n=i;
}
return n;
}
// Такую функцию можно будет применить для поиска,
// например, в символьной строке, задав функцию сравнения
int compare_char(void *c1, void *c2)
{
return *((char *)c1) == *((char *)c2);
}
// и, тогда...
#include <stdio.h>
int main()
{
char str[] = "Abracadabra"; // В этой строке...
char elem = 'd'; // ... ищем этот элемент
int n = search_seq(str, sizeof(char), &elem, &compare_char);
if(n < 0)
{
printf("Not found\n");
}
else
{
printf("Element has found at position %d\n", n);
}
return 0;
}