Поиск в структуре по разным полям - C (СИ)
Формулировка задачи:
Доброго времени суток.
Нужна небольшая консультация. Задание стандартное, работа со структурой. И одним из пунктов идет поиск.Собственно с реализацияй поиска и возник вопрос. Поиск надо реализовать по каждому отдельному полю, но писать для полей одного типа отдельный алгоритм мне кажется не рационально. Поэтому я хотел бы реализовать одну единственную функцию поиска, а уже в функцию передавать переменную которой было бы присвоено имя определенного поля.
Но к сожелению не знаю как организовать обращение к определенному полю через параметр, поэтому подскажите как именно это сделать.
П.С.: Кода всей программы и самой функции поиска не надо, нужен синтаксис обращения к полю. Если конечно такое возможно в С.
...
struct str{char a; char b;char c; void search(char s);}*list;
...
char <переменная>;
...
void search(char s){
...
list-><переменная>;
...
}Решение задачи: «Поиск в структуре по разным полям»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
struct x {
char a;
char b;
char c;
};
void FindPrint(struct x *p, size_t size,
int c, int (*fp)(struct x *, int));
int first(struct x *p, int c);
int second(struct x *p, int c);
int third(struct x *p, int c);
/* searchs structures for characters in different fields
and prints them */
int main(void) /* ANSI C89 */
{
struct x chs[10] = {
{ 'a', 'b', 'c' },
{ 'a', 'b', 'c' },
{ 'a', 'b', 'c' },
{ 'a', '0', 'c' },
{ 'a', '0', 'c' },
{ 'a', '0', 'c' },
{ 'a', 'b', '#' },
{ 'a', 'b', '#' },
{ 'a', 'b', '#' },
{ '.', 'b', 'c' }
};
char c;
c = '.';
FindPrint(chs, 10, c, first);
c = 'b';
FindPrint(chs, 10, c, second);
c = 'c';
FindPrint(chs, 10, c, third);
exit(EXIT_SUCCESS);
}
void FindPrint(struct x *p, size_t size,
int c, int (*fp)(struct x *, int))
{
size_t i;
printf("print for '%c'" "\n", c);
for (i = 0; i < size; i++)
if (fp(p+i, c) == 1)
printf(
"%c %c %c" "\n",
(p+i)->a,
(p+i)->b,
(p+i)->c
);
}
int first(struct x *p, int c)
{
return p->a == c;
}
int second(struct x *p, int c)
{
return p->b == c;
}
int third(struct x *p, int c)
{
return p->c == c;
}
Объяснение кода листинга программы
- Структура данных, используемая в программе, - это структура
x, которая содержит три поля типаchar:a,bиc. - Программа содержит три функции:
first,secondиthird, которые сравнивают структуруxпо полямa,bиcсоответственно с заданным символом. - Функция
FindPrintпринимает указатель на массив структурx, размер этого массива, символ для поиска и функцию сравнения в качестве параметров. - Функция
FindPrintиспользует циклforдля прохода по всем элементам массива структурx. - Внутри цикла функция
fpвызывается для каждой структуры в массиве. - Если функция
fpвозвращает1, то это означает, что текущая структура удовлетворяет условию поиска, и ее поля выводятся на экран с помощью функцииprintf. - В функции
mainсоздается массив структурxс 10 элементами, инициализированными различными значениями. - Затем программа вызывает функцию
FindPrintтри раза, передавая разные символы для поиска и разные функции сравнения. - В результате выполнения программы на экран выводятся все структуры, удовлетворяющие условиям поиска.