Описать структуру с именем ZNAK - C (СИ) (74652)
Формулировка задачи:
Описать структуру с именем ZNAK, содержащую следующие поля:
• фамилия, имя;
• знак зодиака;
• дата рождения (массив из трёх чисел).
Задание на поиск: найти информацию о людях, родившихся под знаком, название которого введено с клавиатуры.
Написать программу, которая выполняет следующие действия:
1. Ввод данных об информационном объекте через диалог с пользователем и запись этих данных в массив. При вводе проверять, есть ли свободное место в массиве.
2. Вывод хранящихся данных на экран.
3. Выполнение задания на поиск, которое определяется вариантом.
Программа должна содержать 3 функции (ввод одного элемента массива (одной строчки таблицы), вывод всей таблицы на экран, выполнение задания на поиск) и меню, позволяющее пользователю выбрать одно из трех действий.
Решение задачи: «Описать структуру с именем ZNAK»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 5 typedef struct { char fn[20], ln[20], zodiac[20]; int bday[3]; } zodiac; void printElement(zodiac * list, int index) { printf("[Found] %s %s born on %d.%d.%d (%s)\n", list[index].fn, list[index].ln, list[index].bday[0], list[index].bday[1], list[index].bday[2], list[index].zodiac); } void search(zodiac * list, void * key, int * option) { switch (*option) { case 0: for (int i = 0; i < SIZE; i++) { if (list[i].bday[0] && !strcmp(list[i].fn, (char *) key)) { printElement(list, i); } } break; case 1: for (int i = 0; i < SIZE; i++) { if (list[i].bday[0] && !strcmp(list[i].ln, (char *) key)) { printElement(list, i); } } break; case 2: for (int i = 0; i < SIZE; i++) { if (list[i].bday[0] == *(int *) key && list[i].bday[1] == *((int *) key + 1) && list[i].bday[2] == *((int *) key + 2)) { printElement(list, i); } } break; default: printf("Something gone wrong!\n"); break; } } int main(int argc, char ** argv) { zodiac list[SIZE]; memset(list, 0, sizeof(zodiac) * SIZE); char command[20]; while (1) { printf("> "); scanf("%s", command); if (!strcmp(command, "add")) { int index = 0; for (int i = 0; i < SIZE; i++, index++) { if (!list[i].bday[0]) { scanf("%s %s %s %d %d %d", list[i].fn, list[i].ln, list[i].zodiac, &list[i].bday[0], &list[i].bday[1], &list[i].bday[2]); break; } } if (index == SIZE) { printf("There are no free slots!\n"); } } else if ((!strcmp(command, "print"))) { for (int i = 0; i < SIZE; i++) { if (list[i].bday[0]) { printElement(list, i); } } } else if ((!strcmp(command, "search"))) { int option; char key[20]; int date[3]; printf("What you are looking for? (Firstname: 0, Lastname: 1, Birthday: 2): "); scanf("%d", &option); printf("Searching key: "); if (option == 2) { scanf("%d %d %d", &date[0], &date[1], &date[2]); search(list, (void *) date, &option); } else { scanf("%s", key); search(list, (void *) key, &option); } } else if ((!strcmp(command, "exit"))) { return EXIT_SUCCESS; } else { printf("unknown command\n"); } } return EXIT_SUCCESS; }
Объяснение кода листинга программы
- Структура с именем ZNAK содержит поля: fn, ln, zodiac, bday.
- Размер структуры ZNAK определяется макросом SIZE, равным 5.
- В функции printElement() выводится информация о найденном элементе списка.
- В функции search() происходит поиск элементов списка по заданному ключу.
- В функции main() реализована система взаимодействия с пользователем через команды: add, print, search, exit.
- При выполнении команды add, пользователю предлагается ввести данные для заполнения полей структуры ZNAK.
- При выполнении команды print, выводится информация о всех элементах списка или только о найденных по заданному ключу.
- При выполнении команды search, пользователю предлагается ввести ключ для поиска в списке.
- Ключ для поиска может быть как именем (fn или ln), так и датой рождения (bday).
- При выполнении команды exit, программа завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д