Поиск в структуре по разным полям - 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;
}

Объяснение кода листинга программы

  1. Структура данных, используемая в программе, - это структура x, которая содержит три поля типа char: a, b и c.
  2. Программа содержит три функции: first, second и third, которые сравнивают структуру x по полям a, b и c соответственно с заданным символом.
  3. Функция FindPrint принимает указатель на массив структур x, размер этого массива, символ для поиска и функцию сравнения в качестве параметров.
  4. Функция FindPrint использует цикл for для прохода по всем элементам массива структур x.
  5. Внутри цикла функция fp вызывается для каждой структуры в массиве.
  6. Если функция fp возвращает 1, то это означает, что текущая структура удовлетворяет условию поиска, и ее поля выводятся на экран с помощью функции printf.
  7. В функции main создается массив структур x с 10 элементами, инициализированными различными значениями.
  8. Затем программа вызывает функцию FindPrint три раза, передавая разные символы для поиска и разные функции сравнения.
  9. В результате выполнения программы на экран выводятся все структуры, удовлетворяющие условиям поиска.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5
Похожие ответы