Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C_C++ / Lesson3 / 3-fptr / fptr

.cpp
Скачиваний:
47
Добавлен:
10.02.2015
Размер:
2.14 Кб
Скачать
// Упражнение на работу с указателями на функции
// ---------------------------------------------
// Требуется изменить функции, разработанные во
// втором упражнении таким образом, чтобы их можно
// было применить не только к целочисленным массивам.
// Подход к решению задачи следующий: 
// - в функции вместо указателя на целочисленный массив
//   передается указатель без типа (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;
}
Соседние файлы в папке 3-fptr