![](/user_photo/2706_HbeT2.jpg)
- •Ю.А Петров Программирование на языке высокого уровня
- •Часть 1
- •Введение
- •Задание
- •Комментарии
- •Идентификаторы
- •Ключевые слова
- •Константы
- •Управляющие последовательности
- •Строковые литералы
- •Константные выражения
- •Пунктуаторы
- •Операции
- •Задание на лабораторную работу 2 разработка программы линейной структуры Цель работы
- •Отчет по лабораторной работе должен содержать:
- •Задание
- •Замечания
- •Варианты заданий
- •Классификация ошибок
- •Ошибки, не обнаруженные компилятором
- •Ситуации, возникающие при неверных результатах
- •Отладка программы
- •Предупреждения
- •Первое сообщение об ошибке
- •Использование команд Find и Replace
- •Быстрое обнаружение ошибочных строк
- •Продолжение отладки
- •Использование встроенного отладчика
- •Разница между командами Step Into и Step Over
- •Дополнительные средства отладки
- •Работа с точками останова
- •Краткая характеристика объектов
- •Формат 1:
- •Стиль программирования
- •Задание на лабораторную работу 4 объекты и их характеристики Цель работы
- •В отчете по лабораторной работе следует представить:
- •5 Структурное программирование
- •Пример1
- •Пример 2
- •Задание на лабораторную работу 5 разработка программы со структурой «развилка» Цель работы
- •Задание:
- •Варианты задания
- •Задание на лабораторную работу 6 создание цикловых программ с фиксированным числом повторений Цель работы
- •Задание
- •Варианты задания
- •Задание на лабораторную работу 7 создание программ с итерационными циклами Цель работы
- •Задание
- •Варианты задания
- •Пояснения к выполнению лабораторной работы 7
- •6 Агрегаты данных
- •Структура
- •Объединения
- •Перечисления
- •Int array[3]; // Объявление определения;
- •Многомерные массивы
- •Вывод в файловый поток
- •Чтение из входного файлового потока
- •Чтение целой строки файлового ввода
- •Определение конца файла
- •Проверка ошибок при выполнении файловых операций
- •Закрытие файла
- •Управление открытием файла
- •Выполнение операций чтения и записи
- •Задание на ргз 1 использование структур данных при решении задач Цель работы
- •Задание
- •Варианты задания
- •7 Модульное программирование
- •Задание на ргз 2 использование модульного программирования при решении задач
- •Перемещаемые панели инструментов
- •Меню File
- •Меню Edit
- •Меню View
- •Меню Insert
- •Меню Project
- •Меню Build
- •Меню Tools
- •Меню Window
- •Список открытых окон
- •Меню Help
- •Приложение 2 Некоторые функции языка с
- •Используемая литература
- •Оглавление
- •5 Структурное программирование 53
Объединения
Объединения являются производными типами, разделяющими многие синтаксические и функциональные свойства типов структур. Главное различие между ними состоит в том, что объединение позволяет быть «активным» одновременно только одному компоненту. Размер объединения равен, таким образом, размеру своего максимального компонента. Одновременно в памяти может находиться значение только одного компонента объединения. В следующем простом случае:
union myunion { /* тег объединения = myunion */
int i;
double d;
char ch;
} mu, *muptr=μ
идентификатор mu типа union myunion может быть использован для хранения 2(4)-байтового значения int, 8-байтового значения double или 1-байтового char, но одновременно – только одного из этих значений.
Обе операции sizeof(union myunion) и sizeof (mu) возвращают значение 8, но когда mu содержит объект типа int, то 6(4) байт остаются неиспользованными (туда помещаются символы-заполнители), а когда mu содержит объект типа char, то неиспользованными являются 7 байт. Доступ к компонентам объединения выполняется при помощи выбора компонента структуры (.) и (->), но требуется соблюдать осторожность. Например:
mu.d = 4.016;
printf("mu.d = %fl\n",mu.d);// напечатает mu.d = 4.016;
printf("mu.i = %d\n",mu.i);// Формат double печатается как int, что неверно!
mu.сh = 'A';
printf("mu.ch = %c\n",mu.ch); // напечатает mu.ch = A;
printf("mu.d = %fl\n",mu.d); // Формат char печатается как double, что неверно!
muptr->i = 3;
printf("mu.i = %d\n",mu.i); // напечатает mu.i = 3;
Второе предложение printf() допустимо, поскольку mu.i целочисленного типа. Однако целочисленная битовая комбинация в mu.i выбирает только биты, соответствующие типу int, из поля, в котором записаны биты формата double.
Общий синтаксис объявления объединений во многом напоминает синтаксис объявления структур
Перечисления
Тип перечисления служит для обеспечения мнемонических идентификаторов целочисленных переменных. Например, следующее объявление:
enum days { sun, mon, tues, wed, thur, fri, sat } anyday;
устанавливает уникальный интегральный тип enum days, переменную anyday этого типа и набор нумераторов (sun,mon,...), которым соответствуют целочисленные константы.
Идентификаторы, используемые в списке нумераторов, неявно получают тип signed char, unsigned char или int, в зависимости от значений нумераторов. Если все значения могут быть представлены типом signed или unsigned char, то это и будет типом каждого нумератора.
В языке С переменной перечислимого типа может быть присвоено любое значение типа int, кроме этого никакого контроля типа не выполняется. В языке С++ переменной перечислимого типа может присваиваться только значение одного из ее нумераторов. Например:
anyday = mon; // так можно
anyday = 1; // так нельзя, даже хотя mon == 1
Идентификатор days является тегом перечислимого типа, который можно использовать в последующих объявлениях переменных перечислимого типа enum days. Например:
enum days payday, holiday; // объявление двух переменных.
В языке С++ ключевое слово enum можно опустить, если в пределах данного контекста имя days не дублируется.
Как и в случае объявлений struct и union, если далее переменные данного типа enum не требуются, тег может быть опущен:
enum { sun, mon, tues, wed, thur, fri, sat } anyday; /* анонимный тип enum */
Подробное описание констант перечислимого типа было выполнено в разд. 2 и 4.
Нумераторы, перечисленные внутри фигурных скобок, называются перечислимыми константами. Каждой из них назначается фиксированное значение. При отсутствии явно заданных инициализаторов первый нумератор (sun) устанавливается в ноль, а каждый последующий нумератор имеет значение на единицу больше, чем предыдущий (mon = 1, tue = 2 и т.д.).
При наличии явных интегральных инициализаторов можно устанавливать один или более нумераторов в конкретные значения. Любые последующие имена без инициализаторов будут получать приращение в единицу. Например, в следующем объявлении:
/* выражение инициализатора может включать в себя нумераторы,
объявленные ранее */
enum coins { penny = 1, tuppence, nickel = penny + 4, dime =10,
quarter = nickel * nickel } smallchange;
компонента tuppence примет значение 2, компонента nickel – значение 5, а quarter – значение 25.
Инициализатор может быть любым выражением, дающим положительное или отрицательное целочисленное значение (после, возможно, некоторых целочисленных преобразований.) Обычно такие значения бывают уникальными, но дублирование их не запрещено.
Тип enum может участвовать во всех конструкциях, допускающих использование типов int. Например:
enum days { sun, mon, tues, wed, thur, fri, sat } anyday;
enum days payday;
typedef enum days DAYS;
DAYS *daysptr;
int i = tues;
anyday = mon; // так можно
*daysptr = anyday; // так можно
mon = tues; // неверно: mon – это константа
Теги перечислений разделяют пространство имен с тегами структур и объединений. Нумераторы разделяют пространство имен с обычными идентификаторами переменных:
int mon = 11;
{
enum days { sun, mon, tues, wed, thur, fri, sat } anyday;
/* нумератор mon скрывает внешнее объявление int mon */
struct days { int i, j;); // неверно: дублируется тег days
double sat; // неверно: переопределение sat
}
mon = 12; // снова в контексте int mon
В языке С++ нумераторы, объявленные в пределах класса, имеют контекст этого класса.
Объявление определения
type идентификатор [<константное выражение>]
объявляет одномерный массив, состоящий из элементов одинакового типа type. Массив состоит из непрерывной области памяти, достаточной по размеру, чтобы разместить все его элементы.
Если <константное выражение> – выражение, то при его вычислении должна получаться положительная целочисленная константа. Получившееся значение представляет собой число элементов массива. Каждый из элементов массива нумеруется от 0 до числа элементов массива минус единица. Количество элементов массива является важной характеристикой массива, но не его типа. Эта характеристика называется размерностью массива.
Объявление ссылки на массив начинается с ключевого слова extern. Например, объявление определения и объявления ссылки на массив array выглядит так: