- •1. Основные этапы решения задач на эвм
- •Формулировка задачи
- •Математическая постановка задачи
- •Разработка алгоритма решения задачи
- •Написание текста программы на языке программирования
- •Базовые компоненты программ
- •Ввод текста программы в эвм
- •Поиск и устранение синтаксических ошибок
- •Тестирование программы. Поиск и устранение логических ошибок в программе
- •Этапы создания исполняемой программы
- •Буквы и цифры
- •Пробельные символы
- •Знаки пунктуации и специальные символы
- •Идентификаторы
- •Ключевые слова
- •Комментарии
- •Лексемы
- •Типы данных
- •Целые константы
- •Константы с плавающей точкой
- •Константа-символ
- •Строковые литералы
- •Универсальные функции ввода и вывода любых типов данных
- •Структуры и форма написания программы
- •Программирование разветвляющихся вычислительных процессов
- •Цикл while – цикл с предусловием.
- •Цикл do while – цикл с постусловием
- •Цикл for
- •Безусловная передача управления внутри цикла
- •Описание некоторых стандартов алгоритмов
- •Работа с файлами (функции ввода вывода верхнего уровня)
- •Указатели
- •Одномерные массивы Объявление массива.
- •Стандартные функции обработки строк
- •Многомерные массивы на примере двумерных
- •Классы памяти
- •Способы передачи данных в функцию
- •Функции и строки
- •Функции и одномерные числовые массивы
- •Функции и двумерные массивы
- •Функции с параметрами по умолчанию
- •Перегрузка функции
- •Шаблоны функции
- •Типы данных, определяемые пользователем
- •4.1. Структуры
- •Шаблон структуры
- •Структурные переменные
- •Инициализация структуры
- •Доступ к полям структуры
- •Массив структур
- •Вложенные структуры
- •Битовые поля структур
- •Передача структуры в функцию
- •Двоичный ввод-вывод структур
- •Функции двоичного ввода-вывода
- •Динамические структуры данных
- •4.2. Объединения
- •4.3. Перечисления
- •Файловые операции ввода/вывода
- •Файловый ввод/вывод с прямым доступом
4.2. Объединения
Объединения, как и структуры, являются сложным типом данных, который определяет сам программист.
Используя объединение можно размещать разные данные, описанные как поля объединения, начиная с одного и того же адреса ОП. При этом в фиксированный момент времени в ОП может быть размещено только одно из перечисленных в объединении данных.
Объединение описывается также, как и структура, со служебным словом union. Размер объединения определяется размером максимального поля.
Объединение может использоваться для:
Экономии памяти, если известно, что больше одного поля одновременно в программе не используется;
Создания неоднородных массивов данных;
Разной интерпретации одного и того же битового представления.
Продемонстрируем эти возможности на примерах.
Пример 1. Разместим в одной и той же области памяти целое число, дробное число и символ.
Union A
{
int a1;
double a2;
char a3;
} a;
Размер объединения a – 8 байт и в памяти может храниться либо целое, либо дробное, либо символ. Доступ к полям объединения осуществляется как у структур. Например:
a.a1=2;
a.a2=4.567;
a.a3=’r’;
Важным вопросом является как распознать, какое из трех данных хранится в данный момент времени. Эту задачу должен решать сам программист - например, создать дополнительно флаговую переменную, значения которой будут сигнализировать о ситуации в программе.
Пример 2. Создать массив, содержащий три вида документов.
Опишем структуры A, B, C содержащие характеристики документов.
struct A
{
…
};
struct B
{
…
};
struct C
{
…
};
union Docum
{
struct A a;
struct B b;
struct C c;
};
Объявим массив из 10 документов различного вида:
struct Data
{
char flag; //для распознания вида документа
union Docum docum; //документ одного из трех видов
} data[10];
Пример 3. При работе системной функции поиска файла на диске findfirst, информация о найденном файле заносится в структуру ffblk, где дата и время создания файла находятся в упакованном виде (в виде данного типа unsigned).
Определить имя, размер и время создания какого-либо файла из текущего каталога.
#include<iostream.h>
#include<dir.h>
struct Time
{
unsigned sec : 5;
unsigned min : 6;
unsigned hour : 5;
};
union
{
unsigned PressTime; //время в упакованном виде
struct Time time;
} t;
void main (void)
{
struct ffblk ffblk;
if( findfirst(“*.*”, &ffblk, 0)!= -1)
{
cout<<“\nИмя файла - “<< ffblk.ff_name<<endl;
cout<<” размер - ”<< ffblk.ff_fsize<<endl;
t.PressTime=ffblk.ff_ftime;
cout<<“\nВремя создания (час.мин.сек)-”<<t.time.hour<<’.’<<, t.time.min<<’.’ <<t.time.sec*2<<endl<<endl;
}
}
4.3. Перечисления
Перечисления служат для улучшения читаемости программ, и позволяет естественным образом описывать объекты.
Перечислимый тип задается перечислением набора констант. Каждой константе ставится в соответствие целое число явно или по умолчанию от 0 с шагом 1.
Характерным примером может служить перечисление COLORS, описанное в conio.h:
enum COLORS
{
BLACK,
BLUE,
GREEN,
…
YELLOW,
WHITE
};
Можно создать переменную перечислимого типа
enum COLORS colors;
Присвоить ей конкретное значение
colors=RED;
И использовать ее в программе
textcolor (colors);
Или использовать непосредственно константу перечислимого типа
textbackground (WHITE);
