
- •Омск 2007
- •Введение
- •1. Этапы разработки программного обеспечения
- •2.1 Операции
- •Приоритеты операций
- •2.2 Операторы языка Си
- •9. Оператор break;
- •10. Оператор continue;
- •2.3 Перегрузка функций
- •2.4 Перегрузка операций
- •2.5 Шаблоны функций
- •2.6 Возврат из функции нескольких значений
- •2.7 Стандартные типы данных
- •Типы данных
- •2.8 Типы, определяемые пользователем
- •2.8.1 Структуры
- •2.8.2 Поля битов
- •2.8.3 Объединения Используются для хранения значений различных типов в одной и той же области памяти, но не одновременно.
- •Пример: а) union u int I; б) struct s int I;
- •2.8.4 Перечисления
- •2.8.5 Переименование типов typedef
- •Объявление typedef применяется:
- •2.9 Файлы
- •2.11 Директивы препроцессора Условная компиляция
- •Оператор defined или знак операции препроцессора
- •Директивы #ifdef и #ifndef
- •Директива #error
- •Директива #line
- •Предопределенные макросы
- •Директива #pragma
- •3. Объектно-ориентированное программирование
- •3.1 Объект
- •3.2 Управление доступом к элементам и функциям класса
- •3.3 Конструкторы и деструкторы
- •Деструктор
- •Конструктор с параметрами
- •3.4 Аргументы функций, задаваемые по умолчанию
- •3.5 Дружественные функции и классы
- •Дружественные классы
- •3.6 Наследование классов
- •3.7 Конструкторы с параметрами при наследовании
- •3.8 Множественное наследование
- •3.10 Полиморфизм
- •Ключевое слово this
- •3.11 Использование виртуальных функций
- •3.12 Виртуальные базовые классы
- •4. Организация выполнения курсовой работы
- •4.1 Этапы выполнения курсовой работы
- •4.2 Требования к пояснительной записке
- •4.3 Задания на курсовое проектирование
- •4.3.1 Проектирование пакетов прикладных программ для предприятий
- •4.3.2 Разработки для учебного процесса
- •4.3.3 Задание на разработку типового проекта - компилятора языка и стекового калькулятора
- •Индивидуальное задание
- •Состав пакета
- •Варианты заданий
- •Библиографический список
- •Курсовой проект (работа)
- •Пример оформления листа задания к курсовому проектированию
- •Задание
- •Студент Азанова Александра Александровна группа в-515
- •Аннотация
- •Оглавление
- •Структура слайд-доклада
- •Структура-компонент проекта
2.8 Типы, определяемые пользователем
Кроме рассмотренных ранее типов язык Си позволяет создавать еще 5 типов данных:
– структуры (structure);
– объединения (union);
– поля битов (bit fieldse);
– перечисления или перечислимый тип (enumeration);
– с помощью оператора typedef .
2.8.1 Структуры
Структурой называется совокупность логически связанных переменных, возможно, различных типов, сгруппированных под одним именем.
Структура в языке С/С++ аналогична по смыслу записи в ТР. Вид ее описания:
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.