- •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. Определения процедур
- •Прототипы функций (c)
- •7.3.2. Передача данных между процедурами
- •Механизмы передачи данных
- •Передача скаляров Возвращаемое значение
- •Входные данные
- •Выходные данные
- •Передача массивов
- •Передача функций
- •Вопросы для самопроверки и контроля Вопросы для самопроверки
- •Контрольные вопросы
- •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. Темы для курсовой работы
- •Библиографический список
3. Литералы.
(МВ) Для трансляторов языка C, в которых не предусмотрены логические данные, разумно ввести в программу логические литералы.
#define TRUE 1
#define FALSE 0
Не следует забывать, что логические данные в программе на языке Basic занимают в памяти 2 байта, значения хранятся в виде True (-1), False (0), а на языке C они занимают в памяти 1 байт и хранятся в виде true (1), false (0).
(В) Старайтесь избегать в тексте программы литералов, заменяйте их символическими константами с помощью директивы #define (язык C) или #const (язык Basic).
4. (В) Массивы.
Для языка C следует отметить такие особенности.
Если возможно изменение размеров массивов, определяйте их размеры с помощью директивы #define.
Пример.
#define SIZE 50
float Matrix[SIZE][SIZE];
Нижняя граница индексов всегда 0, а в описаниях массивов указываются длины измерений, а не величины верхних границ, причем длина измерения может быть только постоянным выражением.
В языке Basic для массивов, размеры которых могут изменяться, при описании используется инструкция Dim с пустыми скобками.
Пример.
Dim Matrix(,) As Single
Затем в том месте процедуры, где требуется определить границы каждого измерения, применяют инструкцию ReDim.
Пример.
ReDim Matrix(10, 10)′ 10-верхняя граница индекса
′ Память под матрицу 11х11
Такая инструкция в теле процедуры может использоваться многократно. Более подробно синтаксис и область применения инструкции ReDim будет изложена разделе 10.6. «Динамические массивы».
Минимальное значение индекса также всегда равно 0, поэтому не следует применять разрешенную правилами инструкцию вида: <имя массива>(<нижняя граница> to <верхняя граница>). Это приводит к избыточному выделению памяти.
5. (ОВ) В языке C необходимо помнить об особенностях операторов деления / и остатка % при работе с целыми операндами. При делении целого на целое результат всегда целый. Оператор % используйте только для целых операндов.
6. (В) Для логических операторов && и || в языке C вычисление выражения прекращается, как только результат определен, а для аналогичных операторов And и Or в языке Basic проверяются оба операнда.
Пример.
Выражение i<100 && x[ i ]<0 при i=100 в языке C примет значение false и выполнение программы продолжится, тогда как в языке Basic вычисление выражения i<100 Аnd x( i )<0 при тех же условиях вызовет ошибку: Subscript out of range (Индекс вне диапазона), поскольку элемента массива x(100) не существует. В подобном случае следует использовать операторы AndAlso и OrElse.
7. (ОВ) В языке C при использовании библиотечных функций не забудьте включить файл прототипов.
Пример.
#include <stdio.h>
#include <math.h>
8.(В) Не забывайте об удобных возможностях языка С: многократном присваивании, операторах: ++ -- <знак>= (для Basic тоже).
9. Ввод-вывод:
C (ОВ):
- при вводе информации функцией scanf в списке данных необходимо использовать оператор нахождения адреса &;
- не забывайте заканчивать ввод данных инструкции scanf клавишей Enter (закрывает буфер ввода);
- не забывайте заканчивать управляющую строку инструкции printf символом '\n' (перевод на новую строку);
- при неизвестном диапазоне выводимых значений данных с плавающей точкой используйте спецификацию g.
Basic (В)
Так как в отличие от языка С, здесь используется методы, входящие в состав класса, то для сокращения объема кода разумно использовать инструкцию Imports System.<имя класса>. Это позволит не записывать имя класса при обращении к методам этого класса.
Пример.
Imports System.Math
Imports System.Console
…………………………….
y=Cos(x)+Sin(x)
WriteLine("y={0:g5}", y)
Вопросы для самопроверки и контроля
Вопросы для самопроверки
1. Как разумно размещать инструкции текста программы?
2. Какую роль играют отступы при размещении вложенных инструкций?
3. В чем суть "венгерской" нотации имен?
4. На что, вероятно, указывает предупреждение при трансляции?
5. В чем различие в применении операторов "И" и "ИЛИ" в языках C и Basic?
6. Чем отличается действие оператора деления / в языках C и Basic?
Контрольные вопросы
1. В каких местах нужно осуществлять перенос инструкции, если она не входит в строку?
2. Перечислите типы комментариев к программе.
3. Почему нежелательно использовать в программе схожие имена?
4. Зачем нужно явно объявлять все объекты программы?
5. Почему следует избегать инструкций перехода?
6. В чем преимущество работы с массивами в языке Basic?
10. ДАННЫЕ. ДОПОЛНЕНИЕ
Материал данного раздела содержит информацию о типах и совокупностях данных, специфических для конкретного языка программирования, поэтому ниже рядом с названием раздела в скобках будет указываться принадлежность описываемой конструкции к языку: C++ и B – Basic.
10.1. Перечислимый тип
10.1.1. Тип enum (C++)
Относится к целым типам данных. Применяется для объявления целых переменных типа int, которые могут принимать только строго определенные значения, число которых можно перечислить в нужном порядке. Сначала объявляется новый тип данных:
enum <имя_типа>{<имя_элемента>[=<значение>],
[<имя_элемента> [=<значение>]]...};
Пример.
enum spectr{RED, ORANGE, YELLOW, GREEN, BLUE, VIOLET};
Затем можно определять переменные этого типа:
spectr color1, color2;
Ключевое слово 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{five=5, ten=10, fifty=50};
enum RussianRoub{One=1, Two, Five=5, Ten=10, Fifty=50, Hundred=100, FiveHundred=500, Thousand=1000, FiveThousand=5000};
enum mark{BAD=2, MIDDLE, GOOD, FINE};
Фактически разумными при работе с данными перечислимых типов являются только следующие операторы: присваивание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, color2 As spectr
Правила объявления и использования переменных этого типа полностью совпадают с правилами языка C++. Имеются только 2 отличия:
- значения переменных и перечисляемых констант относятся к типу long;
- при присвоении переменной значения не из списка констант ошибки не возникает.
10.2. Тип decimal (B)
Данные этого типа занимают в памяти 16 байтов, 12 из которых отводится для целого значения со знаком. Остальные отводятся для хранения масштабирующего коэффициента, определяющего во внешнем представлении число знаков после десятичной точки. Масштабирование выполняется при задании переменной значения.
Примерный диапазон представления (по абсолютной величине):
1e-28 – 7.93e+28.
Литералы данного типа определяются добавлением в конец значения символа d.
Значение по умолчанию (как для всех числовых типов) равно 0.
Пример объявления переменных.
Dim sum1, TotalSum as Decimal
………………………………………
sum1 = 12345.678905e-15D
После завершения ввода текста среда масштабирует введенное значение и преобразует его.
sum1 = 0.000000000012345678905D
Эти данные полезны при денежных расчетах и вычислениях с фиксированной точкой с заданной точностью и дают возможность задавать максимальное количество значащих цифр.
Замечание. До версии Visual Basic.NET (2008) в языке существовал тип данных Currency, предназначенный для проведения денежных расчетов, который относился к десятичным данным с фиксированной точкой (4 знака после точки). В связи с тем, что платформа Visual Studio является многоязыковой средой разработки (языки C++, VB, C#, F#) и требует одинаковые типы данных для них, указанный тип, начиная с версии VS2008, был заменен на тип данных Decimal.
10.3. Тип date (B)
Данные этого типа в памяти представляются специальным форматом, точно знать который нет необходимости. Каждый элемент занимает в памяти 8 байтов. Диапазон представления дат от 1 января 0001 года до 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, day2 As Date, day3 As Integer
day1 = #3/9/1999#
day2 = #3/10/2001#
day3 = day2 - day1
Получим 732.
Замечание. Visual Studio.NET различных версий является многоязыковой средой разработки, которую часто называют платформой .NET Framework или Dot NET (dot – точка). Она использует типы данных, общие для всех языков. В конкретных языках для обозначения типов данных используют псевдонимы для этих общих типов. Например, тип Short соответствует Int16, тип Integer – Int32. Для типа Date таким общим типом является DateTime. Тип DateTime предоставляет пользователю различные методы (функции) для обработки данных, содержащих даты и/или время. При обращении к ним перед именем метода должен стоять префикс Date или имя переменной типа Date, для которой выполняется манипуляция.
Ниже приводятся наиболее популярные функции, методы и свойства, которые разделены на 3 группы по виду обращения.
Обращение без префикса.
DateString – возвращает системную дату в формате mm-dd-yyyy.
TimeString – возвращает системное время в виде hh:mm:ss.
Now – возвращает системные дату и время в формате установок ОС.
DateAdd(интервал-литерал String, число, дата) – возвращает дату, отстоящую от дата на число интервалов. Возможные значения аргумента интервал:
- 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/2015#, vbMonday) 2015 ' vbMonday=2
DatePart("q", #3/9/2015#, vbMonday) 1
DatePart("m", #3/9/2015#, vbMonday) 3
DatePart("d", #3/9/2015#, vbMonday) 9
DatePart("ww", #3/9/2015#, vbMonday) 11
DatePart("w", #3/9/2015#, vbMonday) 1 ‘w – день недели
DateSerial(год, месяц, день) – возвращает значение типа Date.
Пример.
DateSerial(2014, 2, 26) 26.02.2014 0:00:00
Day(дата) – возвращает день месяца.
Weekday(дата[, 1-й день недели]) – возвращает порядковый № дня недели.
Month(дата) – возвращает № месяца.
Year(дата) – возвращает год.
Today – возвращает системную дату.
Timer – возвращает значение типа Double, показывающее количество секунд, прошедших с начала суток.
DateString – возвращает системную дату в виде строки.
Пример.
Day(#3/9/2015#) 9
Weekday(#3/9/2015#, vbMonday) 1
Month(#3/9/2015#) 3
Year(#3/9/2015#) 2015
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
Обращение с префиксом имя переменной.
Используется для преобразования значения дата/время в строку.
Data1.ToString – преобразует значение типа Date в строку.
Data1.ToShortDateString – то же в короткий формат даты.
Data1.ToLongDateString - то же в длинный формат даты.
Пример.
Dim data1As Date="26.2.2014"
data1.ToString 26.02.2014 0:00:00
data1.ToShortDateString 26.02.2014
data1.ToLongDateString 26 февраля 2014 г.
Обращение с префиксом date.
Date.IsLeapYear(год) – возвращает True, если год високосный, False, если нет.
Date.DaysInMonth(год, месяц) – возвращает число дней в месяце заданного года.
10.4. Тип void (С)
Так называемый "пустой" тип. Служит для согласования синтаксиса функций, не возвращающих значений или не имеющих аргументов.
Пример.
void putmsg( ){
printf("Hello, world!\n");
} /* End putmsg */
Этот тип также используется для формирования "универсальных" указателей void *, о которых пойдет речь в другом разделе.
