Как реализовать форму с необязательными полями ввода на C?

#c #console-application

#c #консольное приложение

Вопрос:

Я работаю над консольной программой, которая позволяет выполнять поиск в массиве структуры с именем Person

Для простоты я теперь предполагаю, что все атрибуты являются целыми числами.

 typedef struct Person {
    int name;
    int city;
    int email;
} Person;
 

таким образом, функция сравнения будет выглядеть следующим образом:

 int comparing(int x, int y) {
    return x == y;
}
 

Я пытаюсь создать функцию поиска, которая позволила бы пользователю использовать comparing(int x, int y) , и пользователь может выполнять поиск по одному или нескольким критериям. Это означает, что они могут выполнять поиск только по имени и электронной почте, например.

Комментарии:

1. Не понимаю, почему name — это an int , но вы можете изучить do while() для операций, связанных с меню

2. @irAM, просто для простоты, я просто тестирую его сейчас, чтобы создать четкий алгоритм, а затем его будет легко создать для строк.

3. допустим, пользователь выбрал поиск по имени и городу, как должен выглядеть цикл for для поиска?

4. @AymaneHrouch: теперь я удалил свои комментарии и сформировал их в ответ, в котором я также привожу пример кода цикла.

Ответ №1:

Если вы хотите иметь «флажки», которые пользователь может проверять, перемещая курсор на экране с помощью клавиш со стрелками, а затем нажимать ENTERклавишу для их активации, то вы не можете сделать это с помощью стандартной библиотеки C, но вы, вероятно, можете сделать это с помощью API, зависящего от платформы. Например, если вы работаете на платформе Linux, вы можете использовать ncurses. Однако, возможно, вам лучше создать правильное графическое приложение, то есть не консольное приложение.

Если вы хотите сохранить это простое текстовое консольное приложение, использующее только функции стандартной библиотеки C, тогда у вас может быть текстовое меню, в котором пользователь может указать, что он хочет переключить флажок, а затем он спросит пользователя, какой номер флажка он хочет переключить. После каждого изменения флажков программа перепечатывает все флажки, чтобы показать пользователю новое состояние флажков.

В разделе комментариев вы специально попросили код, чтобы показать вам, как должен выглядеть цикл поиска. Поэтому я написал для вас такой цикл.

Для этого цикла требуется, чтобы была создана переменная типа struct Person с именем lf (что означает «ищу») и заполнена всеми критериями поиска. Должны быть установлены только те поля, которые на самом деле ищутся. Остальные поля могут оставаться неинициализированными. Кроме того, bool должны быть созданы три переменные типа с именами should_match_name , should_match_city и should_match_email . Эти три переменные должны быть установлены, чтобы указать, следует ли искать соответствующее поле, и если установлено значение true , соответствующее поле также должно быть установлено в lf переменной. Обратите внимание, что вы должны #include <stdbool.h> включить поддержку bool типа переменной.

Затем цикл может выглядеть следующим образом:

 for ( int i = 0; i < number_of_valid_elements_in_array; i   )
{
    if (
        ( !should_match_name  || lf.name  == array[i].name  ) amp;amp;
        ( !should_match_city  || lf.city  == array[i].city  ) amp;amp;
        ( !should_match_email || lf.email == array[i].email )
    )
    {
        printf(
            "Matching person found:nName: %dnCity: %dnE-Mail: %dnn",
            array[i].name, array[i].city, array[i].email
        );
    }
}
 

Обратите внимание, что более сложные алгоритмы поиска (например, те, которые используются в ядрах баз данных) не выполняют поиск по всем элементам, чтобы найти совпадение, а скорее выполняют поиск с использованием индексов. Это значительно ускоряет поиск. Однако эти индексы должны быть созданы заранее. Но пока у вас меньше миллиона элементов, это, вероятно, не будет иметь значения.