- •Оглавление
- •6. Ввод-вывод 52
- •11. Операторы. Дополнение 93
- •12. Передача данных потоком 100
- •13. Файлы 103
- •14. Структура программы 109
- •15. Указатели, массивы, строки 118
- •16. Работа с экраhом 137
- •17. Управление программой с помощью клавиатуры 151
- •Введение
- •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.1. Арифметические операторы Основные
- •Дополнительные
- •Приоритет
- •4.2. Операторы конкатенации
- •4.3. Операторы сравнения
- •4.4. Логические операторы
- •4.5. Обращение к функции
- •4.6. Встроенные функции
- •4.7. Заключительные замечания
- •5.1. Объявления
- •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
- •5.8. Многоальтернативный выбор
- •5.8.1. Инструкция switch (язык с)
- •5.8.2. Инструкция select case (язык Basic)
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •6. Ввод-вывод
- •6.1. Управляющая строка
- •6.1.1. Спецификация d (целые десятичные числа)
- •6.1.2. Спецификация f (десятичные числа с плавающей точкой)
- •6.1.3. Спецификация e (десятичные числа с плавающей точкой)
- •6.1.4. Спецификация g (универсальная спецификация)
- •6.1.5. Вывод символьной информации
- •6.2. Инструкции printf и scanf. Схема ввода-вывода
- •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. Литералы.
- •10.5. Подмассивы (сечения) (c)
- •10.6. Динамические массивы (b)
- •10.7. Структуры и объединения (c)
- •10.7.1. Структуры
- •10.7.2. Рекурсивные структуры
- •10.7.3. Поля битов
- •10.7.4. Объединения (смеси)
- •10.7.5. Переменные структуры
- •10.9. Пользовательские типы данных
- •10.9.1. Инструкция type (b)
- •10.9.2. Инструкция typedef (c)
- •10.10. Преобразование типов
- •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.2. Описание файла
- •13.3. Открытие и закрытие файлов
- •13.4. Средства языка с
- •13.4.1. Открытие и закрытие файла
- •13.4.2. Основные функции обмена
- •13.5. Средства языка Basic
- •13.5.1. Открытие и закрытие файла Инструкция open
- •Инструкция close
- •13.5.2. Работа с файлами Инструкция input
- •Функция input
- •Инструкция line input
- •Инструкция write
- •Инструкция print
- •Инструкция width
- •Длина файла
- •Функция MsgBox
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •14. Структура программы
- •14.1. Элементы структуры программы.
- •14.1.1. Язык c
- •14.1.2. Язык Basic
- •14.2. Область видимости (действия) и время жизни переменных
- •14.2.1. Язык c
- •14.2.2. Язык Basic
- •14.3. Проект программы
- •14.3.1. Использование директивы препроцессора #include
- •14.3.2. Средства управления проектом
- •14.4. Инициализация данных
- •2. Массивы.
- •15.1. Указатели
- •Определение указателей
- •Задание значений
- •Вывод значений
- •15.2. Указатели и массивы
- •15.3. Работа со строками
- •15.3.1. Литералы
- •15.3.2. Переменные
- •15.3.3. Операторы и функции
- •15.4. Динамические объекты
- •15.5. Типичные ошибки, связанные с указателями Отсутствие инициализации указателя
- •Двойное указание
- •Hе выполнено освобождение выделенной памяти
- •Задание адреса локальной (auto) переменной
- •15.6. Примеры использования указателей. Структуры данных
- •15.6.1. Стек
- •15.6.2. Однонаправленный список
- •15.7. Ссылки и многомерные массивы
- •15.8. Рекурсивные процедуры
- •15.8.1. Рекурсивное решение
- •15.8.2. Нерекурсивное решение. Стек в виде массива
- •15.8.3. Нерекурсивное решение. Стек в виде списка
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •16. Работа с экраhом
- •16.1. Текстовый режим(textmode)
- •16.1.2. Управление режимом и окном
- •16.1.3. Управление атрибутом(цветами символа и фона в окне)
- •16.1.4. Информация о текстовом режиме
- •16.1.5. Пример
- •16.1.6. Пример(продолжение)
- •16.2. Графический режим
- •16.2.1. Установка и закрытие
- •16.2.2. Форматирование Цвета
- •Битовые образы(pattern)
- •Текстовые фонты
- •Восстановление установок по умолчанию
- •16.2.3. Размещение на экране Окна
- •Координаты курсора и перемещения
- •16.2.4. Вывод на экран Текст
- •Прямоугольники
- •Эллипсы
- •Многоугольники
- •Пиксели
- •16.2.5. Дополнительные функции
- •Простые циклы
- •Вложенные циклы
- •Процедуры
- •Работа со строками
- •Приложения
- •П1.1. Меню File (Файл)
- •П1.2. Меню Options (Установки среды)
- •П1.3. Разное
- •П1.4. Редактирование текста
- •П1.5. Сообщения
- •Трансляция
- •Компоновка (редактирование связей)
- •Ошибки времени выполнения
- •П1.6. Отладка
- •Прогон до точки прерывания
- •Пошаговое выполнение программы
- •Установка точек прерывания
- •Получение значений объектов программы
- •П1.7. Окна
- •Управление окнами
- •Приложение 2. Среда разработки Visual Basic Express
- •П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. Работа с экраном
- •17. Управление программой с помощью клавиатуры
- •Приложение 4. Темы для курсовой работы
- •Библиографический список
3. Литералы.
(МВ) Для трансляторов языка C, в которых не предусмотрены логические данные, разумно ввести в программу логические литералы.
#define TRUE 1
#define FALSE 0
Не следует забывать, что логические данные в программе на языке Basic занимают в памяти 2 байта, значения хранятся в виде true (-1), false (0), а на языке C они занимают в памяти 1 байт и хранятся в виде true (1), false (0).
(В) Старайтесь избегать в тексте программы литералов, заменяйте их символическими константами с помощью директивы #define (язык C).
4. (В) Массивы.
Для языка C следует отметить такие особенности.
Если возможно изменение размеров массивов, определяйте их размеры с помощью директивы #define.
Пример.
#define PAZM 5
float Matrix[PAZM][PAZM];
Нижняя граница индексов всегда 0, а в описаниях массивов указываются длины измерений, а не величины верхних границ, причем длина измерения может быть только постоянным выражением.
В языке Basic для массивов, размеры которых могут изменяться, при описании используется инструкция dim с пустыми скобками.
Пример.
Dim Matrix( ) As Single
Затем в том месте процедуры, где требуется определить число измерений и границы каждого из них, применяют инструкцию redim.
Пример.
ReDim Matrix(1 To 10, 1 To 10)
Такая инструкция в теле процедуры может использоваться многократно. Более подробно синтаксис и область применения инструкции redim будет изложена ниже.
5. (ОВ) В языке C необходимо помнить об особенностях операторов деления / и остатка % при работе с целыми операндами. При делении целого на целое результат всегда целый. Оператор % используйте только для целых операндов.
6. (В) Для логических операторов && и || в языке C вычисление выражения прекращается, как только результат определен, а для аналогичных операторов and и or в языке Basic проверяются оба операнда.
Пример.
Выражение i<100 && x[ i ]<0 при i=100 в языке C примет значение false и выполнение программы продолжится, тогда как в языке Basic вычисление выражения i<100 and x( i )<0 при тех же условиях вызовет ошибку: Subscript out of range (Индекс вне диапазона), поскольку элемента массива x(100) не существует.
7. (ОВ) В языке C при использовании библиотечных функций не забудьте включить файл прототипов.
Пример.
#include <stdio.h>
#include <math.h>
8.(В) Не забывайте об удобных возможностях языка С: многократном присваивании, операторах: ++ -- <знак>=.
9. (ОВ) Ввод-вывод (C):
- при вводе информации функцией scanf в списке данных необходимо использовать оператор нахождения адреса &;
- не забывайте заканчивать ввод данных инструкции scanf клавишей Enter;
- не забывайте заканчивать управляющую строку инструкции printf символом '\n' (перевод на новую строку);
- при неизвестном диапазоне выводимых значений данных с плавающей точкой используйте спецификацию g.
Вопросы для самопроверки и контроля
Вопросы для самопроверки
Как разумно размещать инструкции текста программы?
Какую роль играют отступы при размещении вложенных инструкций?
В чем суть "венгерской" нотации имен?
На что, вероятно, указывает предупреждение при трансляции?
В чем различие в применении операторов "И" и "ИЛИ" в языках C и Basic?
Чем отличается действие оператора деления / в языках C и Basic?
Контрольные вопросы
В каких местах нужно осуществлять перенос инструкции, если она не входит в строку?
Перечислите типы комментариев к программе.
Почему нежелательно использовать в программе схожие имена?
Зачем нужно явно объявлять все объекты программы?
Почему следует избегать инструкций перехода?
В чем преимущество работы с массивами в языке Basic?
10. ДАННЫЕ. ДОПОЛНЕНИЕ
Материал данного раздела содержит информацию о типах и совокупностях данных, специфических для конкретного языка программирования, поэтому ниже рядом с названием раздела в скобках будет указываться принадлежность описываемой конструкции к языку: C (C++) и B – Basic.
10.1. Перечислимый тип
10.1.1. Тип enum (C)
Относится к целым типам данных. Применяется для объявления целых переменных, которые могут принимать только строго определенные значения, число которых можно перечислить в нужном порядке. Сначала объявляется новый тип данных:
enum <имя_типа>{<имя_элемента>[=<значение>],
[<имя_элемента> [=<значение>]]...};
Пример.
enum spectr{RED, ORANGE, YELLOW, GREEN, BLUE, VIOLET};
Затем можно определять переменные этого типа:
[enum] spectr color1, color2;
В языке C++ указание ключевого слова enum при объявлении переменных перечислимого типа не является обязательным, если инструкция объявления этого типа записана в программе раньше. Ключевое слово enum является сокращением от enumeration – перечисление.
Запись из примера эквивалентна введению символических констант вида:
#define RED 0
#define ORANGE 1
#define YELLOW 2
#define GREEN 3
#define BLUE 4
#define VIOLET 5
Переменные типа spectr могут принимать только указанные значения. При попытке присваивания им другого значения транслятор выдает ошибку.
Пример.
color1=GREEN; // Допустимо
color2=WHITE; // Ошибка!
Если при объявлении типа символическим константам из списка не задается значений, то первая из них по умолчанию получает значение 0, последующие на 1 больше. Если какой-либо из констант задается значение, а последующим нет, то они получают следующее по порядку целое значение.
Пример.
enum RussianCop{one=1, five=5, ten=10, fifty=50};
enum RussianRoub{One=1, Two, Five=5, Ten=10, Fifty=50, Hundred=100, FiveHundred=500, Thousand=1000};
enum mark{BAD=2, MIDDLE, GOOD, FINE};
Как известно, в языке C не определен логический тип данных, однако он легко вводится с помощью объявления вида: enum bool{ false, true };
Фактически разумными при работе с данными перечислимых типов являются только следующие операторы: присваиваниеcolor1=VIOLET; и сравнениеcolor1==color2.
Заметим, что введение такого типа данных служит прежде всего для большей понятности и удобочитаемости текста программы.
10.1.2. Тип enum (B)
Практически аналогичен такому же типу языка C.
Формат объявления типа:
enum <имя_типа>
<имя_элемента>[=<значение>]
[<имя_элемента>[=<значение>] ]
.......................................................
end enum
Пример.
enum spectr
Red
Orange
Yellow
Green
Blue
Violet
end enum
Объявление переменных имеет вид:
dim color1 as spectr, color2 as spectr
Правила объявления и использования переменных этого типа полностью совпадают с правилами языка C. Имеются только 2 отличия:
- значения переменных и перечисляемых констант относятся к типу long;
- при присвоении переменной значения не из списка констант ошибки не возникает.
10.2. Тип currency (B)
Данные этого типа представляют собой десятичные значения с фиксированной точкой с 15 цифрами в целой части и 4 цифрами – в дробной. Элемент данных занимает в памяти 8 байтов. Диапазон представления:
-922,337,203,685,477.5808 - 922,337,203,685,477.5807.
Литералы данного типа не определены.
Пример объявления переменных.
dim sum1 as currency, TotalSum as currency
Эти данные полезны при денежных расчетах и вычислениях с фиксированной точкой с заданной точностью.
10.3. Тип date (B)
Данные этого типа в памяти представляются специальным форматом с плавающей точкой, точно знать который нет необходимости. Каждый элемент занимает в памяти 8 байтов. Целая часть значения хранит дату, дробная – время. Диапазон представления дат от 1 января 100 года до 31 декабря 9999 года, времени – от 0:00:00 до 23:59:59.
Литералы данного типа заключаются между символами #. Они могут записываться в различных форматах, однако после окончания ввода среда преобразует введенный формат даты/времени в формат, принятый в USA: m/d/yyyy h:mm:ss {AM|PM}, где m - № месяца (1 или 2 цифры в зависимости от значения), d - № дня в месяце (аналогично), yyyy – год, h – час (1 или 2 цифры), mm – минуты, ss – секунды, AM (ante meridiem – до полудня), PM (post meridiem – после полудня) – указатели 12-часовой шкалы.
Пример.
#01 Jan 2001# #1/1/2001#
#13:03:03# #1:03:03 PM#
#13/11/2001 5:54:56# #11/13/2001 5:54:56 AM#
Подобное преобразование может привести к ошибке. Например, запись вида #9/3/2001# будет интерпретироваться как: 3 сентября 2001 года, тогда как, возможно, имелось в виду 9 марта 2001 года (принятый в России краткий формат даты). Поэтому разумно записывать литералы даты/времени как строки. При этом преобразования формата в среде не будет.
Пример.
"09/03/2001 18:34:30" 9 марта 2001 года 6 часов 34 минут 30 секунд вечера
При выводе значений (печать, экран) используются установленные в пункте НастройкаПанель управленияЯзык и стандарты форматы (для даты – краткий, например, 11/03/2001).
Пример объявления переменных.
dim BirthDay as date
С данными этого типа можно манипулировать непосредственно. Например, разницу в датах можно получить так:
dim day1 as date, day2 as date, day3 as integer
day1 = #3/9/1999#
day2 = #3/10/2001#
day3 = day2 - day1
Получим 732 дня.
К дате можно прибавлять дни. Им соответствуют целые значения. Прибавление 1 часа – 1/24, 1 минуты – 1/(24*60), 1 секунды – 1/(24*3600).
Пример.
day2=day1+2 #3/11/1999#
При преобразовании данных различных типов в тип date значение слева от десятичной точки представляет дату, справа – время. 0 означает полночь, 0.5 – полдень. Отрицательные целые числа представляют даты до 30 декабря 1899 года.
Для облегчения манипуляций с данными типа date имеются следующие библиотечные функции:
Date – возвращает системную дату;
Time – возвращает системное время;
Now – возвращает системные дату и время.
DateAdd(интервал, число, дата) – возвращает дату, отстоящую от дата на число интервалов. Возможные значения аргумента интервал:
- yyyy – год,
- q – квартал,
- m – месяц,
- ww – неделя,
- d – день,
- h – час,
- n – минута,
- s – секунда.
Пример.
DateAdd("m", 1, #1/31/2000#) #02/29/2000#
DateDiff(интервал, дата1, дата2) – возвращает число интервалов между дата2 и дата1. Если дата1 > дата2, возвращается число < 0. Функция имеет 2 необязательных аргумента: первый день недели и первая неделя года и значение интервала = "w – день недели. Употребление этих значений изучить самостоятельно.
Пример.
DateDiff("d", #3/9/2000#, #3/10/2001#) 366
DatePart(интервал, дата) – возвращает заданную интервалом часть дата. Функция также имеет 2 необязательных аргумента: первый день недели и первая неделя года. По умолчанию первым днем недели считается Воскресенье. В примере показано как с помощью символической константы сделать первым днем Понедельник. Аналогичные константы есть и для других дней недели.
Пример.
DatePart("yyyy", #3/9/2003#, vbMonday) 2003 ' vbMonday=2
DatePart("q", #3/9/2003#, vbMonday) 1
DatePart("m", #3/9/2003#, vbMonday) 3
DatePart("d", #3/9/2003#, vbMonday) 9
DatePart("ww", #3/9/2003#, vbMonday) 10
DatePart("w", #3/9/2003#, vbMonday) 7
Day(дата) – возвращает день месяца.
Weekday(дата[, 1-й день недели]) – возвращает порядковый № дня недели.
Month(дата) – возвращает № месяца.
Year(дата) – возвращает год.
Пример.
Day(#3/9/2003#) 9
WeekDay(#3/9/2003#, 2) 7
Month(#3/9/2003#) 3
Year(#3/9/2003#) 2003
Hour(время) – возвращает целое от 0 до 23 (час аргумента).
Minute(время) – возвращает минуты (0 – 59).
Second(время) – возвращает секунды (0 – 59).
Пример.
Hour(#6:34:30 PM) 18
Minute(#6:34:30 PM) 34
Second(#6:34:30 PM) 30
10.4. Тип void (С)
Так называемый "пустой" тип. Служит для согласования синтаксиса функций, не возвращающих значений или не имеющих аргументов.
Пример.
void putmsg(void){
printf("Hello, world!\n");
} /* End putmsg */
Этот тип также используется для формирования "универсальных" указателей void *, о которых пойдет речь в другом разделе.
