Написание программы с использованием структурного шаблона с именем ZNAK
Задание
Описать структурный шаблон с именем ZNAK,
содержащий следующие элементы:
NAME - фамилия, имя (символьный массив)
ZODIAC - знак зодиака (символьный массив)
BDAY - день рождения - массив трех чисел (тип
INT)
Написать программу, выполняющую:
. ввод на экран с клавиатуры данных в массив
BOOK, состоящий из элементов типа ZNAK.
2. вывод на экран:
- всей информации, упорядоченной по датам дней
рождения
-вывод на экран информации о человеке, чья
фамилия и чьё имя введены с клавиатуры, если таковых нет, то выдать
соответствующее сообщение
Стандартные
библиотеки
<stdio.h> -стандартный заголовочный файл
ввода/вывода заголовочный файл стандартной библиотеки языка Си, содержащий
определения макросов, константы и объявления функций и типов, используемых для
различных операций стандартного ввода и вывода.
<malloc.h>-функция
выделения динамической памяти, входящие в стандартную библиотеку языка Си, malloc
принимает в качестве аргумента размер выделяемой области в байтах; возвращает
нетипизированный указатель (void*)
на область памяти заявленного размера или NULL в случае, если выделить память
невозможно. Содержимое выделяемой области памяти не определено. сalloc
-принимает в качестве аргумента количество элементов и размер каждого элемента
в байтах; возвращает нетипизированный указатель (void*) на область памяти
заявленного размера или NULL в случае, если выделить память невозможно.
Значения элементов устанавливаются в ноль. malloc работает быстрее, чем calloc,
в связи с отсутствием функции обнуления выделяемой памяти. графический программа указатель структура
<graph.h>
-стандартная библиотека языка Си, подключающая графические функции.
Структуры
Структуры в языке Си - это объединенные данные,
у которых есть некоторая логическая взаимосвязь.
Например:ZNAK
{ char NAME[30]; char ZODIAK[10]; int BDAY[3];}
Любая структура в языке си ( c
) должна начинаться с ключевого слова - struct,
которое сообщает компилятору, что тут у нас будет структура. Все данные в
структуре (struct) пишутся в
фигурных скобках, и в конце ставится запятая с точкой (;).
В структуре (struct)
у нас находятся данные различных типов, но они объединены в логическую связь.
Данные в структуре должны иметь уникальные имена, но в различных структурах
можно использовать одинаковые названия. Объявление структуры ни чем не
отличается от объявления любого типа данных в языке Си.
Операции со структурами:
· присваивание полю структуры значение того же
типа
· можно получить адрес структуры. Не
забываем операцию взятия адреса (&)
· можно обращаться к любому полю
структуры
· для того, что бы определить размер
структуры можно использовать операцию sizeof()
Инициализация структуры
Инициализация структуры в языке си происходит
так же, как и при инициализации массива. Вот пример инициализации структуры:
struct
klass a
= {"Sergey", 'B',
4.5 };
Создается переменная типа struct klass и
присваивается всем трем полям, которые у нас определенны в структуре, значения.
Порядок очень важен при инициализации структуры, так как компьютер сам не может
отсортировывать данные. Если какое-либо поле у вас будет не заполненным, то оно
автоматом заполнится 0 - для целочисленных типов; NULL - для указателей; \0
(ноль-терминатор) - для строковых типов.
Типы
данных
В языке Си предусмотрено использование основных
типов данных:
. Символьный.
Объекты, описанные как символы (char),
достаточно велики, чтобы хранить любой член из соответствующего данной
реализации внутреннего набора символов, и если действительный символ из этого
набора символов хранится в символьной переменной, то ее значение эквивалентно
целому коду этого символа. В символьных переменных можно хранить и другие
величины, но реализация будет машинно-зависимой. (На СМ ЭВМ значение символьных
переменных изменяется от -0177 до 0177.)
.Целый.
Можно использовать до трех размеров целых,
описывае мых как short
int, int
и long int.
Длинные целые занимают не меньше памяти, чем короткие, но в конкретной
реализации может оказаться, что либо короткие целые, либо длинные целые, либо
те и другие будут эквивалентны простым целым. "Простые" целые имеют
естественный размер, предусматриваемый архитектурой используемой машины; другие
размеры вводятся для удовлетворения специальных потребностей.
.Беззнаковый.
Целые без знака, описываемые как unsigned,
подчиняются законам арифметики по модулю 2**n, где n - число битов в их
представлении.
.Вещественный.
Вещественные одинарной точности (float) и
вещественные двойной точности (double) в некоторых реализациях могут быть
синонимами. (На СМ ЭВМ float занимает 32 бита памяти, а double - 64).
В языке нет логического типа данных, а в
качестве логических значений используются целые "0" -
"ложь" и "1" - "истина" (при проверках любое
целое, не равное 0, трактуется как "истина").
В своей работе я использую целый и символьный
тип данных.
Указатели
Указатель - это переменная, которая содержит
адрес некоторого объекта в памяти компьютера. Понятно, что адрес - целое число.
Многие конструкции языка Си требуют применения
указателей. Например, указатели необходимы для успешного использования функций
и динамического распределения памяти. С указателями следует обращаться очень
осторожно. Так использование в программе неинициализированного указателя может
привести к "зависанию" компьютера. При неправильном, неаккуратном
использовании указателей в программе могут возникнуть ошибки, которые очень
трудно бывает обнаружить. Обойтись же без указателей в программах на языке Си
нельзя.
Объявление указателей в Си.
Вначале указывается тип указателя. Это некоторый
тип языка Си. В данном случае он определяет тип объекта, на который указывает
указатель.
Вслед за этим через пробел ставится звездочка -
*. Она обозначает, что следующая за ней переменная является указателем.
Получается довольно простая формула:
тип *<простая переменная>
Например:*ch;*temp,
i, *j, *k;
float *pt, fon;
Здесь указателями являются: ch, temp, j, k pt.
Операции над указателями в Си.
Простейшая операция над указателями - это
операция &, что означает "взять адрес". Существует еще одна
операция над указателями. Она обозначается символом звездочка *. Смысл этой
операции таков: "значение, расположенное по указанному адресу".
Хотя знак звездочка * соответствует обычной
операции умножения, но никак нельзя перепутать эти две операции. Ведь
арифметическая операция умножения имеет два операнда. Иначе говоря, при
умножении должны быть указаны, как данные, два числа, участвующие в умножении.
Поэтому и говорят, что умножение - это бинарная операция. Операция * над
указателями, в отличие от арифметического умножения, - это унарная операция. То
есть, другими словами, она использует всего один операнд (одно данное).
Графика
Разработка всех графических программ включает
следующие пять шагов:
.Подключение графической библиотеки.
.Установка видео-режима.
.Определение параметров видео-конфигурации.
.Создание и манипуляции графическими фигурами.
.Восстановление первоначальной конфигурации
перед выходом из программы.
Подключение графической библиотеки.
Включаемый заголовочный файл graph.h определяет
основные переменные, прототипы функций и константы, используемые в графическом
программировании. Подключайте данный файл ко всем программам, использующим
графические функции.
Установка видео-режима.
Первым шагом в графических программах является
установка видео-режима, который разрешает выполнение графических функций. В
графической библиотеке СИ поддерживается 10 графических режимов.
Графические функции и видеорежимы, используемые
в данной программе будут представлены далее.
Константа
|
Видеорежим
|
Графический
или текстовый
|
Оригинальный
режим
|
оба
|
_TEXTBW40
|
40x25
текст, 16 серых
|
текстовый
|
_TEXTTC40
|
40x25
текст, 16/8 цветных
|
текстовый
|
_TEXTBW80
|
80x25
текст, 16 серых
|
текстовый
|
_TEXTC80
|
80x25
текст, 16/8 цветных
|
текстовый
|
_MRES4COLOR
|
320x200
ячеек, 4 цвета
|
графический
|
_MRESNOCOLOR
|
320x200
ячеек, 4 серых
|
графический
|
_HRESBW
|
640x200
ячеек, BW
|
графический
|
_TEXTMONO
|
80x25
текст, BW
|
текстовый
|
_MRES16COLOR
|
320x200
ячеек, 16 цветов
|
графический
|
_HRES16COLOR
|
640x200
ячеек, 16 цветов
|
графический
|
_ERESNOCOLOR
|
640x350
ячеек, BW
|
графический
|
_ERESCOLOR
|
640x350
ячеек,4/16 цветов
|
графический
|
_VRES2COLOR
|
640x480
ячеек, 2 цвета
|
графический
|
_VRES16COLOR
|
640x480
ячеек, 16 цветов
|
графический
|
_MRES256COLOR
|
320x200
ячеек, 256 цветов
|
графический
|
В своей программе я использую «_VRES16COLOR» для
использования в видеорежиме 16-цветную палитру для графических объектов, а
также «_TEXTC80» для использования в видеорежиме 16-цветную палитру для текста.
«_DEFAULTMODE» - возвращает или задает режим ввода данных, к которому
возвращается элемент после операции обновления, вставки или отмены.
Таблица функций
Функция
|
Смысловая
нагрузка
|
void createFile()
|
создание
файла
|
main()
|
главная
функция
|
void showRecords()
|
функция
вывода записей по введенной фамилии
|
void showAll()
|
функция
вывода всех записей, сортированных по дате рождения
|
struct inpinput()
|
функция
добавления новых записей в базу
|
Графические функции
int menu()
|
создание
графической оболочки
|
Описание переменных
имя
переменной
|
тип
|
смысловая
нагрузка
|
NAME
|
char
|
|
имя,
в котором хранится имя и фамилия человека
|
ZODIAK
|
char
|
|
имя,
в котором хранится знак зодиака
|
BDAY
|
int
|
|
имя,
в котором хранится дата рождения человека
|
main()
c
|
int
|
локальная
|
переменная
отвечает за ввод с клавиатуры
|
selection
|
int
|
локальная
|
переменная
используется в операторе switch
|
number
|
int
|
локальная
|
переменная
отвечает за количество записей
|
rez
|
inp
|
локальная
|
переменная
используется при создании новых записей; буферная структура для значений
|
BLOC_NOTE
|
NOTE
|
локальная
|
указатель
на структуру NOTE
|
i
|
int
|
локальная
|
счетчик
|
menu()
c
|
char
|
локальная
|
отвечает
за ввод с клавиатуры
|
textselected
|
char
|
локальная
|
отвечает
за цвет выделенного текста
|
textnotselected
|
char
|
локальная
|
отвечает
за цвет невыделенного текста
|
buttonselected
|
char
|
локальная
|
отвечает
за цвет выделенной кнопки
|
buttonnotselected
|
char
|
локальная
|
отвечает
за цвет невыделенной кнопки
|
i
|
int
|
локальная
|
счетчик
|
selection
|
int
|
локальная
|
используется
в операторе switch
|
x[2]
|
int
|
локальная
|
координаты
кнопок по x
|
y[4]
|
int
|
координаты
кнопок по y
|
h
|
int
|
локальная
|
расстояние
между кнопками
|
showRecords(struct ZNAK*BOOK, int
number)
c
|
char
|
локальная
|
отвечает
за ввод с клавиатуры
|
zod[30]
|
char
|
локальная
|
отвечает
за хранение введенной с клавиатуры фамилии
|
I,j
|
int
|
локальная
|
счетчики
|
flag
|
int
|
локальная
|
переменная,
отвечающая за то найдена ли запись или нет
|
void showAll(struct ZNAK*BOOK, int
number)
I,j,k
|
int
|
локальная
|
счетчики
|
c
|
char
|
локальная
|
отвечает
за ввод с клавиатуры
|
Z
|
ZNAK
|
локальная
|
буферная
структура для обмена значений
|
struct inp input(int number, struct
ZNAK*BOOK)
rez
|
inp
|
локальная
|
переменная
отвечает за количество записей; буферная переменная для обмена значений
|
I,j
|
int
|
локальная
|
счетчики
|
errorflag
|
int
|
локальная
|
переменная,
отвечающая за ошибку при вводе данных
|
errorflag2
|
int
|
локальная
|
переменная,
отвечающая за ошибку при вводе данных
|
breaker
|
int
|
локальная
|
переменная,
отвечающая за прерывание функции и возвращение в главное меню
|
c
|
char
|
локальная
|
за
ввод с клавиатуры
|
flag
|
char
|
локальная
|
переменная,
отвечающая за продолжение записей
|
comparer
|
char
|
локальная
|
переменная,
в которую записываются данные структуры ZNAK
|
Листинг
#include <stdio.h>
#include <graph.h>ZNAK
{NAME[30],ZODIAK[20];BDAY[3];
};inp
{ZNAK *BOOK;number;
};menu();inp input(int number,
struct ZNAK *BOOK);showRecords(struct ZNAK *BOOK, int number);showAll(struct
ZNAK *BOOK, int number);createFile(struct ZNAK *BOOK, int number){i,j,k;c;ZNAK
Z;*output;((output=fopen("book.dat","w"))==NULL)
{("Не удалось создать файл.\n");
return;
}(i = 0; i < number; i++)
{(j = 0; j < number-1; j++)
{(k=2; k>=0; k--)
{((BOOK+j)->BDAY[k]==(BOOK+j+1)->BDAY[k]);((BOOK+j)->BDAY[k]>(BOOK+j+1)->BDAY[k])
{=*(BOOK+j);
*(BOOK+j)=*(BOOK+j+1);
*(BOOK+j+1)=Z;
};
}
}
}(output, "‚все
записи:\n\n");(output,
" »\n");(output, " ИМЯ
ЗОДИАК
ДАТА
РОЖДЕНИЯ
\n");(output, " n");(i=0; i<number; i++)
{(output, " є
%30s і
%11s і
",(BOOK+i)->NAME,(BOOK+i)->ZODIAK);(j=0;j<2;j++)(output,
"%2.2d.",(BOOK+i)->BDAY[j]);(output, "%4d
",(BOOK+i)->BDAY[2]);(output, " є\n");(i==number-1)(output,
" \n");(output, " \n");
}("\n\nФайл успешно сохранен! ");
}()
{c,selection,number=0;inp rez;ZNAK
*BOOK=0;(1)
{=menu();(selection)
{1:=input(number,BOOK);=rez.number;=rez.BOOK;;2:(BOOK,number);;3:(BOOK,number);
break;4:("Вы действительно хотите выйти
1-да, 2-нет (1/2)? ");c=getch();((c!='1')
&& (c!='2'));(c=='1')
{
_setvideomode(_DEFAULTMODE);(BOOK);(0);
}
}
}
}menu()
{c,textselected=5,textnotselected=9,buttonselected=16,buttonnotselected=14;i,selection=1,x[2]={100,612},y[4]={40,140,240,340},h=65;
_setvideomode(_VRES16COLOR);
_setbkcolor(_WHITE);
_clearscreen(_GCLEARSCREEN);(c!=13)
{(c==72)(selection==1)=4;selection--;(c==80)(selection==4)=1;selection++;
_setcolor(buttonnotselected);(i=0;i<4;i++)
{(i+1==selection)
_setcolor(buttonselected);
_rectangle(_GFILLINTERIOR,x[0],y[i],x[1],y[i]+h);
_rectangle(_GBORDER,x[0]-9,y[i]-9,x[1]+9,y[i]+h+9);(i+1==selection)
_setcolor(buttonnotselected);
}
_settextcolor(textnotselected);
_settextposition(5,32);(selection==1)
_settextcolor(textselected);
_outtext(" Создать
новые
записи
");(selection==1)
_settextcolor(textnotselected);
_settextposition(11,33);(selection==2)
_settextcolor(textselected);
_outtext(" Вывести
по
фамилии
");(selection==2)
_settextcolor(textnotselected);
_settextposition(18,35);(selection==3)
_settextcolor(textselected);
_outtext(" Вывести
все
");(selection==3)
_settextcolor(textnotselected);
_settextposition(24,39);(selection==4)
_settextcolor(textselected);
_outtext(" Выход
");(selection==4)
_settextcolor(textnotselected);=getch();
}
_setvideomode(_TEXTC80);
_settextcolor(14);
_clearscreen(_GCLEARSCREEN);selection;
}inp input(int number, struct ZNAK
*BOOK)
{inp
rez;i,j,errorflag,errorflag2,breaker;c,flag=1,comparer[128];=0;
if(number)
{(" Записи уже существуют.Если вы
хотите...\n");(" ...удалить старые записи и создать новые
'1'\n");(" ...добавить записи к существующим '2'\n");("
...завершить операцию и вернуться в меню '3'\n");=getch();((c!='1')
&& (c!='2') && (c!='3'));(c=='1')
{(i=0; i<number;
i++)(BOOK+i);=0;("Старые данные
удалены!");
}(c=='2')=1;
{(breaker==1);
++number;=0;=(struct
ZNAK*)realloc(BOOK,(i+1)*sizeof(struct ZNAK));("\nЗапись
#%d: \n",i+1);
do
{=1;("\n Пожалуйста, введите имя (1-30
символов): ");
gets(comparer);(((strlen(comparer))<29)
&& ((atoi(comparer))==0))
errorflag2=0;(" \n Имя не может содержать
больше 30 символов!. Пожалуйста, попробуйте снова.\n");
}
while(errorflag2==1);
strcpy(((BOOK+i)->NAME),
comparer);
printf("\n Введите дату рождения:\n
");
{(errorflag)
{("\n \n Некорректное сочетание дня и
месяца \n");("\n (Например: 35.03( в марте 31 день
))\n");("\n Пожалуйста, попробуйте снова !\n");
}++;
{=1;(" Пожалуйста, введите день
(DD):");
gets(comparer);
(BOOK+i)->BDAY[0]=atoi(comparer);(((BOOK+i)->BDAY[0]<32)
&& ((BOOK+i)->BDAY[0]>0))
errorflag2=0;(" \n День должен принадлежать
[1;31] интервалу. Пожалуйста, попробуйте снова.\n\n");
}(errorflag2==1);(" данные
приняты!\n\n");
{=1;(" Пожалуйста,введите
месяц
(MM):");(comparer);
(BOOK+i)->BDAY[1]=atoi(comparer);(((BOOK+i)->BDAY[1]<13)
&& ((BOOK+i)->BDAY[1]>0))
errorflag2=0;(" \n Месяц должен
принадлежать интервалу [1;12]. Пожалуйста, попробуйте снова .\n\n");
}(errorflag2==1);(" Данные
приняты!\n\n");
{=1;(" ПОжалуйста,
введите
год
(YYYY): ");(comparer);
(BOOK+i)->BDAY[2]=atoi(comparer);(((BOOK+i)->BDAY[2]<2011)
&& ((BOOK+i)->BDAY[2]>999))
errorflag2=0;(" \n Год должен принадлежать
интервалу [999;2011]\n\n ");
}(errorflag2==1);(" “Данные
приняты!\n\n");
}(((((BOOK+i)->BDAY[0])==31)
&& (((BOOK+i)->BDAY[1]==4) ||
((BOOK+i)->BDAY[1]==6) ||
((BOOK+i)->BDAY[1]==9) || ((BOOK+i)->BDAY[1]==11) ||
((BOOK+i)->BDAY[1]==2))) ||
(((BOOK+i)->BDAY[1]==2) &&
(((BOOK+i)->BDAY[0]==29) ||
((BOOK+i)->BDAY[0]==30))));((BOOK+i)->BDAY[0]>20 &&
(BOOK+i)->BDAY[1]==3 || (BOOK+i)->BDAY[0]<21 &&
(BOOK+i)->BDAY[1]==4) strcpy((BOOK+i)->ZODIAK, "ЋўҐ");((BOOK+i)->BDAY[0]>20
&& (BOOK+i)->BDAY[1]==4 || (BOOK+i)->BDAY[0]<21 &&
(BOOK+i)->BDAY[1]==5) strcpy((BOOK+i)->ZODIAK,"’Ґ«Ґж");((BOOK+i)->BDAY[0]>20
&& (BOOK+i)->BDAY[1]==5 || (BOOK+i)->BDAY[0]<22 &&
(BOOK+i)->BDAY[1]==6) strcpy((BOOK+i)->ZODIAK,"Ѓ«Ё§Ґжл");((BOOK+i)->BDAY[0]>21
&& (BOOK+i)->BDAY[1]==6 || (BOOK+i)->BDAY[0]<23 &&
(BOOK+i)->BDAY[1]==7) strcpy((BOOK+i)->ZODIAK,"ђ
Є\0");((BOOK+i)->BDAY[0]>22
&& (BOOK+i)->BDAY[1]==7 || (BOOK+i)->BDAY[0]<24 &&
(BOOK+i)->BDAY[1]==8) strcpy((BOOK+i)->ZODIAK,"‹Ґў");((BOOK+i)->BDAY[0]>23
&& (BOOK+i)->BDAY[1]==8 || (BOOK+i)->BDAY[0]<24 &&
(BOOK+i)->BDAY[1]==9) strcpy((BOOK+i)->ZODIAK,"„Ґў
");((BOOK+i)->BDAY[0]>23 && (BOOK+i)->BDAY[1]==9 ||
(BOOK+i)->BDAY[0]<24 && (BOOK+i)->BDAY[1]==10)
strcpy((BOOK+i)->ZODIAK,"‚Ґбл");((BOOK+i)->BDAY[0]>23
&& (BOOK+i)->BDAY[1]==10 || (BOOK+i)->BDAY[0]<23 &&
(BOOK+i)->BDAY[1]==11) strcpy((BOOK+i)->ZODIAK,"‘Є®аЇЁ®");((BOOK+i)->BDAY[0]>22
&& (BOOK+i)->BDAY[1]==11 || (BOOK+i)->BDAY[0]<22 &&
(BOOK+i)->BDAY[1]==12) strcpy((BOOK+i)->ZODIAK,"‘в५Ґж");((BOOK+i)->BDAY[0]>21
&& (BOOK+i)->BDAY[1]==12 || (BOOK+i)->BDAY[0]<21 &&
(BOOK+i)->BDAY[1]==1) strcpy((BOOK+i)->ZODIAK,"Љ®§Ґа®Ј");((BOOK+i)->BDAY[0]>20
&& (BOOK+i)->BDAY[1]==1 || (BOOK+i)->BDAY[0]<20 &&
(BOOK+i)->BDAY[1]==2) strcpy((BOOK+i)->ZODIAK,"‚®¤®«Ґ©");((BOOK+i)->BDAY[0]>19
&& (BOOK+i)->BDAY[1]==2 || (BOOK+i)->BDAY[0]<21 &&
(BOOK+i)->BDAY[1]==3) strcpy((BOOK+i)->ZODIAK,"ђлЎл");("
Зодиак
- ");((BOOK+i)->ZODIAK);
fflush(stdin);("\nХотите ли вы продолжить
ввод данных 1-да, 2-нет(1/2)? ");c=getch();
while (c!='1' && c!='2');(c=='1') flag=1;
{=0;(number)
{(BOOK, number);
printf("Нажмите любую клавишу для возврата
в меню.\n");
getch();
}
}
}.BOOK=BOOK;.number=i;rez;
}showRecords(struct ZNAK *BOOK, int
number)
{c, zod[20];i,j, flag;
if(number==0)
{("Ни одной записи не найдено. Введите
записи.\n \
Нажмите любую клавишу для возврата в
меню...");
getch();0;
}
{=0;("\n Введите
имя:
");(zod);(i = 0; i < number; i++)(!strcmp(zod,(BOOK+i)->NAME))
{=1;("\nНайдены
записи
#%d:\n",i+1);(" Имя:
%s\n",(BOOK+i)->NAME);(" Знак
зодиака:
%s\n",(BOOK+i)->ZODIAK);
printf(" Дата рождения:
");(j=0;j<2;j++)
printf("%i.",(BOOK+i)->BDAY[j]);("%i\n",(BOOK+i)->BDAY[2]);
}(!flag)("Ни одной записи не
найдено.");("\n\nХотите ли вы начать новый поиск 1-да,
2-нет(1/2)?");
do=getch();(c!='1' &&
c!='2');
} while (c=='1');
}showAll(struct ZNAK *BOOK, int
number)
{i,j,k;c,fname[20];ZNAK
Z;(number==0)
{("Нет записей. Создайте записи.\nНажмите
любую клавишу для возврата в меню...");
getch();0;
}(i = 0; i < number; i++)
{(j = 0; j < number-1; j++)
{(k=2; k>=0; k--)
{((BOOK+j)->BDAY[k]==(BOOK+j+1)->BDAY[k])
continue;((BOOK+j)->BDAY[k]>(BOOK+j+1)->BDAY[k])
{=*(BOOK+j);
*(BOOK+j)=*(BOOK+j+1);
*(BOOK+j+1)=Z;
};
}
}
}("Все
записи:\n\n");("
\n");(" ИМЯ ЗОДИАК
ДАТА
РОЖДЕНИЯ
\n");(" \n");(i=0; i<number; i++)
{(" %30s %11s
",(BOOK+i)->NAME,(BOOK+i)->ZODIAK);(j=0;j<2;j++)
printf("%2.2d.",(BOOK+i)->BDAY[j]);("%4d
",(BOOK+i)->BDAY[2]);(" \n");(i==number-1)("
\n");(" \n");
}("\n\nНажмите любую клавишу для возврата в
меню.");();
}
Блок
схема
Главное меню
Функция добавления новых записей (struct
inp input)
ShowAll
Результаты
Главное меню