- •Красноярск
- •Федеральное агентство по образованию гоу впо «Сибирский государственный технологический университет»
- •220301 Автоматизация технологических процессов и производств,
- •230201 Информационные системы и технологии,
- •230105 Программное обеспечение вычислительной техники и автоматизированных систем всех форм обучения Красноярск
- •Содержание
- •Введение
- •1 Состав языка
- •1.1 Алфавит языка
- •1.2 Идентификаторы
- •1.3 Ключевые слова
- •1.4 Знаки операций
- •1.5 Константы
- •1.6 Комментарии
- •2.1 Концепция типа данных
- •2.2 Основные типы данных
- •3 Структура программы
- •4 Ввод/вывод
- •5 Переменные и выражения
- •5.1 Переменные
- •5.2 Операции
- •5.3 Выражения
- •6 Базовые конструкции структурного программирования
- •6.1 Оператор «выражение»
- •6.1.1 Задачи для решения на тему «линейные алгоритмы»
- •6.2 Операторы ветвления
- •6.2.1 Условный оператор if
- •6.2.2 Оператор switch
- •6.2.3 Задачи для решения на тему «условные алгоритмы»
- •6.3 Операторы цикла
- •6.3.1 Цикл с предусловием (while)
- •6.3.2 Цикл с постусловием (do while)
- •6.3.3 Цикл с параметром (for)
- •6.3.4 Задачи для решения на тему «сочетание цикла и разветвления»
- •6.4 Операторы передачи управления
- •6.4.1 Оператор goto
- •6.4.2 Оператор break
- •6.4.3 Оператор continue
- •6.4.4 Оператор return
- •6.4.5 Задачи для решения на тему «вложенные циклы (вычисление суммы ряда)»
- •7 Указатели и массивы
- •7.1 Указатели
- •7.1.1 Инициализация указателей
- •7.1.2 Операции с указателями
- •7.2 Ссылки
- •7.3 Массивы
- •7.3.1 Задачи для решения на тему «одномерные массивы»
- •7.3.2 Задачи для решения на тему «двумерные массивы»
- •7.4 Строки
- •7.4.1 Функции стандартной библиотеки
- •7.4.2 Задачи для решения на тему «строки»
- •8.1 Переименование типов (typedef)
- •8.2 Перечисления (enum)
- •8.3 Структуры (struct)
- •8.4 Битовые поля
- •8.5 Задачи для решения на тему «структуры»
- •9 Функции
- •9.1 Объявление и определение функций
- •9.2 Глобальные переменные
- •9.3 Возвращаемое значение
- •9.4 Параметры функции
- •9.5 Передача массивов в качестве параметров
- •9.6 Параметры со значениями по умолчанию
- •9.7 Функции с переменным числом параметров
- •9.8 Рекурсивные функции
- •9.9 Задачи для решения на тему «функции»
- •10 Директивы препроцессора
- •10.1 Директива #include
- •10.2 Директива #define
- •11 Динамические структуры данных
- •11.1 Линейные списки
- •11.2 Стеки
- •11.3 Очереди
- •11.4 Бинарные деревья
- •11.5 Задачи на тему «динамические структуры»
- •Задание на курсовую работу
- •Библиографический список
- •660049, Красноярск, пр. Мира, 82
8.3 Структуры (struct)
В отличие от массива, все элементы которого однотипны, структура может содержать элементы разных типов. В языке С++ структура является видом класса и обладает всеми его свойствами, но во многих случаях достаточно использовать структуры так, как они определены в языке С:
struct [ имя_типа ] {
тип_1 элемент_1;
тип_2 элемент_2;
…
тип_n элемент_n;
} [ список_описателей ];
Элементы структуры называются полями структуры и могут иметь любой тип, кроме типа этой же структуры, но могут быть указателями на него. Если отсутствует имя типа, должен быть указан список описателей переменных, указателей или массивов. В этом случае описание структуры служит определением элементов этого списка:
// Определение массива структур и указателя на структуру:
struct {
char fio[30];
int date, code;
double salary;
} staff[100], *ps;
Если список отсутствует, описание структуры определяет новый тип, имя которого можно использовать в дальнейшем наряду со стандартными типами, например:
struct Worker{ // описание нового типа Worker
char fio[30];
int date, code;
double salary;
}; // описание заканчивается точкой с запятой
// определение массива типа Worker и указателя на тип Worker:
Worker staff[100], *ps;
Имя структуры можно использовать сразу после его объявления (определение можно дать позднее) в тех случаях, когда компилятору не требуется знать размер структуры, например:
struct List; // объявление структуры List
struct Link{
List *p; // указатель на структуру List
Link *prev, *succ; // указатели на структуру Link
}:
struct List { /* определение структуры List */};
Это позволяет создавать связные списки структур.
Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания:
struct{
char fio[30];
int date, code;
double salary;
} worker = {"Страусенко", 31, 215, 3400.55};
При инициализации массивов структур следует заключать в фигурные скобки каждый элемент массива (учитывая, что многомерный массив - это массив массивов):
struct complex{
float real, im;
} compl [2][3] = {
{{1, 1}, {1, 1}, {1, 1}}, // строка 1, то есть массив compl[0]
{{2, 2}, {2, 2}, {2, 2}} // строка 2, то есть массив compl[1]
};
Для переменных одного и того же структурного типа определена операция присваивания, при этом происходит поэлементное копирование. Структуру можно передавать в функцию и возвращать в качестве значения функции.
Доступ к полям структуры выполняется с помощью операций выбора . (точка) при обращении к полю через имя структуры и -> при обращении через указатель, например:
Worker worker, staff[100], *ps;
…
worker.fio = "Страусенко";
staff[8].code = 215;
ps->salary = 0.12;
Если элементом структуры является другая структура, то доступ к ее элементам выполняется через две операции выбора:
struct A {int a; double х;};
struct В {A a; double х;} х[2];
х[0].а.а = 1;
х[1].х = 0.1;
Как видно из примера, поля разных структур могут иметь одинаковые имена, поскольку у них разная область видимости. Более того, можно объявлять в одной области видимости структуру и другой объект (например, переменную или массив) с одинаковыми именами, если при определении структурной переменной использовать слово struct, но не советую это делать - запутать компилятор труднее, чем себя.