- •Программирование и основы алгоритмизации
- •1. Понятие алгоритма
- •1.1. Определение алгоритма
- •1.2. Гост на описание блок-схем
- •1.3. Виды алгоритмов
- •2. Языки программирования
- •2.1. Определение алгоритмического языка
- •2.2. Классификация языков. История развития языков программирования
- •2.3. Выбор языка программирования
- •2.5. Арифметические и логические основы программирования
- •3. Понятие системы программирования
- •3.1. Этапы создания программ
- •3.2. Конструирование программ
- •3.3. Методы, технологии и инструментальные средства производства программных продуктов
- •4.1. Литералы
- •4.2. Встроенные типы данных
- •4.3. Операции
- •Адресные операции
- •Операции преобразования знака
- •Побитовые операции
- •Операция определения размера
- •Операции увеличения и уменьшения значения
- •Операции динамического распределения памяти
- •Операция доступа
- •Аддитивные операции
- •Мультипликативные операции
- •Операции сдвига
- •Поразрядные операции
- •Операции сравнения
- •Логические бинарные операции
- •Операция присваивания
- •Специальные формы операций присваивания
- •Операции выбора компонентов структурированного объекта
- •Операции обращения к компонентам класса
- •Операция управления процессом вычисления значений
- •Операция вызова функции
- •Операция явного преобразования типа
- •Операция индексации
- •4.5. Агрегатные типы данных
- •4.5.1. Массивы
- •4.5.2. Структуры
- •4.5.3. Поля битов
- •4.5.4. Объединения Используются для хранения значений различных типов в одной и той же области памяти, но не одновременно.
- •4.5.5. Перечисления
- •4.5.6. Переименование типов
- •Typedef имя ранее определенного типа имя нового типа1
- •Объявление typedef применяется для создания удобных распознаваемых имен часто встречающихся и для вложенных типов, а также, чтобы сделать программы переносимыми для различных целых типов.
- •4.6. Обработка символьных и строковых переменных
- •4.7. Указатели
- •4.7.1. Инициализация указателей
- •4.7.2. Операции с указателями
- •4.8. Пользовательские процедуры и функции
- •4.8.1. Перегрузка функций
- •4.8.2. Перегрузка операций
- •4.8.3. Шаблоны функций
- •4.8.4. Возврат из функции нескольких значений
- •4.9. Файлы
- •4.10. Директивы препроцессора
- •Библиографический список
4.5.2. Структуры
Структурой называется совокупность логически связанных переменных, возможно, различных типов, сгруппированных под одним именем.
Структура в языке С/С++ аналогична по смыслу записи в ТР. Вид ее описания:
struct <имя структуры>
{
тип <имя_поля1>; // Определение структуры
тип <имя_поля2>; // является оператором,
тип <имя_поляN>; // поэтому заканчивается
} ; // точкой с запятой.
Определение структуры является оператором, поэтому заканчивается точкой с запятой. Переменные, которые объединяются структурой, называются членами, элементами или полями структуры.
Пример определения структуры STUDENT (сведений о студенте)
struct STUDENT {
сhar Name[30];
char Groupe[5];
int Age;
};
Такая запись не задает никакой переменной и выделения памяти не производится. Под именем STUDENT задаетcя частный вид структуры или шаблон структуры, т.е. определен новый тип struсt STUDENT. Для объявления конкретных переменных этого типа можно написать:
struct <имя структуры> <список переменных>;
Пр. struct STUDENT stud1, stud2;
Переменные также могут задаваться одновременно с шаблоном
struct STUDENT {
сhar Name[30];
char Groupe[5];
int Age;
} stud1, stud2;
Теперь объявлены две переменные и компилятор автоматически выделит под них память (под каждую переменную непрерывный участок).
Внешние статические структуры можно инициировать, помещая следом за определением список начальных значений элементов:
struct stud1="Графкин Е.","В-227",18;
Доступ к элементу поля осуществляется с помощью операции "точка" или "выделения элемента": <имя_переменной_стр>.<имя_поля>
Пример. strcpy(stud2.name, "Петров К.");
Для печати содержимого поля группы элемента структуры запись будет иметь вид: printf(" %c", stud1.Grupe);
Для пятого элемента этого поля – printf("%c",stud1.Grupe[4]);
На практике структурные переменные объединяются в массивы структур. Для объявления массива структур сначала задается шаблон структуры, далее объявляется массив:
struct stud1 sudents[40]; // в памяти создается 30 переменных [0..29].
Если объявлены две переменные типа структур с одним шаблоном, то их можно присваивать друг другу: stud2=stud1;
В этом случае происходит побитовое копирование каждого поля одной структурной переменной в соответствующее поле другой переменной. Переменные типа структуры, описанные под разными именами (даже идентичные) друг другу присваивать нельзя.
Пример: void main() struct St1 m,k;
{struct St1 {int a; struct St2 l;
char b; k . a=1;
}; k . b=’f’;
struct St2 {int a; m=k; // верно
char b; l=k; // неверно
}; l . a=k . a; l . b=k . b; // верно
Переменная типа структура может быть глобальной, локальной или формальным параметром. Любое поле структуры может быть параметром функции func1(int k.a); параметром может является и адрес поля func2(int &k.a).
Можно в качестве формального параметра передать по значению всю структуру, создать указатель на структуру и передать аргумент типа структуры по ссылке. Объявление указателя на структуру имеет вид:
struct <имя структуры> * <имя указателя>;
Например, struct St*uk; // uk – переменная типа указатель на структуру St.
Если передается структура по значению, то все ее элементы заносятся в стек. Если она содержит в качестве своего элемента массив, стек может переполниться. Поэтому рекомендуется использовать ссылки. При передаче по ссылке в стек заносится только адрес структуры, при этом копирование структуры не происходит, а так же появляется возможность менять содержимое элементов.
Указателю можно присвоить адрес переменной uk=&m.
Для получения значения поля а переменной m используется операция доступа к полю:
(*uk).a или uk->a;
Структура операции доступа к полю по указателю
переменная_указатель -> имя_поля; ( перем_указ -> элемент_структуры;)
Операция "стрелка" употребляется, когда необходимо использовать значение элемента структуры с применением переменной-указателя.
В качестве элементов структуры можно использовать массивы, другие структуры, и массивы структур. Например:
struct Adr сhar
{ city[30];
int ind;
char adres[40];
};
struct STUDadr сhar Name[30];
{ struct Adr addr;
char groupe[6]; } st1, st2;
Adr-шаблон структуры, определеный перед объявлением структуры STUDadr. Для присвоения значения элементу ind структуры STUDadr значения надо записать: st1.addr.ind=50.