- •Программирование на языке высокого уровня си
- •Часть II
- •Содержание
- •Работа 1. Пользовательские функции в си
- •I. Теоретический раздел работы
- •1. Функции
- •1.1. Аргументы функций
- •1.2.Функции, возвращающие значения.
- •1.3. Функция main ()
- •2. Рекурсия.
- •II. Экспериментальный раздел работы
- •III. Задания для самостоятельной работы
- •Работа 2. Структурированный тип данных массив
- •I. Теоретический раздел работы
- •1.1. Структурированный тип данных массив
- •1.2. Передача массива в качестве параметра
- •1.3. Многомерные массивы
- •II. Экспериментальный раздел
- •III. Задания для самостоятельной работы.
- •Работа 3. Символьный и строковый типы данных
- •1.1. Символьный тип данных
- •Работа 4. Структуры
- •I. Теоретический раздел работы
- •1.1. Структура
- •1.2. Объединение
- •1.3. Переименование типов
- •II. Экспериментальный раздел работы
- •III. Задания для самостоятельной работы
- •Работа 5. Работа с файлами
- •I. Теоретический раздел работы
- •1.1.Введение
- •1.1. Потоковый ввод-вывод
- •1.2. Открытие и закрытие потока
- •1.3. Стандартные файлы и функции для работы с ними.
- •1.4. Форматированный ввод-вывод
- •1.5. Прямой доступ к файлам
- •II. Экспериментальный раздел работы.
- •III. Задания для самостоятельной работы
- •Список литературы
- •Учебное издание
- •Часть II
Работа 4. Структуры
Цель работы:
– изучить способы задания структур;
– сравнить структуры и объединения;
– сравнить эффективность решения задач с применением структур и массивов;
I. Теоретический раздел работы
Кроме известных типов данных языка С позволяется создавать ещё несколько типов данных:
- структуры;
- объединения;
- перечисляемый тип (см. лаб. раб. № 3);
- поля битов;
- использование оператора typedef с целью создания нового имени для уже существующих типов.
1.1. Структура
Часто в программировании необходимо объединить разнородные, но логически связанные данные. Например, наш домашний адрес состоит из целых чисел: номеров квартиры, дома, почтового индекса, а также из названий: улицы, города, страны. В языке С для представления разнородных данных служит структурированный тип, который так и называется структурой или комбинированным типом данных.
Структуры, как и массивы, используются для описания упорядоченной совокупности величин. Во многом они схожи, но в отличие от массива, где все компоненты должны быть одного и того же типа, структуры обычно содержат компоненты различных типов. В случае массива переменная с индексами однозначно определяет требуемый элемент. Структура объединяет несколько переменных, возможно разного типа. Переменные, которые объединены структурой, называются членами, элементами или полями структуры.
Пример определения структуры:
struct student {
char name[30];
int kurs;
char group[3];
int stp;
}
Объявление структуры является оператором, и поэтому в конце должна стоять точка с запятой. При этом пока никакая переменная не объявлена. Выделения памяти под переменную не произошло. Под именем student задан частный вид структуры; говорят, что задан шаблон структуры и определен новый тип struct student. Для того чтобы объявить конкретные переменные типа struct student, можно написать
struct sudent studl, stud2;
Теперь объявлены две переменные - studl и stud2. Компилятор автоматически выделит под них место в памяти компьютера. Под каждую из переменных типа структуры выделяется непрерывный участок памяти. Задание шаблона структуры и объявление переменных может производиться и в одном операторе:
struct student {
char name[30];
char kurs;
char group[3];
int stip;
} stud1, stud2;
Здесь одновременно задается структура с именем student и объявляются переменные stud1 и stud2.
Доступ к конкретному элементу структуры осуществляется с помощью операции "точка". Например, stud1.name="Иванов М. С.";
Структуры, как и переменные другого типа, могут объединяться в массивы структур. Чтобы объявить массив структур, надо сначала задать шаблон структуры (у нас уже есть шаблон student), а затем объявить массив:
struct student studlkurs[200];
Этот оператор создаст в памяти 200 переменных типа структуры с шаблоном студент и именами studlkurs[0], studlkurs[l] и т. д.
Для доступа к полю kurs 25-го элемента массива используем studlkurs[24].kurs
Если объявлены две переменные типа структуры с одним шаблоном, можно сделать присваивание
studl=stud2; при этом произойдет побитовое копирование каждого поля одной переменной в соответствующее поле другой структуры. В то же время нельзя использовать операцию присваивания переменных типа структуры, шаблоны которых описаны под разными именами, пусть даже совсем идентично:
Переменная типа структуры может быть глобальной, локальной переменной и формальным параметром. Можно, естественно, использовать структуру или ее элемент структуры как любую другую переменную в качестве параметра функции.
Чтобы завершить разговор о структурах, надо добавить, что в качестве элементов структуры можно использовать массивы, структуры и массивы структур.
Пусть объявления переменных имеют вид
struct addr {
char city[30];
char street[30];
int house;
}
struct fulladdr {
struct addr addres;
int room;
char name[30];
} f,g;
Здесь addr - шаблон структуры, определенный перед объявлением структуры fulladdr и объявлением переменной f типа структуры fulladdr. Для присвоения значения элементу house структуры addres переменной f используем
a.addres.house=101;