- •8.Совместимость и преобразование типов. Явное и неявное преобразование.
- •10. Оператор присвоения. Комбинированные операторы присвоения. Математические и логические операции, операции сравнения . Ограничения на применения операторов(несовместимость типов).
- •11.Условная инструкция. Условный оператор. Пример.
- •12. Оператор множественного выбора. Пример. Управление оператором множественного выбора с помощью оператора break.
- •Вопрос 19. Регулярные структурированные типы. Одномерные массивы. Примеры работы с одномерными массивами (инвертирование массива относительно центрального элемента, относительно к-го элемента)
- •Вопрос 20. Регулярные структурированные типы. Одномерные массивы. Примеры работы с одномерными массивами (сложение векторов, скалярное произведение векторов, проверка на равенство)
- •Вопрос 22-24 Сортировка массивов. Методы сортировки (простого выбора, простой вставки, простого обмена). На примере массива структур.
- •Функции
- •39. Текстовые файлы
- •Функции вывода в стандартный и файловые потоки
- •Int printf([строка формата],
- •Функции ввода из стандартного и файловых потоков
- •Int scanf([строка формата],
- •Int fscanf(file*f,[строка формата],
- •40. Бинарные файлы с
- •41. Пользовательские типы данных
- •42. Модульная организация программы
41. Пользовательские типы данных
Для объявления пользовательских типов, используют конструкцию вида:
type имя_типа = описание_типа;
К примеру, таким образом можно объявлять типы множеств, перечислимые типы и подтипы.
Cтруктуры
Cтруктура – это совокупность логически связанных переменных, возможно, различных типов, сгруппированных под одним именем для удобства дальнейшей обработки.
Традиционным примером структуры служит учетная карточка работающего: служащий предприятия описывается набором атрибутов, таких как табельный номер, имя, дата рождения, пол, адрес, зарплата. Некоторые из этих атрибутов сами могут оказаться структурами, например, имя, дата рождения, адрес, имеющие несколько компонент.
Элементы структуры обозначаются идентификаторами, с которыми можно связывать описатели типов. В результате структуру можно рассматривать как единое целое и осуществлять при необходимости выбор ее элементов.
Для образования структуры присваиваются имена каждому из включаемых элементов и структуре в целом. Затем посредством специального описания задают иерархию, порядок следования и типы элементов, включаемых в структуру.
Общий вид описания структуры
struct <Имя_типа>{
тип1 элемент1;
тип2 элемент2;
…
типN элементN;
} [список экземпляров этого типа];
Эта запись называется описанием структуры. Она начинается с ключевого слова struct и состоит из заключенного в фигурные скобки списка описаний. За словом struct следует имя, которое называется именем типа структуры (иногда его называют тэгом или ярлыком структуры). Этот ярлык именует структуру, и в дальнейшем используется для сокращения подробного описания. Переменные, упоминающиеся в записи, называются элементами. Следом за правой фигурной скобкой, заканчивающей список элементов, может следовать список переменных так же, как и в случае базисных типов. Вот почему в приведенном выше описании структуры после закрывающей фигурной скобки стоит точка с запятой; она завершает пустой список.
Описание struct {....} p1, p2, p3; синтаксически аналогично int p1, p2, p3; в том смысле, что каждый из операторов описывает p1, p2, p3 как переменные соответствующего типа и приводит к выделению для них памяти. Описание же структуры без последующего списка переменных не выделяет никакой памяти. Оно только определяет форму структуры и действует как шаблон. Если такое описание снабжено ярлыком (именем типа), то его можно позже использовать при определении фактических экземпляров структуры.
Пример
struct Tovar{
char name[30]; // название товара
char shop [20]; // название магазина
float price; // цена
};
Tovar A,B;
Обращение к элементам записи A: A. name, A. Shop, A.price.
Обращение к элементам записи B: B. name, B. Shop, B.price.
Ввод записи: cin >> A.name >> A.shop >> A.price;
Для однотипных структур возможен массовый оператор присваивания, например, B=A;
Элементом структуры может быть другая структура.
Доступ к полям структуры
Когда структурная переменная определена, доступ к ее полям возможен с применением пока неизвестной нам операции точки. В программе первому из полей структуры присваивается значение при помощи оператора
part1.modelnumber = 6244; |
Доступ к полям структуры выполняется с помощью операций выбора .(точка) при обращении к полю через имя структуры и-> при обращении через указатель, например:
Worker worker, stuff[100],*ps;
…
Worker.fio=”Страусенко”;
Stuff[8].code=215;
Ps->salary=0.12;
Если элементом структуры является другая структура, то доступ к ее элементам выполняется через две операции выбора:
struct A {int a; double x;};
struct B {A a; double x;} x[2];
x[0].a.a=1;
x[1].x=0.1;
Как видно из примера, поля разных структур могут иметь одинаковые имена, поскольку у них разная область видимости. Более того, можно объявлять в одной области видимости структуру и другой объект(например, переменную или массив) с одинаковыми именами, если при определении структурной переменной использовать слово sruct, но не советую это делать – запутать компилятор труднее, чем себя.
Массивы структур
Структуры часто образуют массивы. Чтобы объявить массив структур, вначале необходимо определить структуру (то есть определить агрегатный тип данных), а затем объявить переменную массива этого же типа. Например, чтобы объявить 100-элементный массив структур типа addr, который был определен ранее, напишите следующее:
struct addr addr_list[100];
Это выражение создаст 100 наборов переменных, каждый из которых организован так, как определено в структуре addr.
Чтобы получить доступ к определенной структуре, указывайте имя массива с индексом. Например, чтобы вывести ZIP-код из третьей структуры, напишите следующее:
printf("%d", addr_list[2].zip);
Как и в других массивах переменных, в массивах структур индексирование начинается с 0.
Для справки: чтобы указать определенную структуру, находящуюся в массиве структур, необходимо указать имя этого массива с определенным индексом. А если нужно указать индекс определенного элемента в структуре, то необходимо указать индекс этого элемента. Таким образом, в результате выполнения следующего выражения первому символу члена name, находящегося в третьей структуре из addr_list, присваивается значение 'X'.
addr_list[2].name[0] = 'X';
Либо
Возможно, наиболее часто структуры используются в виде массивов структур. Для объявления массива структур следует сначала определить структуру, а затем объявить массив переменных данного типа. Например, для объявления 100-элементного массива структур типа addr следует написать: struct addr addr_info[100]; В результате получаем набор из 100 переменных, устроенных, как объявлено в типе структуры addr.
Для доступа к отдельным структурам массива adar_info следует проиндексировать имя массива. Например, для вывода содержимого поля zip третьей структуры, следует написать: printf("%ld", addr_info[2].zip);
Как и массивы переменных, массивы структур индексируются с нуля.
Пример со списком рассылки
Чтобы показать, как используются структуры и массивы структур, в этом разделе создается простая программа работы со списком рассылки, и в ее массиве структур будут храниться адреса и связанная с ними информация. Эта информация записывается в следующие поля: name (имя), street (улица), city (город), state (штат) и zip (почтовый код, индекс)
программа обработки списка рассылки приведена полностью. #include <stdio.h> #include <stdlib.h>
#define MAX 100
struct addr { char name[30]; char street[40]; char city[20]; char state[3]; unsigned long int zip; } addr_list[MAX];
void init_list(void), enter(void); void delete(void), list(void); int menu_select(void), find_free(void);
int main(void) { char choice;
init_list(); /* инициализация массива структур */ for(;;) { choice = menu_select(); switch(choice) { case 1: enter(); break; case 2: delete(); break; case 3: list(); break; case 4: exit(0); } }
return 0; }
/* Инициализация списка. */ void init_list(void) { register int t;
for(t=0; t<MAX; ++t) addr_list[t].name[0] = '\0'; }
/* Получения значения, выбранного меню. */ int menu_select(void) { char s[80]; int c;
printf("1. Введите имя\n"); printf("2. Удалите имя\n"); printf("3. Выведите список\n"); printf("4. Выход\n"); do { printf("\nВведите номер нужного пункта: "); gets(s); c = atoi(s); } while(c<0 || c>4); return c; }
/* Ввод адреса в список. */ void enter(void) { int slot; char s[80];
slot = find_free();
if(slot==-1) { printf("\nСписо заполнен"); return; }
printf("Введите имя: "); gets(addr_list[slot].name);
printf("Введите улицу: "); gets(addr_list[slot].street);
printf("Введите город: "); gets(addr_list[slot].city);
printf("Введите штат: "); gets(addr_list[slot].state);
printf("Введите почтовый индекс: "); gets(s); addr_list[slot].zip = strtoul(s, '\0', 10); }
/* Поиск свободной структуры. */ int find_free(void) { register int t;
for(t=0; addr_list[t].name[0] && t<MAX; ++t) ;
if(t==MAX) return -1; /* свободных структур нет */ return t; }
/* Удаление адреса. */ void delete(void) { register int slot; char s[80];
printf("Введите № записи: "); gets(s); slot = atoi(s);
if(slot>=0 && slot < MAX) addr_list[slot].name[0] = '\0'; }
/* Вывод списка на экран. */ void list(void) { register int t;
for(t=0; t<MAX; ++t) { if(addr_list[t].name[0]) { printf("%s\n", addr_list[t].name); printf("%s\n", addr_list[t].street); printf("%s\n", addr_list[t].city); printf("%s\n", addr_list[t].state); printf("%lu\n\n", addr_list[t].zip); } } printf("\n\n"); } |
|
|
