- •Линейные и разветвляющиеся вычислительные процессы Краткие теоретические сведения
- •Классификация данных
- •Декларирование объектов
- •Структура программы
- •Константы
- •Операции Операции выражения
- •Арифметические операции
- •Операция присваивания
- •Сокращенная запись операции присваивания
- •X##; - постфиксную.
- •Преобразование типов операндов арифметических операций
- •Операция приведения типа
- •Операции сравнения
- •Логические операции
- •Побитовые логические операции, операции над битами
- •Операция «,» (запятая)
- •Функции вывода информации
- •Функции ввода информации
- •Ввод - вывод потоками
- •Стандартные математические функции
- •Синтаксис операторов языка Си
- •Операция присваивания
- •Условные операторы
- •If (условие ) оператор1;
- •If (условие1) оператор1;
- •Условная операция "? :"
- •Оператор выбора switch
- •Программирование циклических вычислительных процессов
- •Циклические операторы while и do–while
- •Вложенные циклы
- •Программирование циклических вычислительных процессов с использованием одномерных массивов и строк Краткие теоретические сведения
- •Строки, как одномерные массивы символов
- •Указатели и операции над адресами
- •Операции над указателями (адресная арифметика)
- •Связь указателей и массивов
- •Пример 1: Упорядочить по алфавиту массив строк (не более 20) длиной не более 10 символов в каждой:
- •Многомерные массивы, динамическое распределение памяти Краткие теоретические сведения
- •Массивы указателей
- •Указатели на указатели
- •Динамическое размещение данных
- •Проверить, является ли введенная строка полиндромом (справа-налево читается также как и слева-направо).
- •Функции пользователя Краткие теоретические сведения
- •Декларация функций.
- •Вызов функции.
- •Изменение значений параметров.
- •Область действия переменных
- •Классы памяти.
- •Рекурсивные функции.
- •Операция typedef
- •Указатели на функции
- •Примеры работы с функциями
- •Программирование алгоритмов с использованием структур Краткие теоретические сведения Структуры
- •Декларация структурного типа данных
- •Создание структурных переменных
- •Обращение к полям структур
- •Вложенные структуры
- •Использование typedef
- •Массивы структур
- •Размещение структурных переменных в памяти
- •Пример на использование структур
Обращение к полям структур
Обращение к элементам структур производится посредством:
а) операции принадлежности (.) в виде:
имя_структуры_или_объединения.имя_элемента
или
(*указатель_структуры_или_объединения).имя_элемента
б) операции косвенной адресации (->) в виде:
указатель_структуры_или_объединения -> имя_элемента
Например:
Объявляем переменную и указатель на переменные структуры
Stud_Types1, *s2;
обращаемся к полям структуры:
s1. Number;
s1. Fio;
s1. S_b;
или
s2 -> Number,
s2 -> Fio;
s2 ->S_b;
Вложенные структуры
Структуры могут быть вложенными, т.е. поле структуры может быть связующим полем с внутренней структурой, описание которой должно предшествовать по отношению к основному шаблону.
Например, в структуреperson, содержащей Ф.И.О. и дату рождения, сделать дату рождения внутренней структуройdateпо отношению к структуре person. Шаблон такой конструкции будет выглядеть следующим образом:
structdate
{
intday,month,year;
};
struct person
{
char fio[40];
struct date f1;
} ;
Объявляем переменную и указатель на переменные такой структуры:
struct person a, *p;
Инициализируем указатель pадресом переменнойа:
p = &a;
Тогда обращение к полям структурной переменной aбудет следующим:
a .fio
a.f1.day
a.f1.month
a.f1.year
или
p->fio
p->f1.day
p->f1.month
p->f1.year
Использование typedef
Использование typedef упрощает определение структурных переменных, например:
typedef struct person
{
char fio[40];
int day, month, year;
} W ;
здесь W- созданный пользователем тип данных -структура с указанными полями,и для нашего примера:
Wt1, t2; - декларация двух переменныхt1,t2 типаW.
Массивы структур
Структурный тип может быть использован для декларации массивов, элементами которых являются структурные переменные, например:
struct person spisok[100]; - spisok - массив структур;
или
struct person
{
char fio[40];
int day, month, year;
} spisok[100];
В данном случае обращение к полю, например, day i-й записи может быть выполнено одним из следующих способов:
spisok[i].day *(spisok+i).day (spisok+i)->day.
Размещение структурных переменных в памяти
При анализе размеров структурных переменных иногда число байт, выделенных компилятором под структурную переменную, оказывается больше, чем сумма байт ее полей. Это связано с тем, что компилятор выделяет участок памяти для структурных переменных с учетом выравнивания, добавляя между полями пустые байты по следующим правилам:
структурные переменные, являющиеся элементами массива, начинаются на границе слова, т.е. с четного адреса;
любое поле структурной переменной начинается на границе слова, т.е. с четного адреса и имеет четное смещение по отношению к началу переменной;
при необходимости в конец переменной добавляется пустой байт, чтобы общее число байт было четное.
Некоторые особенности:
поля структуры, как правило, имеют разный тип, кроме функций, файлов и самой этой структуры;
поля не могут иметь атрибут класс памяти, данный атрибут можно определить только для всей структуры;
идентификаторы как самой структуры, так и ее полей могут совпадать с идентификатарами других объектов программы, т.к. шаблон структуры обладает собственным пространством имен;
при наличии в программе функций пользователя шаблон структуры рекомендуется поместить глобально перед определениями всех функций, в этом случае он будет доступен всем функциям.
Элементы структур в общем случае размещаются в памяти последовательно с учетом выравнивания начальных адресов. Выравнивание - установка значения адреса, кратного некоторой величине, определяемой собенностями адресации данных на аппаратном уровне.