- •11. Операторы. Дополнение 135
- •12. Передача данных потоком 145
- •13. Файлы 149
- •14. Структура программы 157
- •15. Указатели, массивы, строки 170
- •16. Работа с экраhом 179
- •Задачи 185
- •Приложения 197
- •Библиографический список 224 введение
- •1. Основные понятия и определения
- •1.1. Компьютер
- •Процессор
- •Периферия
- •1.2. Алгоритмы
- •1.3. Программы и языки
- •Основные понятия языка программирования
- •Выполнение программы
- •Машинный и алгоритмический языки
- •Метаобозначения
- •Этапы обработки программы на компьютере
- •Терминология
- •Трансляция
- •Редактирование связей (компоновка)
- •Загрузка
- •1.4. Данные
- •Системы счисления
- •Типы и совокупности данных
- •Вещественные
- •Логические
- •Совокупности данных
- •2. Элементы языка
- •2.1. История языков с и Basic
- •2.2. Алфавит
- •2.3. Идентификаторы
- •2.4. Знаки разрядки
- •2.5. Комментарии
- •Могут ставиться везде, где допустим знак разрядки. Транслятор рассматривает их как пробел.
- •2.6. Запись текста программы
- •3.1.1. Целые
- •3.1.2. Данные с плавающей точкой
- •3.1.3. Логический тип
- •3.1.4. Символьные данные
- •3.1.5. Дополнительные типы данных
- •3.2. Совокупности данных
- •3.2.1. Массивы
- •Объявления массивов
- •Обращение к элементу массива
- •3.2.2. Структуры
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •4. Выражения
- •4.1. Арифметические операторы Основные
- •Дополнительные
- •Приоритет
- •4.2. Операторы конкатенации
- •4.3. Операторы сравнения
- •4.4. Логические операторы
- •4.5. Обращение к функции
- •4.6. Встроенные функции
- •4.7. Заключительные замечания
- •5.2. Присваивание
- •5.3. Безусловный переход
- •5.4. Инструкция If. Пустая инструкция
- •5.5. Составная инструкция
- •5.6. Циклы
- •5.6.1. Циклы с предусловием
- •Циклы while
- •Циклы for
- •5.6.2. Циклы с постусловием
- •5.6.3. Вложенные циклы
- •5.7. Управляемые переходы
- •5.7.1. Инструкция break
- •5.7.2. Инструкция continue
- •5.7.3. Инструкции exit и continue
- •5.8. Многоальтернативный выбор
- •5.8.1. Инструкция switch (язык с)
- •5.8.2. Инструкция select case (язык Basic)
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •6. Ввод-вывод
- •6.1. Язык Си
- •6.1.1. Управляющая строка
- •6.1.1.1. Спецификация d (целые десятичные числа)
- •6.1.1.2. Спецификация f (десятичные числа с плавающей точкой)
- •6.1.1.3. Спецификация e (десятичные числа с плавающей точкой)
- •6.1.1.4. Спецификация g (универсальная спецификация)
- •6.1.2. Вывод символьной информации
- •6.1.3. Инструкции printf и scanf. Схема ввода-вывода
- •6.2. Язык Basic
- •6.2.1. Метод ReadLine
- •6.2.2. Методы Write и WriteLine
- •7.1.1. Распределение скаляров
- •7 .1.2. Распределение массивов
- •7.1.3. Статическое и динамическое распределение памяти
- •7.2. Блоки
- •7.3. Процедуры
- •7.3.1. Определения процедур
- •7.3.2. Передача данных между процедурами
- •Механизмы передачи данных
- •Прототипы функций (c)
- •Передача скаляров Возвращаемое значение
- •Входные данные
- •Выходные данные
- •Передача массивов
- •Передача функций
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •8. Препроцессор
- •8.1. Определение символических констант
- •8.2. Включение файлов в текст программы
- •9.1. Формирование листинга
- •Перенос:
- •9.2. Комментарии
- •9.3. Имена Имена объектов программы должны быть осмысленными.
- •3. Литералы.
- •9. Ввод-вывод:
- •10.5. Подмассивы (сечения) (c)
- •10.6. Динамические массивы (b)
- •10.7. Структуры и объединения
- •10.7.1. Структуры
- •10.7.3. Поля битов (с)
- •10.7.4. Объединения (смеси) (с)
- •10.7.5. Переменные структуры
- •10.10. Пользовательские типы данных
- •10.11. Преобразование типов
- •10.10.1. Автоматические преобразования
- •10.10.2. Явные преобразования
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •11. Операторы. Дополнение
- •11.1. Уровень 1
- •11.2. Уровень 2 (унарные или одноместные операторы)
- •11.3. Уровень 3 (мультипликативные операторы)
- •11.4. Уровень 4 (аддитивные операторы)
- •11.5. Уровень 5 (сдвиги)
- •11.6. Уровень 6 (отношения)
- •11.7. Уровень 7 (равенство и неравенство)
- •11.8. Поразрядные операторы
- •11.9. Логические операторы
- •11.10. Уровень 13 (условное выражение)
- •11.11. Уровень 14 (операторы присваивания)
- •11.12. Уровень 15 (оператор ',' - запятая)
- •11.13. Некоторые замечания
- •11.14. Постоянные выражения
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •12. Передача данных потоком
- •12.1. Спецификация "s" управляющей строки функций scanf и printf
- •12.2. Функции getchar и putchar
- •12.3. Функции gets и puts
- •12.4. Внутренняя передача данных (функции sscanf и sprintf)
- •13.1. Основные понятия
- •13.2. Описание файла
- •13.3. Открытие и закрытие файлов
- •13.4. Средства языка с
- •13.4.1. Открытие и закрытие файла
- •13.4.2. Основные функции обмена
- •13.5. Средства языка Basic
- •13.5.1. Открытие и закрытие файла Инструкция FileOpen
- •Инструкция FileClose
- •13.5.2. Работа с файлами Инструкция Input
- •Инструкция LineInput
- •Инструкции Write и WriteLine
- •Инструкции Print и PrintLine
- •Дополнительные функции
- •Функция MsgBox
- •14.1. Элементы структуры программы.
- •14.1.2. Язык Basic
- •14.2. Область видимости (действия) и время жизни переменных
- •14.2.1. Язык c
- •14.2.2. Язык Basic
- •14.3. Инициализация данных
- •14.3.1. Язык с
- •2. Массивы.
- •15.1. Указатели
- •Определение указателей
- •Задание значений
- •Вывод значений
- •15.2. Указатели и массивы
- •15.3. Работа со строками
- •15.3.1. Литералы
- •15.3.2. Переменные
- •15.3.3. Операторы и функции
- •15.4. Динамические объекты
- •15.5. Типичные ошибки, связанные с указателями Отсутствие инициализации указателя
- •Двойное указание
- •15.6.2. Однонаправленный список
- •15.7. Указатели и многомерные массивы
- •15.8. Рекурсивные процедуры
- •15.8.1. Рекурсивное решение
- •15.8.2. Нерекурсивное решение. Стек в виде массива
- •15.8.3. Нерекурсивное решение. Стек в виде списка
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •16. Работа с экраhом
- •16.2. Управление окном
- •16.3. Управление атрибутом (цветами символа и фона в окне)
- •16.4. Информация о текстовом режиме
- •16.5. Пример
- •Простые циклы
- •Вложенные циклы
- •Процедуры
- •Работа со строками
- •Приложения
- •П1.1. Установка среды
- •П1.2. Запуск среды
- •П1.3. Меню Файл
- •П1.4. Меню Сервис
- •П1.5. Отладка
- •Начало отладки
- •Установка точек прерывания
- •Прогон до точки прерывания
- •Пошаговое выполнение программы
- •Получение значений объектов программы
- •Приложение 2. Среда разработки Visual Basic п2.1. Запуск среды
- •П2.2. Подготовка к работе с новым проектом
- •П2.3. Окна и режимы работы
- •П2.4. Главное меню
- •П2.5. Меню File (Файл)
- •П2.6. Редактирование текста
- •П2.7. Меню View (Вид)
- •П2.8. Меню Project (Проект)
- •П2.9. Отладка
- •Точки прерывания
- •Определение значений объектов программы в момент прерывания
- •Продолжение работы
- •П2.10. Меню Tools (Сервис)
- •П2.11. Меню Window (Окно)
- •Приложение 3. Ответы на вопросы для самопроверки
- •2. Элементы языка
- •3. Элементы данных
- •4. Выражения
- •5. Основные инструкции
- •6. Ввод-вывод
- •7. Процедуры
- •8. Препроцессор
- •9. Стиль программирования
- •10. Данные. Дополнение
- •11. Операторы. Дополнение
- •12. Передача данных потоком
- •13. Файлы
- •14. Структура программы
- •15. Указатели, массивы, строки
- •16. Работа с экраном
- •Приложение 4. Темы для курсовой работы
- •Библиографический список
10.7.3. Поля битов (с)
До сих пор минимальными адресуемыми элементами программы являлись объекты размером в 1 байт. Примерами таких объектов являлись данные типа char в языке C и типа Byte в языке Basic. Однако байт содержит 8 битов (двоичных цифр). Язык C позволяет манипулировать с отдельными битами информации. Такая необходимость возникает, в основном, при программировании аппаратуры, входящей в состав ПК, или программно-аппаратного комплекса. Средством реализации такой возможности является особый вид структуры, имеющий в качестве элементов так называемые поля битов.
Записываются такие структуры следующим образом:
struct{
unsigned [<имя>]: <число битов>;
..........................
}
Пример. Формат регистра состояния ГД RX211.
struct{
unsigned error :1;
unsigned initialize :1;
unsigned addr :2;
unsigned rx02 :1;
unsigned :2;/* Hе используются */
unsigned density :1;
unsigned trreg :1;
unsigned enable :1;
unsigned done :1;
unsigned select :1;
unsigned funct :3;
unsigned go :1;
}save_211;
Поле битов без имени нулевой длины вызывает выравнивание последующих полей на границу объявленного типа данных, т.е они располагаются с адреса, кратного 32.
10.7.4. Объединения (смеси) (с)
Иногда возникает необходимость располагать в одной области памяти программные объекты разных типов и даже разной организации, например, скалярные переменные и массивы. Для этой цели используется конструкция, называемая объединением или смесью, правило объявления которой имеет вид:
union [<тип>]{
описание элемента 1;
описание элемента 2;
...................;
описание элемента n;
}[<список>];
Пример.
union{
float radius; // Окружность
float side[2]; // Прямоугольник
float triangle[3]; // Треугольник
float point[2]; // Точка
}GeomFig;
В каждый момент времени в памяти, отведенной объединению, может находиться только один элемент, т.е. память используется элементами поочередно. Размер отводимой памяти определяется размером наиболее "длинного" элемента. В примере это "треугольник" – 12 байтов.
Заметим, что обобщением понятия объединения является тип данных Object в языке Basic.
10.7.5. Переменные структуры
Переменной называют структуру, в состав которой входит хотя бы 1 смесь.
Общая схема построения такой структуры следующая:
struct{
общие компоненты,
признак активной компоненты (тэг),
union{
переменные компоненты
}<имя>;
........................................................
}<имя структуры>;
Тэгом называют переменную, значение которой определяет, какой элемент объединения занимает память в данный момент.
Пример.
Паспортные данные:
- фамилия имя отчество,
- серия,номер,
- дата рождения,
- место рождения,
- национальность,
- прописка,
- семейное положение:холост|женат|разведен,
- переменная часть,
- военнообязанный:да|нет.
enum sem_pol{holost, genat, razveden};
struct pasport{
char fio[30];
char nomer[12];
data birthdate;
char mesto[15];
char nation[15];
char propis[40];
enum sem_pol pr;
union{
/* холост - пусто */
/* женат */
struct{
data svadba;
char wife_fio[30];
unsigned chislo_children;
struct{
char name[15];
char pol;
struct data birthdate;
}children[PAZMEP];
}sostav;
/* разведен */
data razvod_day;
}sem_sost;
unsigned char priziv;
};
Весьма вероятно, что подобные структуры можно реализовать и в языке Basic, используя вместо union тип Object.
10.8. Тип object (B)
Данные типа Object могут содержать значения других типов данных во время выполнения одной программы. Переменные этого типа или, вообще, не имеют определения (неявное объявление) или объявляются с ключевым словом Object: Dim <имя_переменной> As Oblect.
Переменная такого типа содержит адрес объекта, который был ей присвоен. Этот адрес всегда занимает 4 байта памяти, однако надо иметь в виду, что под само значение также выделяется память.Таким образом можно считать, что переменная типа Object занимает 4 байта+объем под значение. В выражениях переменные типа Object ведут себя в соответствии с типом присвоенного значения. Если было присвоено значение типа Integer, то переменная работает как целая, если – типа String, то – как строка. Транслятор сам распознает внутренний тип переменной.
Замечание. На первый взгляд применение данных этого типа удобно. Их можно не объявлять, не думать о преобразованиях значений в выражениях, предоставляя это транслятору. Однако есть следующие возражения:
- данные занимают, в общем случае, больше памяти, чем переменные обычных типов;
- их употребление может привести к труднообнаруживаемым ошибкам.
Например, оператор "+" применим и к числовым, и к строковым данным. В первом случае он выполняет операцию сложения, во втором – сцепление.
Пример.
a="10"
b="11"
a+b "1011"
b=11
a+b 21
Если один операнд типа Object содержит числовое значение, а второй – строковое, то второй операнд будет преобразован в число, если это возможно, если нет, то возникнет ошибка Type mismatch (Несогласование типов). При необходимости получения строкового результата нужно использовать оператор "&".
Рекомендация. По возможности не следует использовать данные типа Object. По крайней мере, это надо делать при достаточном опыте программирования.
10.9. Тип delegate (B)
Этот тип может выполнять ту же функцию, что объект языка C++ - указатель на функцию. Он является описанием и объявляется на уровне модуля вне процедур как новый тип данных и доступен всем модулям программы.
Формат объявления:
Delegate {Function | Sub} <имя> ([<список параметров>]) [As <тип>]
Для подпрограммы тип возвращаемого значения отсутствует.
Пример. Объявление типа UndInteg для вызова любой функции (метода), принимающей 1 параметр типа Double и возвращающей значение типа Double. См. интегрирование методом трапеций в разделе 7.3.2.
Delegate Function UndInteg(ByVal x As Double) As Double
Для функций, имеющих другой список параметров и тип возвращаемого значения (или его не имеющего для Sub) надо объявлять другой тип делегата.
Пример. Для обычного и максиминного умножения матриц.
Delegate Sub MultMatrix(ByVal m As Short, ByVal n As Short, _
ByVal p As Short, ByRef a(,) As Single, _
ByRef b(,) As Single, ByRef c(,) As Single)
В вызывающей процедуре должны объявляться переменные типа делегата, которым можно задавать адреса нужных функций.
Пример.
Dim DelF1 As UndInteg ' Переменная типа делегата
…………………………..
DelF1=AddressOf F1 ‘ Задание адреса функции F1
………………………….
' Передача адреса подинтегральной функции в процедуру интегрирования
y = Integr(0.15, alfa, 200, DelF1)
Функция Integr имеет следующий заголовок:
Function Integr(ByVal a As Double, ByVal b As Double, ByVal k As Short, _
ByRef F As UndInteg)
Параметр F имеет тип делегата UndInteg и может принимать адрес любой подинтегральной функции, что делает процедуру интегрирования универсальной.
