
- •Программирование на языках высокого уровня. Алгоритмические языки
- •Содержание
- •Разработка (проектирование) одномодульных программ
- •Представление информации в языке Си
- •Массивы
- •УказатеЛи
- •Выражения и операции
- •Управляющие операторы
- •Функции
- •Типы данных, определяемые пользователем
- •Приемы программирования
- •Приложение 2. Арифметические основы компьютеров
- •Литература
Типы данных, определяемые пользователем
В реальных задачах информация, которую требуется обрабатывать, может иметь достаточно сложную структуру. Для ее адекватного представления используются типы данных, построенные на основе простых типов данных, а также массивов и указателей. Язык Си позволяет программисту определять свои типы данных и правила работы с ними.
Структуры
Структура – это тип данных, состоящий из фиксированного числа компонентов разного типа. Компоненты структуры называют полями структуры.
Пример:
// Хранение информации о рейтинге студентов
//------------------------------------------------------------------
// Правильный подход
//------------------------------------------------------------------
// Студент с точки зрения деканата (объявляем новый тип данных)
struct TStudent
{
char FIO[56]; // ФИО
char Group[10]; // название группы, например, ИВТ-160
int Year; // курс
float Rating; // рейтинг
};
// Создаем массив для хранения информации о рейтинге студентов
struct TStudent Students[100];
//------------------------------------------------------------------
// Неверный подход
//------------------------------------------------------------------
// Создаем массивы для хранения информации о рейтинге студентов
char FIO[100];
char Group[100];
int Year[100];
float Rating[100];
Над структурами возможны следующие операции:
– объявление;
– инициализация;
– присваивание (=);
– выбор поля структуры (. , ->).
Объявление структуры:
Объявление структуры включает в себя описание нового типа данных и переменной этого типа.
Замечание. В качестве поля структуры может быть задана другая структура.
Пример:
// Структура, задающая позицию точки в трехмерной системе
// координат
struct TPosition
{
int x;
int y;
int z;
};
// Структура, задающая сферу в трехмерной системе координат
struct TSphere
{
struct TPosition Center; // центр сферы
int Radius; // радиус сферы
int Color; // цвет сферы
};
// Объявляем указатель на структуру данных
struct TStudent *Student;
struct TSphere *Sphere;
Замечание. Размер структуры не обязательно равен сумме ее элементов (может быть больше).
Инициализация структуры:
// Создаем студента
struct TStudent Ivanov= {“Иванов А. А.”, “ИВТ-160”, 1, 20.6};
// Создаем студентов
struct TStudent Students[2]= {{“Иванов А. А.”, “ИВТ-160”, 1, 20.6},
{“Петров Б. Б.”, “ИВТ-160”, 1, 17.5}};
Присваивание структуры:
Присваивание возможно для переменных одного и того же структурного типа, при этом происходит поэлементное копирование данных.
Пример:
// В результате первый и второй элемент массива становятся равными
Students[1]= Ivanov;
Доступ к полям структуры:
Доступ к полям структуры осуществляется с помощью оператора выбора. При этом имеется два варианта написания данного оператора: ., ->. Второй вариант используется при работе с указателем на структуру.
Пример:
struct TStudent Ivanov;
struct TStudent *Student;
// Записываем информацию о студенте
strcpy(Ivanov.FIO, “Иванов А. А.”);
strcpy(Ivanov.Group, “ИВТ-160”);
Ivanov.Year= 1;
Ivanov.Rating= 16.5;
Student= &Ivanov;
Student->Rating= 20.6; // аналогично (*Student).Rating= 20.6;
Пример:
struct TSphere Sphere;
// Записываем информацию о сфере
// Задаем центр координат
Sphere.Centre.x= 10;
Sphere.Centre.y= 20;
Sphere.Centre.z= 0;
// Задаем остальные свойства сферы
Sphere.Radius= 300;
Sphere.Color= 145;
Структуру можно передавать в функцию и возвращать в качестве значения функции.
Замечание. Если в структуру данных входит массив и структура передается в функцию по значению, то и массив передается по значению, т.е. создается копия массива.
Окончание занятия №23 (лекция) |
Объединения
Объединение представляет собой частный случай структуры, все поля которой располагаются по одному адресу.
Объединение описывает переменную, которая может иметь любой из множества типов.
В каждый момент времени в переменной типа объединение хранится только одно значение, и ответственность за его правильное использование лежит на программисте.
Размер объединения определяется размером его наибольшего поля.
Пример:
// Ответ на вопрос в анкете: либо номер ответа, либо произвольная
// строка с ответом пользователя
struct TAnswer
{
char Type; // тип ответа: 1 – номер предопределенного ответа
// 0 – произвольная строка с ответом пользователя
union
{
char Number; // либо номер ответа
char String[30]; // либо строка с произвольным ответом
} Contents;
};
// Ответы на вопросы анкеты
struct TAnswer Answers[10];
// Записали предопределенный ответ
Answers[0].Type= 1;
scanf(“%d”, &Answers[0].Contents.Number);
// Записали произвольный ответ
Answers[1].Type= 0;
scanf(“%s”, Answers[1].String);
Перечисления
При написании программ часто возникает потребность определить несколько именованных констант. Для этого удобно воспользоваться перечисляемым типом данных, все возможные значения которого задаются списком целочисленных констант.
Пример:
enum Key {Esc= 0x011b, Enter= 0x1c0d};
enum Key key;
while(bioskey(1)==0);
key= bioskey(0);
switch(key)
{
case Esc:
printf(“Нажали Esc”);
break;
case Enter:
printf(“Нажали Enter”);
break;
}
При выполнении арифметических операций перечисления преобразуются в целые числа.
Переименование типов
С помощью ключевого слова typedef типу данных можно задать новое имя. Переименование типов в основном используется для задания более коротких псевдонимов.
Пример:
typedef unsigned int UINT;
UINT i; // переменная типа unsigned int
Окончание занятия №24 (практика) |