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