Написание программы с использованием структурного шаблона с именем ZNAK

  • Вид работы:
    Контрольная работа
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    251,48 kb
  • Опубликовано:
    2012-01-10
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Написание программы с использованием структурного шаблона с именем 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


Результаты

Главное меню

Похожие работы на - Написание программы с использованием структурного шаблона с именем ZNAK

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!