Описать структуру с именем 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, программа завершается.