рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

ОСНОВНЫЕ ПОНЯТИЯ И ОПРЕДЕЛЕНИЯ. ЭЛЕМЕНТЫ ЯЗЫКА. ЭЛЕМЕНТЫ ДАННЫХ. ВЫРАЖЕНИЯ. ОСНОВНЫЕ ИНСТРУКЦИИ. ПРОЦЕДУРЫ. ПРЕПРОЦЕССОР. СТИЛЬ ПРОГРАММИРОВАHИЯ

ОСНОВНЫЕ ПОНЯТИЯ И ОПРЕДЕЛЕНИЯ. ЭЛЕМЕНТЫ ЯЗЫКА. ЭЛЕМЕНТЫ ДАННЫХ. ВЫРАЖЕНИЯ. ОСНОВНЫЕ ИНСТРУКЦИИ. ПРОЦЕДУРЫ. ПРЕПРОЦЕССОР. СТИЛЬ ПРОГРАММИРОВАHИЯ - раздел Компьютеры, Оглавление Введение..........

Оглавление

ВВЕДЕНИЕ.................................................................................................................................... 8

1. ОСНОВНЫЕ ПОНЯТИЯ И ОПРЕДЕЛЕНИЯ.................................................................... 9

1.1. Компьютер........................................................................................................................... 9

1.2. Алгоритмы........................................................................................................................ 10

1.3. Программы и языки........................................................................................................ 11

1.4. Данные.............................................................................................................................. 16

2. ЭЛЕМЕНТЫ ЯЗЫКА............................................................................................................. 20

2.1. История языков С и Basic............................................................................................ 20

2.2. Алфавит............................................................................................................................ 20

2.3. Идентификаторы............................................................................................................ 20

2.4. Знаки разрядки................................................................................................................ 21

2.5. Комментарии................................................................................................................... 21

2.6. Запись текста программы............................................................................................. 21

Вопросы для самопроверки и контроля........................................................................... 22

3. ЭЛЕМЕНТЫ ДАННЫХ......................................................................................................... 23

3.1. Типы данных.................................................................................................................... 23

3.1.1. Целые......................................................................................................................... 23

3.1.2. Данные с плавающей точкой............................................................................... 24

3.1.3. Логический тип........................................................................................................ 24

3.1.4. Символьные данные.............................................................................................. 25

3.1.5. Дополнительные типы данных............................................................................ 26

3.2. Совокупности данных.................................................................................................... 26

3.2.1. Массивы..................................................................................................................... 26

3.2.2. Структуры.................................................................................................................. 27

Вопросы для самопроверки и контроля........................................................................... 27

4. ВЫРАЖЕНИЯ......................................................................................................................... 29

4.1. Арифметические операторы....................................................................................... 29

4.2. Операторы конкатенации............................................................................................. 30

4.3. Операторы сравнения................................................................................................... 30

4.4. Логические операторы.................................................................................................. 31

4.5. Обращение к функции................................................................................................... 32

4.6. Встроенные функции..................................................................................................... 32

4.7. Заключительные замечания........................................................................................ 33

Вопросы для самопроверки и контроля........................................................................... 33

5. ОСНОВНЫЕ ИНСТРУКЦИИ.............................................................................................. 35

5.1. Объявления...................................................................................................................... 35

5.2. Присваивание................................................................................................................. 35

5.3. Безусловный переход................................................................................................... 36

5.4. Инструкция If. Пустая инструкция.............................................................................. 37

5.5. Составная инструкция.................................................................................................. 39

5.6. Циклы................................................................................................................................. 39

5.6.1. Циклы с предусловием.......................................................................................... 40

5.6.2. Циклы с постусловием........................................................................................... 43

5.6.3. Вложенные циклы................................................................................................... 44

5.7. Управляемые переходы................................................................................................ 45

5.7.1. Инструкция break..................................................................................................... 45

5.7.2. Инструкция continue............................................................................................... 46

5.7.3. Инструкции exit........................................................................................................ 46

5.8. Многоальтернативный выбор..................................................................................... 47

5.8.1. Инструкция switch (язык С)................................................................................... 47

5.8.2. Инструкция select case (язык Basic).................................................................... 48

Вопросы для самопроверки и контроля........................................................................... 49

6. ВВОД-ВЫВОД........................................................................................................................ 50

6.1. Управляющая строка..................................................................................................... 50

6.1.1. Спецификация d (целые десятичные числа)................................................... 50

6.1.2. Спецификация f (десятичные числа с плавающей точкой)......................... 51

6.1.3. Спецификация e (десятичные числа с плавающей точкой)........................ 52

6.1.4. Спецификация g (универсальная спецификация)........................................ 52

6.1.5. Вывод символьной информации........................................................................ 53

6.2. Инструкции printf и scanf. Схема ввода-вывода.................................................... 53

6.3. Ввод-вывод массивов................................................................................................... 55

Вопросы для самопроверки и контроля........................................................................... 55

7. ПРОЦЕДУРЫ.......................................................................................................................... 56

7.1. Распределение памяти................................................................................................. 56

7.1.1. Распределение скаляров...................................................................................... 56

7.1.2. Распределение массивов..................................................................................... 56

7.1.3. Статическое и динамическое распределение памяти.................................. 57

7.2. Блоки.................................................................................................................................. 57

7.3. Процедуры........................................................................................................................ 57

7.3.1. Определения процедур.......................................................................................... 58

7.3.2. Связь между вызывающей и вызываемой функциями................................ 61

Вопросы для самопроверки и контроля........................................................................... 66

8. ПРЕПРОЦЕССОР.................................................................................................................. 67

8.1. Определение символических констант.................................................................... 67

8.2. Включение файлов в текст программы.................................................................... 67

Вопросы для самопроверки и контроля........................................................................... 69

9. СТИЛЬ ПРОГРАММИРОВАHИЯ....................................................................................... 70

9.1. Формирование листинга.............................................................................................. 70

9.2. Комментарии................................................................................................................... 71

9.3. Имена................................................................................................................................. 72

9.4. Язык и приемы программирования.......................................................................... 72

9.5. Стиль в языках С и Basic.............................................................................................. 74

Вопросы для самопроверки и контроля........................................................................... 75

10. ДАННЫЕ. ДОПОЛНЕНИЕ................................................................................................. 76

10.1. Перечислимый тип...................................................................................................... 76

10.1.1. Тип enum (C)........................................................................................................... 76

10.1.2. Тип enum (B)........................................................................................................... 77

10.2. Тип currency (B)............................................................................................................. 77

10.3. Тип date (B)..................................................................................................................... 77

10.4. Тип void (С)..................................................................................................................... 79

10.5. Подмассивы (сечения) (C)......................................................................................... 79

10.6. Динамические массивы (B)....................................................................................... 80

10.7. Структуры и объединения (C)................................................................................... 81

10.7.1. Структуры................................................................................................................ 81

10.7.2. Рекурсивные структуры....................................................................................... 83

10.7.3. Поля битов.............................................................................................................. 83

10.7.4. Объединения (смеси)........................................................................................... 84

10.7.5. Переменные структуры....................................................................................... 84

10.8. Тип variant (B)................................................................................................................. 85

10.9. Пользовательские типы данных............................................................................... 86

10.9.1. Инструкция type (B)............................................................................................... 86

10.9.2. Инструкция typedef (C)......................................................................................... 87

10.10. Преобразование типов............................................................................................. 87

10.10.1. Автоматические преобразования.................................................................. 87

10.10.2. Явные преобразования.................................................................................... 88

Вопросы для самопроверки и контроля........................................................................... 89

11. ОПЕРАТОРЫ. ДОПОЛНЕНИЕ......................................................................................... 90

11.1. Уровень 1........................................................................................................................ 90

11.2. Уровень 2 (унарные или одноместные операторы)............................................. 91

11.3. Уровень 3 (мультипликативные операторы)......................................................... 93

11.4. Уровень 4 (аддитивные операторы)........................................................................ 93

11.5. Уровень 5 (сдвиги)........................................................................................................ 93

11.6. Уровень 6 (отношения)................................................................................................ 94

11.7. Уровень 7 (равенство и неравенство)..................................................................... 94

11.8. Поразрядные операторы............................................................................................ 94

11.9. Логические операторы................................................................................................ 94

11.10. Уровень 13 (условное выражение)........................................................................ 95

11.11. Уровень 14 (операторы присваивания)................................................................ 95

11.12. Уровень 15 (оператор ',' - запятая)......................................................................... 95

11.13. Некоторые замечания............................................................................................... 96

11.14. Постоянные выражения........................................................................................... 96

Вопросы для самопроверки и контроля........................................................................... 96

12. ПЕРЕДАЧА ДАННЫХ ПОТОКОМ................................................................................... 97

12.1. Спецификация "s" управляющей строки функций scanf и printf..................... 97

12.2. Функции getchar и putchar.......................................................................................... 97

12.3. Функции gets и puts...................................................................................................... 98

12.4. Внутренняя передача данных (функции sscanf и sprintf).................................. 98

Вопросы для самопроверки и контроля........................................................................... 99

13. ФАЙЛЫ................................................................................................................................ 100

13.1. Основные понятия..................................................................................................... 100

13.2. Описание файла........................................................................................................ 100

13.3. Открытие и закрытие файлов................................................................................. 101

13.4. Средства языка С....................................................................................................... 101

13.4.1. Открытие и закрытие файла........................................................................... 101

13.4.2. Основные функции обмена.............................................................................. 102

13.5. Средства языка Basic................................................................................................ 102

13.5.1. Открытие и закрытие файла........................................................................... 102

13.5.2. Работа с файлами.............................................................................................. 103

Вопросы для самопроверки и контроля........................................................................ 105

14. СТРУКТУРА ПРОГРАММЫ............................................................................................ 106

14.1. Элементы структуры программы........................................................................... 106

14.1.1. Язык C.................................................................................................................... 106

14.1.2. Язык Basic............................................................................................................. 107

14.2. Область видимости (действия) и время жизни переменных......................... 107

14.2.1. Язык C.................................................................................................................... 108

14.2.2. Язык Basic............................................................................................................. 110

14.3. Проект программы...................................................................................................... 111

14.3.1. Использование директивы препроцессора #include................................ 112

14.3.2. Средства управления проектом...................................................................... 112

14.4. Инициализация данных........................................................................................... 112

14.5. Рекомендуемая структура программы.................................................................. 114

14.5.1. Структура модуля на языке Basic................................................................... 114

14.5.2. Структура модуля на языке C.......................................................................... 114

Вопросы для самопроверки и контроля......................................................................... 114

15. УКАЗАТЕЛИ, МАССИВЫ, СТРОКИ............................................................................. 115

15.1. Указатели...................................................................................................................... 115

15.2. Указатели и массивы................................................................................................. 115

15.3. Работа со строками.................................................................................................... 116

15.3.1. Литералы............................................................................................................... 117

15.3.2. Переменные......................................................................................................... 117

15.3.3. Операторы и функции....................................................................................... 117

15.4. Динамические объекты............................................................................................. 118

15.5. Типичные ошибки, связанные с указателями..................................................... 120

15.6. Примеры использования указателей. Структуры данных.............................. 120

15.6.1. Стек......................................................................................................................... 120

15.6.2. Однонаправленный список.............................................................................. 121

15.7. Ссылки и многомерные массивы.......................................................................... 123

15.8. Рекурсивные процедуры.......................................................................................... 124

15.8.1. Рекурсивное решение....................................................................................... 125

15.8.2. Нерекурсивное решение. Стек в виде массива......................................... 125

15.8.3. Нерекурсивное решение. Стек в виде списка............................................ 126

Вопросы для самопроверки и контроля........................................................................ 129

16. РАБОТА С ЭКРАHОМ....................................................................................................... 130

16.1. Текстовый режим(textmode)..................................................................................... 130

16.1.1. Ввод/вывод и манипулирование.................................................................... 131

16.1.2. Управление режимом и окном........................................................................ 131

16.1.3. Управление атрибутом(цветами символа и фона в окне)....................... 132

16.1.4. Информация о текстовом режиме................................................................. 132

16.1.5. Пример.................................................................................................................. 132

16.1.6. Пример(продолжение)...................................................................................... 133

16.2. Графический режим.................................................................................................. 134

16.2.1. Установка и закрытие........................................................................................ 134

16.2.2. Форматирование................................................................................................. 135

16.2.3. Размещение на экране...................................................................................... 140

16.2.4. Вывод на экран.................................................................................................... 141

16.2.5. Дополнительные функции................................................................................ 142

Вопросы для самопроверки и контроля........................................................................ 142

17. УПРАВЛЕНИЕ ПРОГРАММОЙ С ПОМОЩЬЮ КЛАВИАТУРЫ............................ 143

Вопросы для самопроверки и контроля........................................................................ 144

ЗАДАЧИ...................................................................................................................................... 145

Элементарные конструкции.............................................................................................. 145

Простые циклы..................................................................................................................... 146

Вложенные циклы................................................................................................................ 148

Процедуры............................................................................................................................. 150

Работа со строками............................................................................................................. 151

Разное..................................................................................................................................... 152

ПРИЛОЖЕНИЯ......................................................................................................................... 154

Приложение 1. Среда разработки Borland C++ 3.1.................................................... 154

П1.1. Меню File (Файл).................................................................................................... 154

П1.2. Меню Options (Установки среды)..................................................................... 156

П1.3. Разное....................................................................................................................... 158

П1.4. Редактирование текста........................................................................................ 158

П1.5. Сообщения.............................................................................................................. 159

П1.6. Отладка.................................................................................................................... 160

П1.7. Окна........................................................................................................................... 161

П1.8. Средства работы с проектами Borland C++ 3.1............................................. 162

Приложение 2. Среда разработки Visual Basic Express Edition.............................. 163

П2.1. Запуск среды.......................................................................................................... 163

П2.2. Подготовка к работе с новым проектом........................................................... 164

П2.3. Окна и режимы работы........................................................................................ 165

П2.4. Главное меню......................................................................................................... 166

П2.5. Меню File (Файл).................................................................................................... 166

П2.6. Редактирование текста........................................................................................ 166

П2.7. Меню View (Обзор)................................................................................................ 167

П2.8. Меню Project (Проект)......................................................................................... 167

П2.9. Отладка.................................................................................................................... 167

П2.10. Меню Tools (Средства)..................................................................................... 169

П2.11. Меню Window (Окно)........................................................................................... 169

Приложение 3. Ответы на вопросы для самопроверки............................................. 169

Приложение 4. Темы для курсовой работы.................................................................. 174

БИБЛИОГРАФИЧЕСКИЙ СПИСОК................................................................................... 177

 

ВВЕДЕНИЕ

Предметом изучения курса "Информатика и программирование" являются понятия и определения информатики, принципы алгоритмизации и обработки данных, основы программирования на алгоритмических языках, рекомендации по рациональной записи текста программ (стилю программирования), современные среды разработки программ.

В первом разделе пособия вводятся основные определения и термины данной предметной области, дается краткое описание устройства компьютера, рассматриваются основные этапы обработки программы на алгоритмическом языке такие, как: трансляция, компоновка, загрузка и выполнение, описывается представление данных в компьютере, их типы и организация. В последующих разделах излагаются основы программирования на двух распространенных алгоритмических языках CиBasic, причем аналогичные конструкции рассматриваются параллельно в одном разделе с выделением различий в их реализации в каждом из языков. Оба языкапозволяют в дальнейшем перейти от процедурного подхода к объектно-ориентированному. Язык Basic, кроме того, естественным образом дополняет соответствующие разделы в дисциплинах, изучающих текстовые и табличные процессоры, которые составляют основу знаний современных пользователей компьютеров. В пособие включен раздел, содержащий рекомендации по стилю программирования. В конце большинства разделов приводятся вопросы для самопроверки и контрольные вопросы, что позволяет по мере обучения проверять степень усвоения пройденного материала. В последнем разделе помещены задачи для практических занятий.

В качестве инструментальной среды выбраны оболочки Borland C++ 3.1 (вариант MS DOS) и Microsoft Visual Basic Express Edition. Выбор среды Borland C++ 3.1 обусловлен ее относительной простотой по сравнению с оболочками Borland C++ 5.02, MS Visual C++ 6или C++ Builder 5 и нежеланием авторов затрагивать в данном пособии понятия объектно-ориентированного программирования. В среде Microsoft Visual Basic Express Edition авторы ограничиваются изложением средств, работающих с общими процедурами. Описания оболочек и техники работы в них помещены в приложения. В состав приложений включены также ответы на вопросы для самопроверки и темы для курсовой работы.

Дисциплина "Информатика и программирование" является начальным курсом обучения основам программирования, ориентирована на людей, не знающих компьютер, и предполагает дальнейшее продолжение обучения в курсах "Высокоуровневые методы информатики и программирования", "Структуры и базы данных".

Второе издание данного пособия дополнено разделами, излагающими приемы и функции для работы с экраном в текстовом и графическом режимах, способы управления программой с помощью клавиатуры на языке C в среде операционной системы MS DOS. Это сделано с целью применения указанных средств при выполнении курсовой работы по нечисленным алгоритмам в последующей дисциплине "Высокоуровневые методы информатики и программирования". Кроме того, значительно увеличено количество задач в разделе "Задачи".

Пособие подготовлено преподавателями кафедры высшей математики и информатики Уральского социально-экономического института:

- Комиревым А.Г., доцентом, канд.техн.наук;

- Катаргиным М.Ю., доцентом, канд.техн.наук;

- Сартасовым Е.М., канд.техн.наук.

 

ОСНОВНЫЕ ПОНЯТИЯ И ОПРЕДЕЛЕНИЯ

Информатика – это дисциплина, изучающая процессы, методы и средства передачи, накопления и обработки информации с использованием компьютера.

Компьютер

Под компьютером будем понимать всю совокупность технических средств, обеспечивающих ввод, хранение, обработку и вывод информации на некоторый носитель без использования линий связи с другими компьютерами. В информационном аспекте компьютер состоит из: памяти, процессора и периферийных устройств или устройств ввода-вывода.

Память

Память – это упорядоченная последовательность мест запоминания. Каждое место характеризуется расположением (адресом) и содержит значение. Объем памяти измеряется в байтах. Значения кодируются в двоичной системе счисления, поскольку память состоит из двоичных запоминающих элементов, каждый из которых хранит 1 двоичную цифру (0|1) или 1 бит информации. Байт – это область памяти объемом 8 битов. Минимальный объем области памяти для обмена данными составляет 1 байт, поэтому их адреса задаются начальным байтом области.

Современные компьютеры имеют большой объем памяти, поэтому используются также другие единицы измерения ее объема:

- 1 КБ (килобайт) – 1024 (210) байта,

- 1 МБ (мегабайт) – 1024 КБ,

- 1 ГБ (гигабайт) – 1024 МБ,

- 1 ТБ (терабайт) – 1024 ГБ.

При записи (помещении) данных в память предыдущее значение, хранящееся в соответствующей области, стирается, при чтении (извлечении значения) оно сохраняется.

По выполняемым функциям память принято делить на: оперативную или основную и внешнюю.

Оперативная память используется для временного хранения данных при обработке информации на компьютере. После окончания процесса обработки данные не сохраняются. Она имеет относительно небольшой объем и высокое быстродействие. На персональных компьютерах в настоящее время объем оперативной памяти составляет 128 МБ – 6 ГБ.

Внешняя память служит для постоянного хранения программ и данных. Для непосредственной обработки информация из внешней памяти полностью или по частям передается в оперативную. По конструктивному исполнению наиболее распространенные носители информации для внешней памяти делятся на:

- жесткие диски типа "винчестер",

- гибкие диски или дискеты,

- компакт-диски,

- флеш-диски.

Жесткие диски (hard disk, HD) имеют наибольший объем (50 – 1000 ГБ) и используются, в основном, в качестве постоянной внешней памяти компьютера, хотя могут также применяться для переноса больших объемов информации на другой компьютер.

Дискеты имеют объем 1,44 МБ и служат для переноса небольших объемов информации. В настоящее время практически себя изжили и повсеместно заменяются на устройства для работы с флеш-дисками.

Компакт-диски (CD – compact diskи DVD – digital versatile disk) имеют объем 600 – 800 МБ CD и 4 – 4,7 ГБ используются, в основном, для записи и коммерческого распространения программной продукции различных фирм. Существуют также перезаписываемые компакт-диски.

Заметим, что приведенные величины объемов различных носителей информации практически удваиваются каждые 2 года.

Флеш-диски заменили дискеты в качестве мобильного носителя информации и имеют объем 256 МБ – 8 ГБ.

Процессор

Функция: преобразование данных и управление входящими в состав компьютера устройствами. Основной характеристикой процессора является тактовая частота, которая косвенно определяет его быстродействие. Современные компьютеры имеют тактовые частоты от 166 МГц (мегагерц) до 2,8 ГГц (гигагерц) и более. Также, как и объем памяти, эта характеристика удваивается примерно каждые 2 года.

Процессор имеет свою небольшую память, называемую регистрами. Число регистров невелико (обычно 16) и каждый из них в текущий момент времени может хранить 1 значение, поэтому между регистрами и оперативной памятью происходит непрерывный обмен данными, скорость которого и определяет, в основном, быстродействие процессора.

Периферия

Основные устройства ввода: клавиатура, манипулятор типа "мышь", сканер – ввод информации с бумажного носителя (листы, фотографии) в… Основные устройства вывода: терминал (монитор, дисплей) – устройство… К устройствам, позволяющим выполнять как ввод, так и вывод информации, следует отнести дисководы для жестких дисков и…

Алгоритмы

Алгоритм – это последовательность действий, которая на основании известных данных однозначно приводит к заданному результату. Свойства алгоритма:

- дискретность – последовательность выполнения отдельных шагов,

- массовость – применимость к целому классу задач,

- определенность – однозначное толкование каждого шага,

- результативность – приведение к результату за конечное число шагов,

- формальность – способность исполнителя выполнить все шаги алгоритма, не понимая их смысла.

Формы записи алгоритмов

Естественный язык

Шаг 1. Ввести 2 числа. Шаг 2. Если числа равны, взять первое и закончить выполнение, в противном… Шаг 3. Определить большее число. Заменить большее число на разность большего и меньшего и перейти к шагу 2.

Конец пока

вывод A на печать


Достоинства: универсальность, близость по написанию к тексту программы, возможность пошаговой детализации.

Недостаток: уступают по наглядности блок – схемам.

Рекомендация: наиболее предпочтительная форма записи алгоритмов.


Существует также метод HIPO диаграмм, который используется для описания больших программных проектов. HIPO означает: иерархия (hierarchy), ввод (input), обработка (processing), вывод (output).

Программы и языки

Программа – это список инструкций для выполнения задачи на компьютере.

Программирование – действия по ее созданию.

Язык программирования – средство записи программ.

Основные понятия языка программирования

Алфавит – набор допустимых символов.

Лексема – неделимая конструкция языка, имеющая определенный смысл.

Ключевое слово – слово или сочетание слов естественного языка, чаще всего английского, определяющее некоторое понятие. Обычно эти слова зарезервированы, т.е. не могут употребляться для обозначения объектов программы. Ключевое слово – частный случай лексемы.

Оператор – лексема, обозначающая некоторое действие.

Инструкция – законченная фраза языка программирования, определяющая как и в каком порядке происходит манипулирование объектами программы. Различают простые и сложные инструкции. Простые инструкции не содержат внутри себя других инструкций, сложные могут их содержать.

Синтаксис – набор правил построения программы из конструкций языка.

Семантика – описание понятий языка.

Выполнение программы

Текст программы подготавливается обычно с помощью клавиатуры и в виде некоторой кодированной совокупности данных записывается во внешнюю память. Для выполнения программа, как обычные данные, должна быть переписана в оперативную память с помощью специальной программы, называемой загрузчиком. После этого программа запускается для решения задачи. Рисунок иллюстрирует указанный процесс.

 
 

 

 
 


 

Машинный и алгоритмический языки

Пример. Команда сложения из системы команд одного из устаревших типов компьютеров. 01 0016 0022 0012 Здесь:

Метаобозначения

- := - фраза "это есть"; - { } – обязательный элемент конструкции; значение выбирается из нескольких… - [ ] – необязательный (optional) элемент конструкции;

Этапы обработки программы на компьютере

 

текст маш.код отн.адреса абс.адреса

 
 


ИМ ОМ ЗМ память

 

результаты

периферия

 

Терминология

Исходные модули (ИМ) – тексты программы на алгоритмическом языке.

Объектные модули (ОМ) – оттранслированные тексты программы на машинном языке в относительных адресах.

Загрузочный модуль (ЗМ) – единая готовая к выполнению программа, по-прежнему, в относительных адресах.

Рассмотрим более подробно каждый этап.

Трансляция

Замечание. В современных визуальных средах разработки в качестве главной может применяться специальный объект – форма. Каждая процедура может передавать данные в другую процедуру и получать обратно… На этапе трансляции выполняется синтаксический анализ текстов исходных модулей, т.е. проверка их соответствия правилам…

Редактирование связей (компоновка)

На этом этапе основным является установление связей между всеми объектными модулями оттранслированной программы и объединение их в единый загрузочный модуль. Каждая среда разработки IDE включает несколько библиотек, содержащих процедуры для выполнения типовых операций, хранящихся в виде объектных модулей. Примерами таких процедур являются различные математические функции, функции работы с датами и т.п. Необходимые библиотечные процедуры также подключаются к загрузочному модулю на этапе компоновки.

После завершения этапа адреса объектов представляют собой смещения относительно начала единого загрузочного модуля, т.е. являются, по-прежнему, относительными.

Загрузка

Процесс загрузки программы был описан выше, поэтому отметим лишь основные функции данного этапа:

- определение и выделение необходимой памяти под программу и данные;

- загрузка программы в выделенную область с формированием абсолютных адресов; абсолютные адреса получаются суммированием относительных адресов загрузочного модуля с начальным адресом выделенной области;

- передача управления первой инструкции главной процедуры.

Выполнение

По сути содержание этого этапа заключается во вводе исходных данных, выполнении инструкций программы и выводе результатов на некоторый внешний носитель. Во время выполнения могут выявлены ошибки реализации типа деления на 0 или извлечения корня квадратного из отрицательного числа.

Типы вычислительных процессов

Известно, что любой сколь угодно сложный алгоритм можно записать с помощью 3 типов вычислительных процессов: следования, развилки и цикла. Их также называют базовыми структурами.

Следование

Структура представляет собой последовательное выполнение произвольного числа инструкций, не включающих в себя развилок и передач управления.

Пример.

y=a+b z=2*y*y+a*y+b print(z)

Развилка

Это двухальтернативный выбор, который на псевдокоде можно записать так:


если <условие> то

<действие 1>

[иначе

<действие 2>]

Конец если


Как <действие 1>, так и <действие 2> могут являться комбинацией всех 3 базовых структур, поэтому с помощью данной структуры можно организовать более двух ветвей алгоритма. Квадратные скобки вокруг альтернативы иначе означают необязательность этой ветви.


Пример. Найти x=max(a, b), y=min(a, b).


Вариант 1.

если a>b то

x=a

y=b

Иначе

x=b

y=a

Конец если

Вариант 2.

x=a

y=b

если a<b то

x=b

y=a

Конец если


Цикл

Это последовательность действий, повторяющаяся до тех пор, пока выполняется некоторое условие. Цикл в общем случае состоит из 4 блоков: инициализации цикла; логического блока, содержащего условие продолжения или окончания цикла; тела цикла – последовательности инструкций, выполняемых при каждом повторении, и блока, в котором производится изменение условия продолжения (или окончания) цикла. В зависимости от того, как расположен блок условия по отношению к телу цикла, различают цикл с предусловием (условие проверяется до выполнения тела цикла) и цикл с постусловием (условие проверяется после выполнения тела цикла). В первом случае тело цикла может ни разу не выполниться, во втором – оно выполнится хотя бы 1 раз. На рисунке показаны обобщенные блок-схемы цикла каждого вида. В некоторых частных случаях отдельные блоки могут отсутствовать.

Цикл с предусловиемЦикл с постусловием

 
 

 

 


Пример. Сортировка массива методом "пузырька" {ai}, i=1...n.

k=1 Исходный массив: {24, -12, 0, 123, -2, 57}

пока k>0 делать Результат: {-12, -2, 0, 24, 57, 123}

k=0

для i от 1 до n-1 выполнить

если ai > ai+1 то

b=ai

ai=ai+1

ai+1=b

k=1

Конец если

Конец для

Конец пока

Данные

Данные – это информация, обрабатываемая программой.

Системы счисления

Пример. 125.478 = 1*100+2*10+5+4*10-1+7*10-2+8*10-3 Число различных цифр, образующих систему, называется ее основанием. Любое число может быть записано в системе…

Типы и совокупности данных.

Скалярная переменная – это переменная, имеющая в текущий момент времени 1 значение.

Тип переменной – это множество значений, которые может принимать переменная во время выполнения программы.

Остановимся на наиболее распространенных типах данных.

Целые

Диапазон представления определяется разрядностью процессора. Обычно используются 2 модификации целых размером в 32 бита – диапазон представления: |x|<231 (чуть больше 9 десятичных цифр) и 16 бит – диапазон: |x|<215=32768. Все операции над целыми выполняются без погрешности.

Вещественные

Диапазон представления также зависит от разрядности. В общем случае, все операции приближенные (имеет место погрешность перевода в двоичную систему счисления).

Данные хранятся в памяти в форме с плавающей точкой. Число имеет вид:

x=m*Be,

где mмантисса,

Bоснование системы счисления (10|2|16),

eпорядок.

Пример.

-2.73*10-15=273*10-17

Одно и то же значение записывается по-разному, отсюда и происходит название – форма с плавающей точкой. Иногда требуется однозначная запись таких данных. В этом случае используется нормализованный вид числа, который удовлетворяет условию:

0.1<=|m|<1 или 1<=|m|<10

Логические

Эти данные могут принимать только 2 значения: Trueистина или Falseложь и используются для записи условий. Например, выражение a<b при a=3, b=5 принимает значение True, а при a=7,b=0 значение False.

Строки

Представляют собой последовательности символов фиксированной или переменной длины.

Пример.

"hard disk" "Привет всем!"

Совокупности данных

Пример. Система линейных алгебраических уравнений. a11x1+a12x2=b1 a21x1+a22x2=b2

ЭЛЕМЕНТЫ ЯЗЫКА

История языков С и Basic

Язык Basic был создан в 1965 г. сотрудниками Дартмутского колледжа под руководством Дж.Кемени и Т.Курца для пользователей-непрофессионалов. В связи…

Алфавит

Алфавит языков C и Basic составляют латинские буквы, арабские цифры и спецсимволы. Все символы алфавита кодируются целыми значениями в диапазоне от 0 до 127 в соответствии с международной таблицей ASCII. Существуют также таблицы локальных кодировок, включающие буквы национальных алфавитов. Буквы национальных алфавитов могут использоваться только в данных и в комментариях к программе, но не при обозначении объектов программы. Существуют и русифицированные среды разработки, например, Visual Basic for Applications (VBA), который входит в состав пакета MS Office, но это скорее исключение, чем правило. Символы этих таблиц имеют коды в диапазоне от 128 до 255.

В языке Cпрописные и строчные буквы считаются разными символами, в языке Basicони не различаются.

Идентификаторы

Имя служит для обозначения объектов (ссылок к объектам) программы. Ключевое слово обозначает понятие, которое используется транслятором и не может… Правило (формат) записи имени: {<буква>|_}[<буква>|<цифра>|_]...

Basic

Максимальная длина имени – 1023 символа. В языке Visual Basic не различаются строчные и прописные буквы, однако в инструкции описания сохраняются прописные буквы.

Знаки разрядки

Применяются для удобочитаемости текста программы. К ним относят: пробел, табуляцию (клавиша Tab), переход на новую строку (клавиша Enter). Могут ставиться везде, но не внутри идентификаторов и знаков составных операторов.

Комментарии

Комментарии позволяют ввести пояснения к фрагменту программы. Могут ставиться везде, где допустим знак разрядки. Транслятор рассматривает их как пробел.

С

Формат:

/*<произвольный текст>*/

Комментарий может занимать несколько строк.

Пример.

/* Это предложение - комментарий! */

Также допустимы однострочные комментарии вида:

// <комментарий>

Признак конца такого комментария является символ перевода строки (клавиша Enter).

Пример.

// Это предложение - комментарий!

Basic

Формат:

' <произвольный текст>|Rem <произвольный текст>

Первый вид рекомендуется в качестве пояснительного в строке программы после текста инструкции; второй является инструкцией и его можно использоватьв качестве межстрочного, без которого вполне можно обойтись.

Пример.

' Это комментарий!

Rem Это тоже!

Запись текста программы

С

Записывается в произвольных позициях. Перенос свободный между словами. Инструкция заканчивается символом ";". Исключение составляет символ "}", за которым ";" не ставится.

Basic

Предполагается запись одной инструкции в строку. В случае записи нескольких инструкций в одной строке они должны разделяться символом ":".

Пример.

Text1.Text = "Hello" : Red = 255 : Text1.BackColor = _Red

Если инструкция не помещается в строку, возможен перенос между словами. В этом случае в конце строки необходимо поместить комбинацию символов: пробел и _.

Пример.

Data1.RecordSource = _

"SELECT * FROM Titles, Publishers" _

& "WHERE Publishers.PubId = Titles.PubID" _

& "AND Publishers.State = 'CA'"

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Различаются ли прописные и строчные буквы в изучаемых языках?

2. Перечислите допустимые имена.

x X X_X A15B 15C a2 KOH A1b MAKC_HOMEP

3. Перечислите знаки разрядки.

4. Где могут записываться комментарии в тексте программы на языке C?

5. Чем отличается запись нескольких инструкций в одной строке в языках Cи Basic?

Контрольные вопросы

1. Что входит в состав алфавита?

2. Чем отличается понятие идентификатор от понятия имя?

3. Зачем нужны знаки разрядки?

4. Можно ли записывать комментарий Rem в той же строке после инструкции?

5. Чем отличаются правила переноса инструкции на другую строку в языках Cи Basic?

ЭЛЕМЕНТЫ ДАННЫХ

Данные – это значения, которые могут задаваться объектам программы и использоваться при ее выполнении.

Элемент данных имеет тип и изображение в тексте программы.

По организации различают скаляры (одиночные значения): переменные и константы, и совокупности: массивы, структуры и объекты.

Типы данных

Тип – множество допустимых значений и операций над ними. Элемент какого-либо типа: переменная | константа | литерал. Тип литерала определяется его изображением, для переменной необходима специальная конструкция языка – описание, константы в пособии не рассматриваются.

Внимание! Все переменные должны быть описаны до их использования (по описаниям выделяется память для них).

Большинство типов имеют определенный в языке набор операций, реализованных в виде операторов или функций.

Существуют определенные в языке типы данных (так называемые предопределенные) и типы, задаваемые пользователем (о них позже).

Целые

Это семейство типов, значения которых являются целыми. Типы различаются диапазоном значений и объемом выделяемой под элемент памяти.

Память в байтах Память в разрядах Диапазон Тип Basic Тип C
-128 – 127(27-1) sbyte char
-32768 – 32767(215-1) short shortили int
-2147483648 – 2147483647(231-1) integer intили long
-263 – 263-1 long  

Замечание 1. В стандарте языков Cи C++ вне зависимости от типа компьютера и операционной системы (ОС) между целыми типами должно выполняться соотношение для их длин:

char <= short <= int <= long

Для ОС Windowsи ПК типа IBM PCимеем следующие соотношения:

charà1 байт, shortà2 байта, intиlongà4 байта.

Для ОС MS DOSимеем:

charà1 байт, shortи int à2 байта, longà4 байта.

Замечание 2. В языках Cи C++для всех целых типов существует модификатор unsigned, в рассматриваемой версии языка Basicтипы byte, ushort, uinteger, ulong, которые запрещают соответствующим типам принимать отрицательные значения. При этом изменяется диапазон представления значений.

unsigned char, byteà 0 – 255

unsigned short(или unsigned [int]для ОС MS DOS), ushortà 0 – 65535

unsigned long(или unsigned [int] для ОС Windows), uintegerà 0 - 4294967295

ulongдля Basicà 0 – 264-1

В качестве литералов в обоих языках могут употребляться числа в 10-чной, 8-чной и 16-чной системах счисления. Признак 8-чного литерала в языке Basic – префикс &0 (буква "o”), в языке C0 (цифра "0"), 16-ного: Basic -- &h, C0{x|X}.

Пример.

-1 2345 9999999999 à 10

&o7777 à Basic 07777 à Cà 8

&hab à Basic0xab 0Xab à Cà 16

Рекомендация. В языке C при работе в разных операционных системах неразумно использовать тип int.

Данные с плавающей точкой

Замечание. Типы doubleи long doubleв современных версиях языка C не отличаются. Тип long double введен для совместимости со стандартом языка,… Литералы имеют 2 формы записи: - обычную:

Логический тип

Описывается ключевыми словами boolв языке C++и boolean в языке Basic. Литералы этого типа имеют только 2 значения: true (истина) и false (ложь). Basic: в памяти занимают 2 байта (16 разрядов) и хранятся в виде true (-1), false (0).

Дополнительные типы данных

Описанные выше типы данных можно считать основными. Они используются в той или иной форме во всех языках программирования. В языке C (C++) определены также следующие типы: указатели, ссылки, перечисления (enum), void; в языке Basic: перечисления (enum), даты (date), универсальный (object) и десятичный (decimal). Они будут введены позже по ходу изложения.

Совокупности данных

Переменные любых типов могут быть объединены в совокупности. Если в совокупности все переменные одного типа и место каждой определяется номером (индексом), то это массив, если же разных, то – структура.

Массивы

Пример. Массив. Система линейных алгебраических уравнений.

a11*x1+a12*x2=b1

a21*x1+a22*x2=b2

В результате имеем 3 массива: {aij,i,j=1,2}, {xk,k=1,2}, {bl,l=1,2}.

Количество индексов определяет размерность массива. Различают одномерные (размерность равна 1) и многомерные (размерность > 1) массивы.

Расположение в памяти элементов многомерного массива в языках Cи Basicлексикографическое, т.е. в следующем порядке: a11 a12 a21 a22.

Доступ к отдельным элементам производится по значениям индексов.

Пример.

i=1 j=2 aij=a12

Массивы должны быть объявлены в специальных инструкциях.

Объявления массивов

<элемент>:=<имя>[<длина>][,[<длина>]]… <длина> - количество элементов массива в данном измерении. Замечание. Жирным выделены символы языка, начертание которых совпадает с метаобозначениями.

Basic

<массив>:=<имя>(<индекс>[,<индекс>]...)

<индекс>:=[нижняя граница to] верхняя граница

Различают массивы фиксированного размера (в качестве границ при объявлении используются целые числа >0) и массивы, размеры которых могут изменяться при выполнении программы – динамические массивы (о них позже). В данной версии языка нижняя граница индекса массива всегда равна 0. Задать отличную от 0 нижнюю границу можно, но это только приведет к неиспользованию части отведенной под массив памяти.

Пример.

A(1,1) X(1) DaysOfMonth(1 to12) Etap(1 to20, 1) Matr( , )

Массив Matr( ) относится к динамическим массивам.

Замечание. Старайтесь не использовать нижнюю границу при объявлении массива, поскольку нижняя граница измерения всегда равна 0. В результате при массивах DaysOfMonth и Etap память используется неполностью.

DaysOfMonth: выделено памяти под 12+1=13 элементов, используется 12,

Etap: выделено памяти под (20+1)*(1+1)=42 элемента, используется 40.

В отличие от языка C, где в объявлении массивов используется понятие длина или количества элементов в данном измерении массива, понятие верхняя граница означает максимальное значение индекса в данном измерении и, следовательно, объявление A(1,1) определяет массив данных из 4 элементов: A(0,0), A(0,1), A(1,0), A(1,1). Как видно из примера, многомерные массивы аналогично языку Cрасполагаются в памяти построчно.

Обращение к элементу массива

С

<имя>[i1 ][[i2 ]]…, где i1, i2 – целые выражения.

Пример.

Page[ 5 ] Line[ i ] Screen[ j ][ k ] Matr[ i-1 ][ j+i-1]

Basic

<имя>(i1[,i2]...), где i1, i2 – целые выражения.

Пример.

Page( 5 ) Line( i ) Etap( j, k ) Matr( i-1, j+i-1)

Структуры

Структура (запись) – составной объект, содержащий 1 или более элементов любых типов, кроме функций. Структура может содержать массив любого типа.

Пример. Структура "Работник" (worker):

- таб. номер;

- Фамилия И.О.;

- должность;

- сумма к выдаче.

В языке C для определения структур применяется ключевое слово struct, в языке Basic для них специальное понятие не предусмотрено, однако реализовать структуру можно, используя тип данных, определяемый пользователем. Работа со структурами будет рассмотрена в других разделах.

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Каковы примерно максимальные целое и вещественные значения?

2. В каком языке отсутствует логический тип данных?

3. Есть ли отличия в правилах записи строковых литералов в языках C и Basic?

4. Можно ли в языке C задать произвольную нижнюю границу индекса?

5. Что такое длина измерения массива?

6. В каком языке есть ключевое слово для описания структур?

Контрольные вопросы

1. Чем отличаются операции над целыми данными и данными с плавающей точкой?

2. Как можно имитировать логический тип данных в языке C?

3. Как задать переменные типа string в языке C?

4. Чем отличается описание массива в языках Cи Basic?

5. Есть ли в языке Basic возможность представления структур?

ВЫРАЖЕНИЯ

Оно включает в себя ключевые слова, операторы, переменные, литералы и функции. В результате вычисления этой комбинации может быть получено значение… Оператор – это символ(ы) или ключевое слово, обозначающее некоторое действие… - арифметические;

Арифметические операторы

Основные

СBasic

возведение в степеньнет ^

умножение * *

деление / /

сложение+ +

вычитание - -

Дополнительные

присвоение знака+ - -

деление нацело нет \

остаток от деления % mod

увеличение, уменьшение ++ --нет

Приоритет

+(1) -(1)++ -- ^

* / % -(1)

+(2) -(2) * /

\

Mod

+(2) -(2)

Замечания.

1. Числа в скобках указывают число операндов.

2. Двуместные операторы с одинаковым приоритетом в одном выражении выполняются в порядке записи слева направо.

Рассмотрим особенности выполнения некоторых операторов.

C

1. При делении целого на целое результат – целый.

2. Оператор % допустим только с целыми операндами, с другими вызывает ошибку во время трансляции. Результат имеет знак делимого.

Пример.

9/5à1 10/5à2 -5/3à-1 -5/-3à1 5/-3à-1

9%5à4 10%5à0 -5%-3à-2 5%-3à2 -5%3à-2

3. Всегда выполняется соотношение для целых: a=a/b*b+a%b.

4. Операторы ++и -- означаютувеличение и уменьшение соответственно значения переменной на 1.

Пример.

k=4 k++ à k=5

m=-12 m-- à m=-13

Basic

Результаты выполнения операторов \иmodоперанды для целых операндов совпадают с результатами выполнения операторов / и % языка Си. Для операндов с плавающей точкой результаты вычисляются по замысловатым правилам и могут давать неожиданные результаты из-за ошибок округления, поэтому подобные операции выполнять не рекомендуется.

Операторы конкатенации

Поскольку в языке C нет типа данных string, там отсутствуют и соответствующие операторы. Работа со строками в этом языке выполняется с помощью функций и будет рассмотрена позже.

В языке Basicдля этой цели применяются операторы:

& +

Оператор +выполняет сцепление, если оба операнда имеют тип string. В противном случае – это оператор сложения.

Пример.

"Собака" & " Бобик"

"Кошка" + " Мурка"

Операторы сравнения

Результат выполнения любого оператора сравнения – логическое значение (true|false), операндами в общем случае являются арифметические выражения. Для операторов используются общепринятые математические обозначения. Там, где действие оператора неочевидно, в скобках приведено пояснение.

CBasic

< <= > >= < <= > >= = <> (не равно)

== (равно)!= (не равно)

Замечание. Операторы, состоящие из двух и более символов, называют составными, пробелы внутри них недопустимы.

Пример.

5<3 à false 5*5>=5+20 à true

Замечания.

1. В языке Basicсравнения, подобные приведенному в примере, называют числовыми. Допустимо также сравнение строк. Сравнение проводится посимвольно слева направо в соответствии с кодировкой символов. В кодировке Windowsрусские и латинские буквы упорядочены по алфавиту, причем заглавные буквы "меньше" строчных.

Пример.

"А" < "а" à true

"Ф" < "ф" à true

"Я" < "а" à true

Если строки имеют разную длину, то более короткая дополняется справа пробелами.

Пример.

"Алекс" < "Александр" à true"Павлов Иван" = "Павлов И.В." à false

2. В языке Cсравнение строк выполняется с помощью специальных функций, рассматриваемых в последующих разделах.

Логические операторы

Операндами для них являются логические значения, результат вычисления выражения также логическое значение.

BasicC

not ® Не, логическое отрицание ¬ !

and, AndAlso ® И, логическое умножение, конъюнкция ¬ &&

or, OrElse ® Или, логическое сложение, дизъюнкция¬ ||

xor ® исключающее Или (не эквивалентность) ¬ !=

eqv ® эквивалентность¬ ==

imp ® импликация (включение) ¬ нет

Замечание 1. В нашей версии языка Basic операторы eqvи imp не поддерживаются. Новые операторы AndAlsoи OrElse отличаются от операторов andи or соответственно тем, что, если значение результата уже определено значением операнда 1, то значение операнда 2 не вычисляется, для последних значение операнда 2 вычисляется всегда. То есть, если А в выражении А AndAlsoВ принимает значение false, то значение В не вычисляется, и наоборот, если А в выражении А OrElse В принимает значениеtrue, то значение В не вычисляется. В языке Cоператоры &&и || работают, как операторы AndAlsoи OrElse соответственно. Эти свойства операторов позволяют программировать выражения, в которых вычисления 2-го операнда приводит к ошибке.

Пример.

i<n AndAlso x(i)<>0

Если массив x содержит n-1 элемент, то при i=n значение x(n) лежит за пределами отведенной под массив x памяти. В этом случае использовать оператор and для вычисления выражения нельзя!

Замечание 2. Операторы !=и == имеют равный приоритет. Они имеют как бы двойное назначение: если операнды – арифметические выражения, то они трактуются как операторы сравнения, если операнды – логические выражения, то – как логические операторы.

Результат выполнения каждого оператора пояснен в таблице. Здесь A и B – выражения, которые могут принимать одно из двух значений: true|false. Любое выражение, не равное 0, трактуется как имеющее значение true, равное 0 – как false.

A B Not A A And B A Or B A Xor B A Eqv B A Imp B
false false true false false false true true
false true true false true true false true
true false false false true true false false
true true false true true false true true

 


Примеры. Верхнее выражение – на языке Basic, нижнее – на языке C.

1) условие попадания т.M(x,y) 2)условие непопадания т.M(x,y) в 1 и 3 квадрант

в треугольник круга радиуса 1 с центром в начале координат

y y

x>0 and y>0 and y<1-x 1 not(x*x+y*y<1 and x*y>0)

1 x>0 && y>0 && y<1-x !(x*x+y*y<1 && x*y>0)

F 1

T 0 x

x F

0 1

3)условие попадания т.M(x,y) в заштрихованную область

x*x+y*y<=1 and x<=0 and y<=0 or y=x andx>0

x*x+y*y<=1 && x<=0 && y<=0 || y==x && x>0

 

4)условие кратности целых значений

m mod n = 0

m%n == 0

Обращение к функции

Синтаксис обращения в языках Cи Basicсовпадает:

<имя_функции>([<аргумент>[,<аргумент]...])

<аргумент>:=<выражение>

Пример.

sin(2*x+5) abs(x-y)

Функции могут быть встроенными (библиотечными, см.ниже) и написанными программистом (функции пользователя, о них последующих разделах).

Встроенные функции

Замечания. 1. В языке Basic аргументы могут иметь любой числовой тип. Результат в… y=math.abs(x^3-2)

Заключительные замечания

Для языка Basic последовательность преобразования следующая: sbyteàintegeràlongàsingleàdouble. Исключение: если один… Пример. dim Operand1 as sbyte, Orerand2 as single, Operand3 as long, Operand4 as double

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Чему равно выражение: -7\2? На каком языке оно написано?

2. Известно целое значение n. Как определить младшую цифру числа?

3. Как следует записать на языке C соотношение a<b<c?

4. Как на языке Basic записать условие попадания т.M(x,y) в квадрат с ценром в начале координат и стороной a?

Контрольные вопросы

1. В чем суть оператора ++?

2. Что означает оператор %? Как записывается аналогичный оператор в другом изучаемом языке?

3. В каком языке все операторы сравнения имеют одинаковый приоритет, а в каком нет?

4. Как кратко записать условие, показывающее, что выражения xи yимеют одинаковый знак?

5. Различаются ли правила обращения к функции в языках Basic и C?

 

ОСНОВНЫЕ ИНСТРУКЦИИ

Инструкция – это синтаксически завершенная единица языка, выражающая либо действие, либо объявление (декларацию).

Basic. Принято записывать по одной инструкции в строку, однако можно поместить и несколько через разделитель ":". Более того, инструкция может занимать несколько строк. В этом случае каждая строка, кроме последней, должна заканчиваться разделителем <пробел>_.

C. Инструкции записываются произвольно. Разделяются символом ";" . Исключение составляет символ }.После него разделитель ";" можно не ставить. Переносить на другую строку следует, не разрывая лексемы.

Инструкции выполняются в порядке их следования, если отсутствуют инструкции перехода.

В данном разделе будут рассмотрены не все, а наиболее употребительные инструкции. Остальные будут вводиться по ходу изложения.

Объявления

C Для этой цели используются инструкции описания типа: int, short, float,… Пример.

Basic

В этом языке есть несколько инструкций для объявления. Пока введем только одну.

Формат:

dim <список>

<список>:=<элемент>[,<элемент>...]

<элемент>:={<переменная>|<массив>} as <тип>

Пример.

dim Kol as integer, Volume as integer, ChisloStudents(1 to 5 ) as integer

dim Dlina as single, Weight as single, Matrix(1 to10, 1 to10) as single

dim Mistake as string, Message as string

Замечание 1. Напомним, что в данной версии транслятора нижняя граница индекса всегда равна 0 (аналогично языку С), поэтому объявление вида ChisloStudents(1 to 5 ) неполностью использует отведенную под массив память и применять такие определения не рекомедуется. Определение целого массива из 5 элементов разумнее дать в виде ChisloStudents(4).

Замечание 2. В отличие от предыдущих версий Visual Basic 2008 не позволяет объявлять строки фиксированной длины вида Message as string*20.

Присваивание

C

Формат:

...[<переменная>=]<переменная>[<знак>]=<выражение>;

Пример.

x=-.127; i=i+1; a[i+1]=x*y+2*sin((z+1)*(x-2));

Инструкция вида i++; фактически эквивалентна инструкции i=i+1; , поэтому ее также можно отнести к присваиванию.

Инструкция вида x+=a+b/2; эквивалентна инструкции x=x+a+b/2; и является просто сокращенной формой записи операции изменения значения переменной и в качестве знака может использоваться любой оператор, при котором полученная конструкция имеет смысл. В дальнейшем мы увидим, что таких знаков достаточно много.

Следует обратить внимание на многократное присваивание, которое весьма удобно.

Пример.

i=j=k=0; эквивалентно k=0; j=k; i=j;

i=1;

j=3;

a[ i ][ j ]=i=i+1; в результате получим i=2 a[2][3]=2

Basic

Формат:

[let]<переменная>[знак]=<выражение>

Ключевое слово let является анахронизмом и в данной версии языка после завершения инструкции удаляется из кода программы. Опция [знак] имеет тот же смысл, что и в языке С.

Пример.

x=-0.127: i+=1: a(i+1)=x*y+2*sin((z+1)*(x-2)): m( i, j )=i+1

Безусловный переход

<помеченная инструкция>:=<метка><инструкция> <метка>:=<имя:>|<номер> à для Basic <номер>:=<целое без знака>

Инструкция If. Пустая инструкция

C Формат: if(<выражение>)<инструкция 1>;

Else

x=-5; if(x<0)

else y=x*x-5;

if(z>10) else

y=5; if(x<=5)

else y=sqrt(x)+3;

y=-5; else

y=x-7;

Пустая инструкция (есть только в языке C) имеет вид: ;.

Пример.

if(x>y)

if(z==w)

if(w<p)

y=1;

Else

p=q; // При x>y && z!=w переход к инструкции с меткой m1

else ; // Пустая инструкция

Else

x=4;

m1:z=5;

Как видно из примера, необходимость пустой инструкции вытекает из правил языка. Она употребляется тогда, когда по правилам требуется наличие инструкции, а никаких действий в программе не предполагается.

Basic

Используются 2 формы инструкции if.

Однострочная форма.

Формат:

if <условие> then [<инструкции>] [else <инструкции>]

Замечания.

1. Эта форма инструкции if записывается в одну строку.

2. Инструкции за словом thenмогут отсутствовать только при наличии в инструкции if слова else.

3. Инструкций за словами then и else может быть более одной. В этом случае они отделяются друг от друга символом ":" .

Пример.

if x*x+y*y>r*r thenz=0;

if a>b thenc=a : d=b elsec=b : d=a

Блочная форма ("цепочка").

Формат:

if <условие 1> [then]

[<инструкции>]

[elseIf <условие 2> [then]

[<инструкции>]

]...

[else

[<инструкции>]

]

End if

Замечания.

1. Слово ifэтой формы должно быть первым в строке. Слово then можно не записывать. При переходе к строке, следующей за строкой со словом ifили elseif оно будет вставлено автоматически.

2. Количество опций (частей) elseifв инструкции не ограничено, однако рекомендуется использовать не более 3, поскольку текст становится плохо читаем. Для программирования большего числа альтернатив существует другая инструкция, описанная ниже в данном разделе.

3. Форма обязательно должна заканчиваться инструкцией end if.

4. При выполнении производится последовательная проверка условий. Как только какое-либо из них принимает значение true, выполняются следующие за соответствующим словом then инструкции и управление передается на инструкцию, следующую за инструкцией end if. Если не будет истинно ни одно из условий, то выполняются инструкции, следующие за словом else.

5. В состав внутренних инструкций в свою очередь могут входить другие инструкции ifлюбой формы.

6. Транслятор отличает эту форму по отсутствию в строке после слова then других инструкций, не входящих в инструкцию if. Допустим только комментарий.


Примеры. Вычислить:

x*x-5, если x<0

y= Öx+3, если 0<=x<=5

x-7, если x>5


if x<0 then

y=x*x-5

elseif x<=5 then

y=sqrt(x)+3

else

y=x-7

End if


Вложенные инструкции:

if x>y then

if z=w then

if w<p then

y=1

Else

p=q 'при x>y and z<>w пе

реход к инструкции с

меткой m1

end if

end if

Else

x=4

End if

m1:z=5


Как видно из примеров, структура инструкции не требует наличия в языке пустой инструкции, поэтому в языке Basicее нет.

Составная инструкция

В языке Basicтакой инструкциинет по той же причине, что и пустой инструкции.

В языке C составная инструкция употребляется в тех случаях, когда по правилам языка требуется одна инструкция, а по логике программы необходимо несколько.

Формат:

{<инструкция>;[<инструкция>;]...}

Пример. Найти x=max(a, b), y=min(a, b).

if(a>b){

x=a; y=b;

}else{

x=b; y=a;

}

Циклы

Циклические (повторяющиеся) фрагменты программы можно реализовать с помощью уже рассмотренных инструкций, однако это делает фрагменты более длинными и ухудшает читабельность текста. Тем не менее умение запрограммировать циклы с помощью этих инструкций весьма полезно, поскольку проясняет последовательность действий при выполнении инструкций цикла.

Обобщенная блок-схема цикла состоит из следующих блоков(см. раздел 1.3): задание начальных значений, проверка условия продолжения (окончания) цикла, тело цикла, изменение условия продолжения (окончания) цикла.

Примеры. Программирование циклов без использования инструкции цикла.

Дано: {ai}, i=1...100. Найти сумму(ai>0) и сумму(ai<0).

C

u=v=0; i=0; // Инициализация цикла

begin: if(i>=100) gotoend; // Условие окончания

if(a[ i ]>0)u+=a[ i ]; if(a[ i ]<0)v+=a[ i ]; // Тело цикла

i++; // Изменение условия

goto begin; // Переход к началу

end: ;

Basic

u=0 : v=0 : i=0 ' Инициализация цикла

begin: if i>=100 then gotokonec ' Условие окончания

if a( i )>0 then u+=a(i) ' Тело

ifa( i )<0 then v+=a(i) ' цикла

i+=1 ' Изменение условия

goto begin ' Переход к началу

konec: ..................................

Дано: {ai}, i=1...100. Найти y=max{ai} и его номер.

С

MaxElem=a[0]; NumbMaxElem=i=1; // Инициализация цикла

Begin: if(i>=100) gotoEnd; // Условие окончания

if(MaxElem<a[ i ]){ // Тело

MaxElem=a[ i ]; NumbMaxElem=i+1; //

} // цикла

i++; // Изменение условия

goto Begin; // Переход к началу

End: ;

Basic

MaxElem=a(0) : NumbMaxElem=1 : i=1 ' Инициализация цикла

Begin: if i>=100 gotoKonec ' Условие окончания

if MaxElem<a(i) thenMaxElem=a(i) : NumbMaxElem=i+1' Тело цикла

i+=1 ' Изменение условия

goto Begin ' Переход к началу

Konec: ...........................................

Различают циклы с предусловием (тело цикла может ни разу не выполняться) и постусловием (тело цикла выполняется хотя бы 1 раз).

Пример. Цикл с постусловием.

MaxElem=a(0) : NumbMaxElem=1 : i=1

Begin: ifMaxElem<a(i) thenMaxElem=a(i) : NumbMaxElem=i+1

i+=1

if i<100 goto Begin

Konec: ...........................................

Циклы с предусловием

Наиболее употребительный тип инструкции цикла. Существует несколько форм таких инструкций и в языке C, и в языке Basic. Назовем их условно циклы whileи циклы for.

Циклы while

Формат: while(<условие>)<инструкция>; Эквивалентная схема:

Basic

Формат:

do while <условие>

<инструкции>

loop

Пример. Тот же.

s=0 : u=1 : n=1

do while abs(u)>5e-6

u *= x/n

s += u

n += 1

Loop

Допустима другая разновидность этой инструкции:

do until <условие>

<инструкции>

loop

Она отличается тем, что цикл повторяется до тех пор, пока условие не примет значение true. Выбор разновидности определяется тем, какое условие(про-должения или прекращения цикла) легче сформулировать или короче записать.

Пример.

s=0 : u=1 : n=1

do until abs(u)<=5e-6

u *= x/n

s += u

n += 1

Loop

Есть еще 1 инструкция, более похожая на инструкцию языка C:

while <условие>

<инструкции>

End while

Работает так же, как инструкция do while ... loop. Различие между ними будет рассмотрено ниже.

Рекомендация. Циклы whileразумно применять в тех случаях, когда:

- число повторений тела цикла не определено;

- неизвестна закономерность повторений или она сложна.

Замечание. Заметим, что один и тот же алгоритм может быть реализован с любым видом инструкции цикла и даже, вообще, без них. В вопросе выбора вида инструкции надо руководствоваться понятностью текста программы, прежде всего, для себя, а также для других возможных читателей.

Циклы for

Формат: for([<выражение 1>];[<выражение 2>];[<выражение… Эквивалентная схема

Basic

Используется более простая форма инструкции for, которую иногда называют циклом типа арифметической прогрессии.


Формат:

for <счетчик>=<начало> to <конец> [step <шаг>]

<инструкции>

next [<счетчик>]

Эквивалентная схема:

<счетчик>=<начало>

do while <шаг> < 0 and <счетчик> >= <конец> or _

<шаг> >=0 and <счетчик> <= <конец>

<инструкции>

<счетчик> += <шаг>

loop

Замечания.

1. <счетчик> - переменная (без индексов!) числового типа, <начало>, <конец>, <шаг> - арифметические выражения.

2. Если опция (часть инструкции) step отсутствует, то шаг равен 1.

3. Отсутствие <счетчика> в инструкции nextне влияет на работу цикла, являясь, по существу, дополнительным комментарием, особенно при вложенных циклах, о которых речь пойдет ниже.

4. Значение <счетчика> после окончания цикла равно последнему присвоенному значению (как в языке C).

5. Значения <начало>, <шаг> и <конец> вычисляются 1 раз при входе в цикл. Изменение переменных, входящих в эти выражения, в инструкциях тела цикла не влияют на число повторений, поэтому так действовать не рекомендуется.

Пример. Дано: {ai}, i=1...100. Найти сумму(ai>0) и сумму(ai<0).

u=0 : v=0

for i=1 to 100

if a(i)>0 thenu += a[i] : ifa(i)<0 thenv += a(i);

next i

Циклы с постусловием

C Формат: do <инструкция> while <условие>;

Do

<инструкции>

loop {while|until} <условие>

Пример. Тот же.

s=0 : i=0

p=1

Do

s += a( i )

p *= a( i )

i += 1

loop while i<100

Вложенные циклы

Суть: инструкция тела цикла есть другая инструкция цикла.

Примеры.

1.Умножение матриц. C=A*B, где:

{aik}, i=1... m, k=1... n; {bkj}, k=1...n, j=1... l; {cij}, i=1...m, j=1...l cij=Saik*bkj

C

for(i=0; i<m; i++){

for(j=0; j<l; j++){

c[ i ][ j ]=0;

for(k=0; k<n; k++){

c[ i ][ j ]+=a[ i ][ k ]*b[ k ][ j ];

}

}

}

Basic

for i=0 tom-1

for j=0 tol-1

c( i, j )=0

fork=0 ton-1

c( i, j ) += a( i, k )*b( k, j )

nextk

next j

next I

2.Сортировка по неубыванию элементов массива методом "пузырька".

C

pr=1; // pr – признак наличия перестановки: 1- есть перестановка, 0 - нет

while(pr){

pr=0;

for(i=0; i<n-1; i++){

if(a[ i ]>a[ i+1 ]){ // Сравнение "соседей"

b=a[ i ]; a[ i ]=a[ i+1]; a[ i+1]=b; pr=1;//Произошла перестановка

}

}

}


Basic

pr=true ' pr – признак наличия перестановки: 1- есть перестановка, 0 - нет

do while pr

pr=false

for i=1 ton-1

if a(i)>a(i+1)) ' Сравнение "соседей"

b=a( i ): a( i )=a(i+1): a(i+1)=b: pr=true'Произошла перестановка

endif

next i

Loop

3.Цикл с вещественным(дробным) параметром. Вычислить значение функции P(x)=anxn+an-1xn-1+...+a1x+a0 при изменении x от 2 до 3 с шагом dx=0.1.

Схема Горнера – вычисление полинома (многочлена): вывод формулы.

a3x3+a2x2+a1x+a0= (a3x+a2)x2+a1x+a0= ((a3x+a2)x+a1)x+a0

C

j=-1;

for(x=2; x<3.05; x+=.1){ // Формирование массива значений

j++;

p[ j ]=0; // Вычисление значения полинома для заданного x

for(i=n; i>=0; i--){

p[ j ]=p[ j ]*x+a[ i ];

}

}

Basic

j=-1

for x=2 to 3.05 step 0.1 ' Формирование массива значений

j=j+1

p( j )=0 ‘ Вычисление значения полинома для заданного x

for i=n to 0 step -1

p( j )=p( j )*x+a( i )

next i

next x

4. Дана матрица {aik}, i,k=1...10. Найти {bi}, i=1...10, где

1, если в i-й строке диагональный элемент максимален

bi=

0, если нет

C

for(i=0; i<10; i++){

for(k=0; k<10 && a[ i ][ k ]<=a[ i ][ i ]; k++);

if(k==10){

b[ i ]=1;

}else{

b[ i ]=0;

}

}

Basic

for i=0 to9

k=0

do while k<=10 and a(i,k)<=a(i,i)

k += 1

Loop

if k=10 thenb(i)=1 elseb(i)=0

next i

Управляемые переходы

Предназначены для выхода из сложных инструкций управления, например, циклов.

В языке C есть 2 инструкции управляемых переходов.

Инструкция break

Формат: break; Эквивалентная схема:

Инструкция continue

Формат: continue; Эквивалентная схема:

Инструкции exit

В языке Basicимеется семейство инструкций exit, которые действуют аналогично инструкции breakв языке C. Каждая инструкция должна находиться внутри соответствующей сложной инструкции и действует только на нее. В рассмотренном ниже примере используется инструкция exit for.

Пример. Дано {xi}, i=1...30. Найти длину первой подпоследовательности, состоящей только из положительных элементов.

pr=false : kol=0

for i=0 to29

if x(i)>0 then

kol += 1 : if notpr thenpr=true

End if

if x(i)<=0 and pr then exit for

next

Замечание. Если используются вложенные циклы do, forили while, а в теле самого внутреннего цикла инструкция exit, то exit doдействует только на цикл do, exit for – только на цикл for, exit while – только на цикл while.

Многоальтернативный выбор

Это инструкции, которые разумно использовать при программировании развилок более, чем на 3 ветви.

Инструкция switch (язык С)

switch(<выражение>) <инструкция> Выражение должно быть целого типа. Инструкция должна быть составной. В противном случае вся конструкция теряет смысл. В ее состав должны входить…

Next

emp=0 : other=0

for i=0 to 29

select case x( i )

case “0” to “9”

digit(x( i )-“0”) += 1

case “ “, “\n”, “\t”

emp += 1

Case else

other += 1

End select

Next

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Какие преимущества имеет инструкция присваивания языка C перед аналогичной инструкцией языка Basic?

2. Какой новый объект программы позволяет выполнить инструкцию goto?

3. Допустим ли выход из тела цикла с помощью инструкции goto?

4. Можно ли реализовать разветвление алгоритма более, чем на 2 ветви?

5. Почему необходимо в языке Cналичие пустой инструкции?

6. В чем смысл составной инструкции?

7. Можно ли организовать цикл, не используя инструкцию цикла?

8. В чем преимущество циклов с предусловием?

9. Можно ли изменять конечное значение счетчика цикла внутри тела цикла в инструкции for языка Basic? А в инструкции for языка C?

10. Чему равно значение счетчика цикла после его окончания? Отличается ли это правило для языков Basic и C?

11. В чем разница в действиях инструкций breakи continue языка C?

12. Происходит ли выход из инструкции switch по достижения конца ветви case? А в инструкции selectязыка Basic?

Контрольные вопросы

1. Можно ли считать запись i++; инструкцией присваивания?

2. Можно ли использовать в качестве метки целое число? Если можно, то в каком языке?

3. Как выполняется помеченная инструкция, если она достигнута не с помощью инструкции goto, а в естественном порядке выполнения программы?

4. Почему в языке Basicне нужны пустая и составная инструкции?

5. Можно ли в однострочной форме инструкции ifязыка Basic выполнить разветвление более, чем на 2 ветви?

6. Перечислите блоки обобщенной блок-схемы цикла.

7. Какова функция <выражения 3> инструкции for языка C?

8. Когда разумно использовать цикл с постусловием?

9. Когда форма do until языка Basic удобней, чем форма do while?

10. Может ли инструкция exit doзавершить цикл for?

11. Могут ли иметь одинаковые значения выражения в ветвях case инструкций switchиselect?

ВВОД-ВЫВОД

Ввод-вывод в языке Basic в данном разделе не рассматриваем.

Ввод-вывод – это передача данных между переменными программы в оперативной памяти и внешней средой.

Ввод – это передача: внешняя средаàоперативная память, вывод – оперативная памятьàвнешняя среда.

Здесь рассмотрим только форматный обмен, т.е. обмен с преобразованием данных. В языке C обмен данных производится с помощью функций, прототипы которых хранятся в файле stdio.h.

Основными функциями форматного ввода-вывода являются: printf – вывод на экран, scanf – ввод с клавиатуры.

Формат обращения к ним:

{scanf | printf}(<управляющая строка>[, <список-данных>]);

Управляющая строка

Формат одной спецификации: %[<флаги>][W][.D][l]<тип> Флаги для функции printf (для функции scanf они не используются):

Вывод символьной информации

Вывод. Также.излагаются не все возможности. Цель данного раздела – дать средства для формирования пояснительных надписей. Символы управляющей строки, не входящие в спецификации, выводятся в порядке их… Пример.

Инструкции printf и scanf. Схема ввода-вывода

Функции printf и scanf обычно используются в виде отдельных инструкций, которые получаются добавлением к обращению к ним символа ";". Однако, как и большинство других функций, они могут использоваться в выражениях и, следовательно, должны возвращать некоторое значение. Функция printfвозвращает число выводимых символов (байтов), а функция scanf -число введенных скалярных значений.

Элементы списка данных функции scanf– адреса переменных, значения которых задаются, поэтому необходимо использовать оператор & (нахождение адреса).

Примеры.

l=scanf("%d%f%d", &a, &x, &b);

n=printf("a=%d x=%.5g b=%d\n", a, x, b);

printf("l=%d n=%d\n", l, n);

На экране отобразится:

12 23.278e-3 45(Enter) Вводятся с клавиатуры

a=12 x=0.023278 b=45 Результаты

l=3 n=23 вывода

printf("Рост:"); scanf("%f", &height); printf("Вес:"); scanf("%f", &weight);

На экране отобразится:

Рост:181.5

Вес:75.6

Обмен данных происходит через специальную область памяти, выделяемую операционной системой и называемую буфером, причем буферы ввода и вывода различны. Каждый буфер имеет фиксированный размер, вводимые и выводимые символы сначала накапливаются в соответствующем буфере и только по выполнении некоторого условия и необходимых преобразований отправляются по назначению.

 
 


Ввод.

 

 
 


Вывод.

При вводе это происходит при получении необходимого числа символов для формирования элемента данных, определяемого параметром спецификации W, либо по приходе специального символа – ограничителя, сигнализирующего об окончании ввода символов для текущего элемента данных. Для функции scanf такими ограничителями являются знаки разрядки. Полученная последовательность символов преобразуется во внутреннее представление элемента данных согласно спецификации управляющей строки и отправляется в область памяти соответствующего по списку данных объекта программы. Появление в последовательности символа, который не может быть преобразован в соответствии со спецификацией, также играет роль ограничителя, т.е. прекращает формирование очередного элемента. Следовательно, функция scanf получает на вход символьную строку, а в качестве результата возвращает внутреннее представление объекта из списка данных.

Последующие инструкции ввода продолжают заполнять буфер. При заполнении буфера его содержимое передается в память, буфер очищается и процесс повторяется. Символ перевод строки принудительно очищает (закрывает) буфер ввода. Поскольку функция scanf отображает вводимые символы на экран, то, пока буфер ввода не закрыт, процесс вывода на экран блокируется. Это может привести к тому, что, хотя инструкция scanf выполнена, следующие за ней инструкции printf не смогут вывести данные на экран, пока не будет введен символ перевод строки. В примере видно, что сначала на экране будет отображен ввод первого объекта из списка данных второй инструкции scanf и только затем появится вывод предыдущей инструкции printf.


Пример.

scanf("%d%f%f%f", &a, &b, &c, &d);

printf("/%d/%e/%f/%e\n", a, b, c, d);

scanf("%d%f", &e, &f);

printf("/%ld/%e/\n", e, f);

На экране имеем:

1 -2.347e-5 -236.485 2e10 4612347(Enter) Это ввод!

/1/-2.347e-05/-236.485000/2.00000e+10/

-94.56e-5(Enter)

/4612347/-9.45600e-04/

При выводе результат появится на экране только при заполнении всего буфера вывода. Последнее содержимое незаполненного буфера вывода отображается при завершении программы. Это иногда приводит к неожиданным последствиям. Если во время работы программы произошла ошибка и в это время буфер был не заполнен, то на экране его содержимое не появится. Это надо иметь в виду при попытке обнаружить место происхождения ошибки в процессе отладки программы.

При выводе происходит обратное преобразование элементов списка данных из внутреннего представления в символьную строку.

Ввод-вывод массивов

Напомним, что одна спецификация передает одно значение, поэтому для организации ввода-вывода массивов в программе следует организовать цикл(ы), в теле которого необходимо поместить функцию printfили scanf.

Ввод

printf("Ввод массива\n");

for(i=0; i<10; i++){

for(j=0; j<10; j++){

scanf("%f", &a[ i ][ j ]);

}

}

Вывод

printf("%32cИсходный массив\n", ' ');

for(i=0; i<10; i++){

for(j=0; j<10; j++){

printf("%15.5g", a[ i ][ j ]);

if((j+1)%5==0)printf("\n"); // Перевод строки после вывода каждого

} // 5-го значения, чтобы не выйти за пределы

} // экрана. Его размер 80 позиций

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Что происходит, когда длина выводимого значения больше величины W?

2. При каких условиях при выводе значений с плавающей точкой не ставится десятичная точка?

3. Перечислите символы – ограничители ввода.

4. Чем отличаются правила ввода значений по спецификациям fи e?

5. Что возвращают функции printfи scanf?

Контрольные вопросы

1. Почему при вводе не используется второй параметр спецификации D?

2. При каких условиях производится округление выводимого значения?

3. Как организуется ввод элементов массива?

4. Когда разумно применять спецификацию g?

ПРОЦЕДУРЫ

Распределение памяти

Распределение памяти – это процесс, связывающий некоторую область памяти с какой-либо переменной так, что элемент данных, описанный этой переменной, может быть размещен в этой области.

СХЕМА

Предметная область Программист Память

скаляры,

элементы массивов имена адреса

и структур

Источник информации: определения переменных.

C: инструкции описания типа: int long float double char.

Basic:инструкция dim.

Распределение скаляров

C(C++) Basic Объем в байтах
char, bool Byte, string (1 символ)
short integer, boolean
int, long, float long, single
double double

Для некоторых трансляторов языка C, в том числе для Borland 3.1, длина значения типа int равна 2 байта.

Распределение массивов

где S – длина одного элемента данного типа, m – число измерений (размерность массива), di – число элементов массива в i-м измерении (длина измерения),

Статическое и динамическое распределение памяти

Различают 2 механизма распределения памяти.

Статический: объекты программы получают постоянный адрес в памяти. Занимаемое ими пространство освобождается только после окончания программы.

Динамический: память под объекты выделяется и освобождается во время выполнения программы.

Блоки

Конструкция присутствует только в языке C.

Блок – это ограниченная последовательность инструкций, задающая границы области действия имен, описанных (или определенных) в нем, и управляющая динамическим распределением памяти для этих данных. Такие объекты называют локализованными в блоке или просто локальными данными. Блок выполняется в естественном порядке следования инструкций.

Формат:

{ <описания и определения> <выполняемые инструкции>}

Пример.

{int i, j; //Определения локальных данных

for(i=0; i<l; i++){

s[ i ]=0;

for(j=0; j<k; j++){

s[ i ] += p[ i ][ j ]*q[ j ];

}

}

}

Как видно из синтаксиса и примера, блок – это составная инструкция, дополненная описаниями и определениями объектов программы.

Блок – это минимальная структурная единица программы на языке C.

Процедуры

В различных языках программирования допускаются внешние и внутренние процедуры. Внешняя процедура не содержится внутри любой другой процедуры, может… По своей организации процедуры принято разделять на подпрограммы и функции. … Подпрограмма – это процедура, которая может возвращать произвольное число (от 0 до любого) параметров (результат…

Определения процедур

Формат функции: [<тип>] <имя>([<описания_параметров>])<блок> В блоке обязательно присутствие инструкции вида return<выражение>, значение которого возвращается в точку…

End function

Возвращаемое значение непосредственно присваивается имени функции.

Примеры.

function Minfun(x( ) as single, n as integer) as single

dim i as integer,j as integer, MinValue as single, y as single

................................................................................

MinValue=2*y+5

End function

Определение функции Вызов

function Max(aas double, bas double) as double y=Max(cos(x), sin(x));

dim yas double;

if a>b then

y=a

Else

y=b

End if

Max=y

End function

По понятиям языка Cподпрограмма – это функция, не возвращающая значения. Для указания типа возвращаемого значения в этом случае используется… Пример. void fun(void){

Exit sub

..................................

End sub

Для возвращения в точку вызова используется инструкция exit sub. Если возврат производится в конце процедуры, то употребление инструкции exit subне нужно.

Пример (подпрограмма). Вызов:

' Умножение матрицы на вектор call Matrix(a, b, c, m, n);

sub Matrix(p(9,9)as double, _

q(9) as double, _

s(9) as double, _

l as integer, _

k as integer)

dim ias integer, j as integer

for i=0 tol-1

s( i )=0

for j=0 to k-1

s( i )=s( i )+p( i )( j )*q( j )

nextj

next i

End sub

В языке Basic операционная система передает управление либо объекту программы, называемому формой, либо главной процедуре Sub Main.


Связь между вызывающей и вызываемой функциями

Схема обмена данными между процедурами:

 


Входные аргументы Выходные аргументы

Результат

Исходные данные Результаты

Входные параметры Выходные параметры

 

Возвращаемое значение функции разумно считать специфическим выходным параметром.

Механизмы передачи данных

Передача по значению подразумевает копирование аргумента и отправку в вызываемую процедуру его копии. Это означает, что изменить в вызываемой… Во втором механизме передается адрес аргумента и, следовательно, возможно его… В языке Cреализован механизм передачи по значению, поэтому для обеспечения возврата результатов выполнения процедур…

Передача скаляров

Возвращаемое значение

C

Если возвращаемое значение имеет тип не int, то указание типа в заголовке функции обязательно. В подпрограммах для указания типа возвращаемого значения (которого нет) используется ключевое слово void. См. выше.

Пример.

float max(float a, float b){

........................

}

Basic

Тип возвращаемого значения в функциях надо указывать всегда. Если он не указан, то функция возвращает тип variant, который будет рассмотрен в другом разделе. Синтаксис подпрограмм такого указания не требует.

Входные данные

Перед передачей входные аргументы, если требуется, преобразуются в соответствии с прототипом. Пример. Вызывающая процедура Вызываемая процедура

Выходные данные

Поскольку в языках Cи C++ реализована передача аргументов по значению, то для того, чтобы в вызываемой процедуре можно было изменять значение… Пример. Дана матрица {aij}, i,j=1...10. Найти max{aij} и его индексы. float maxmatr(float a[10][10], int *k, int *l){

Передача массивов

Если аргумент процедуры – массив, то используется механизм передачи по адресу. При этом в список аргументов включается имя массива, в вызываемую… Пример. Аргументы Параметры

Передача функций

Этот специфический вид аргумента позволяет придать программе универсальность. Пример. Найти y=min(f(x)), где {xi}, i=1...n. Существует множество методов… Сопряжение, т.е. имя функции со списком аргументов, min_fun(x, n, dx, eps, f) практически одинаково для различных…

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Что такое блок?

2. Есть ли в языке Basic главная процедура?

3. В каком языке не определено понятие подпрограммы?

4. Что такое указатель на функцию?

5. Чем являются выходные скалярные параметры в языке C?

6. Что передается в вызываемую процедуру, если аргумент – имя массива?

Контрольные вопросы

1. Чем отличается статическое и динамическое распределение памяти?

2. Что является минимальным элементом структуры программы в языке C?

3. Зачем нужны процедуры?

4. В чем отличие передачи аргументов по значению от передачи по адресу?

5. Перечислите различия в инструкциях возврата значения функции в языках Basic и C.

6. Является ли возвращаемое значение функции выходным параметром?

ПРЕПРОЦЕССОР

Этот раздел касается только языков Cи C++. Препроцессор – это специальная программа, обрабатывающая текст приложения до этапа его трансляции. Основные функции: определение символических констант и включение файлов. В отличие от инструкций управляющие конструкции препроцессора называют директивами (признак директивы: символ "#" в первой позиции). Действие директивы (область действия) распространяется до конца файла, содержащего текст программы (если не встретится специальная отменяющая директива). Директивы могут располагаться в произвольном месте программы.

Определение символических констант

Пример. PI=3.141593 TAB_SIZE=100 Стиль записи: принято записывать символические константы прописными буквами. В примере с вычислением квадратичной…

Включение файлов в текст программы

Принятые по умолчанию типы файлов для языков C и C++: .c - исходный текст на языке C, .cpp - исходный текст на языке C++,

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. С какой позиции записываются директивы препроцессора?

2. Какова область действия директивы?

3. Можно ли обойтись без директивы #include в языке C?

Контрольные вопросы

1. Что такое препроцессор?

2. В чем выгода применения директивы #define?

3. В каких заголовочных файлах находятся прототипы математических функций и функций ввода-вывода?

 

СТИЛЬ ПРОГРАММИРОВАHИЯ

Основной принцип хорошего стиля программирования – писать так, чтобы программу могли прочесть не только машины, но и люди.

Стиль – набор приемов или методов программирования, используемых для получения правильных, удобных для применения, легкочитаемых и, желательно, эффективных программ. Особый стиль – это программы, понятные лишь автору. Практически стиль – это набор рекомендаций по написанию программ, удовлетворяющих перечисленным выше принципам. Приведенные ниже рекомендации в равной степени подходят и к языку C, и к языку Basic.

Формирование листинга

Размещение инструкций. Следует записывать 1 инструкцию (кроме сложных) в строку. Причины: - соответствует требованиям структурного программирования, требующим сдвигать инструкцию по строке в соответствии с…

Комментарии

При написании комментариев следует учитывать уровень возможных читателей текста программы. Второй момент: когда писать? Рекомендуется записывать… Вопрос о количестве (объеме) комментариев является дискуссионным. Их… Можно также привести грубый количественный критерий: ориентировочный объем комментариев – 50-70% от объема кода…

Имена

Имена объектов программы должны быть осмысленными.

Пример.

tip razmer adress

Hе надо!

xx aa a1 a2

В настоящее время во всем мире приняты 2 системы записи (нотации) имен: "паскалевская" и "венгерская". Обе рекомендуют использовать имена, состоящие, в общем случае, из нескольких слов. В "паскалевской" нотации каждое слово начинают с прописной буквы.

Пример.

BegKm EndKm FieldName

В "венгерской" нотации перед именем записывается тип объекта программы.

Пример.

intBegKm intEndKm charFieldName

Не используйте в программе сходные имена!

Пример.

value values

ax1 axi

k K

Если имя содержит цифры, записывайте их в конце.

Пример.

fund1 Tab15

Имя не должно совпадать с ключевым словом (для языков, где ключевые слова не резервируются) или с именем библиотечной или встроенной функции.

В языках Basic и С ключевые слова зарезервированы, т.е. при подобном совпадении транслятор выдает ошибку. Однако в некоторых языках допустимы такие конструкции.

Пример. PL/1.

if if = then then

then=else;

Else

else=if;

Язык и приемы программирования

Активно используйте удобные и понятные особенности языка.

Пример.

a=b=0; k++; x+=c; //Многократное присваивание – это удобно!

Basicàx=5 : y=x^3-2 '2-3 связанные короткие инструкции в 1 строку

Изучайте и используйте библиотечные функции. Малоупотребительные комментируйте.

/* pow(x,n) – возведение x в степень n */ 3. Не применяйте трюки! Пример. Формирование единичной матрицы.

Избегайте промежуточных переменных. Формулы следует в записывать в том же виде, как это принято в математике.

Пример.

y=2*(a+b) / sqrt((a+b)*(a+b)+(c+d)*(c+d));

Не изменяйте значение параметра цикла внутри тела цикла.

Это затрудняет понимание логики программы. Кроме того, некоторые языки программирования (Fortran) в целях оптимизации по времени работы помещают копию параметра цикла в регистр процессора. В этом случае изменение параметра цикла в теле цикла не повлияет на условие его выполнения, что почти наверняка приведет к ошибке.

Избегайте инструкций перехода.

Эти инструкции нарушают естественный порядок выполнения программы. Придерживайтесь принципа: текст программы надо читать как книгу слева направо и сверху вниз.

Не используйте помеченные инструкции, на которые нет ссылок.

Единственный смысл такого применения меток – это дополнительное комментирование. Зачем тогда комментарии языка?

Объявляйте все переменные явно.

Явное объявление, кроме своей основной функции определения типа объекта программы, позволяет выявить 1 весьма распространенный вид ошибок – описки. Применение подобных имен в тексте вызовет ошибку или предупреждение при трансляции.

Не используйте одни и те же переменные для различных целей.

При последующей модификации одного фрагмента программы такие переменные могут вызвать ошибку в другом фрагменте.

Не забывайте, что данные с плавающей точкой есть приближенные представления десятичных значений.

Для них с осторожностью надо применять операции равно и не равно.

Пример. Цикл с вещественным параметром.

for x=0 to2 step0.05

........................

next x

Проход по телу цикла при x=2 может не выполниться. Необходимо записывать так:

for x=0 to 2.02 step 0.05

........................

next x

Используйте исчерпывающие проверки.

Если переменная должна принимать значения 1|2|3, не следует полагать, что ее значение равно 3, если оно не равно 1 и не равно 2, т.к. возможны ошибки.

Стиль в языках С и Basic

По оценке авторов:

ОВ – весьма важная рекомендация;

В – рекомендация средней важности;

МВ – рекомендация относительно малой важности.

Степень важности рекомендаций определялась на основании оценки их влияния на написание надежной (с минимумом ошибок) программы.

1. (В) Имена. Использовать "паскалевскую" или "венгерскую" нотации.

2. (В) Описатели. Поскольку различные трансляторы языка Cотводят данным типа int 2 или 4 байта, использовать для обычных целых тип short, длина элемента которого всегда 2 байта, для длинных целых long – длина всегда 4 байта. Если постановка задачи не требует повышенной точности представления, использовать для данных с плавающей точкой типы float (C) и single (Basic).

Литералы.

#define TRUE 1 #define FALSE 0 Не следует забывать, что логические данные в программе на языке Basic занимают в памяти 2 байта, значения хранятся в…

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Как разумно размещать инструкции текста программы?

2. Какую роль играют отступы при размещении вложенных инструкций?

3. В чем суть "венгерской" нотации имен?

4. На что, вероятно, указывает предупреждение при трансляции?

5. В чем различие в применении операторов "И" и "ИЛИ" в языках Cи Basic?

6. Чем отличается действие оператора деления / в языках Cи Basic?

Контрольные вопросы

1. В каких местах нужно осуществлять перенос инструкции, если она не входит в строку?

2. Перечислите типы комментариев к программе.

3. Почему нежелательно использовать в программе схожие имена?

4. Зачем нужно явно объявлять все объекты программы?

5. Почему следует избегать инструкций перехода?

6. В чем преимущество работы с массивами в языке Basic?

ДАННЫЕ. ДОПОЛНЕНИЕ

Материал данного раздела содержит информацию о типах и совокупностях данных, специфических для конкретного языка программирования, поэтому ниже рядом с названием раздела в скобках будет указываться принадлежность описываемой конструкции к языку: C (C++)и BBasic.

Перечислимый тип

Относится к целым типам данных. Применяется для объявления целых переменных, которые могут принимать только строго определенные значения, число… enum <имя_типа>{<имя_элемента>[=<значение>], [<имя_элемента> [=<значение>]]...};

End enum

Пример.

enum spectr

Red

Orange

Yellow

Green

Blue

Violet

End enum

dim color1 asspectr, color2 as spectr Правила объявления и использования переменных этого типа полностью совпадают с… - значения переменных и перечисляемых констант относятся к типу long;

Структуры

Пример. Структура "Работник" (worker): - таб. номер; - Фамилия И.О.;

Рекурсивные структуры

Рекурсией, в общем случае, можно назвать правило, позволяющее определить некоторый объект с помощью другого объекта той же структуры. Наиболее распространены рекурсивные функции, простейшим примером которых является формула вычисления факториала: n!=n*(n-1)!

При реализации структур данных таких, как: списки, стеки и т.п., используются объекты программы следующего вида:

Пример.

struct node{

int data;

struct node *next;

};

Здесь в состав структуры включают указатель на структуру того же типа. Такие структуры называют рекурсивными. Их применение будет рассмотрено в курсе "Структуры данных".

Поля битов

Записываются такие структуры следующим образом: struct{ unsigned [<имя>]: <число битов>;

Объединения (смеси)

union [<тип>]{ описание элемента 1; описание элемента 2;

Переменные структуры

Пример. Паспортные данные: - фамилия и.о.,

Пользовательские типы данных

10.9.1. Инструкция type (B) Формат записи: type <имя_типа>

End type

Пример. dim RefStar asstar, ViewStar asstar, Pattern( ) as star Элементы пользовательского типа (структуры) иногда называют полями. Обращение к элементу (полю) имеет вид:

Преобразование типов

Различают автоматические преобразования, которые выполняются транслятором в случае вхождения в состав выражения объектов разных типов, и явные преобразования, задаваемые указанием программиста.

Автоматические преобразования

Для языка C это можно выразить следующими цепочками: charàshortàintàlongàdouble floatàdouble Для языка Basic:

Явные преобразования

(<имя-типа>)<выражение> Пример. sqrt((double)n)

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Что произойдет при присваивании переменной типа enum значения не из списка допустимых значений в программе на языке C? А в языке Basic?

2. Есть ли предопределенный тип для дат/времени в языке C?

3. Какое средство языка C напоминает тип variant языка Basic?

4. Для чего нужен тип void?

5. Какой язык позволяет менять структуру и размеры массивов во время выполнения программы?

6. Может ли структура быть элементом другой структуры?

7. Как называются инструкции, задающие пользовательский тип данных в языках C и Basic?

8. Каков основной принцип автоматических преобразований числовых типов данных?

Контрольные вопросы

1. Можно ли использовать данные типа currency не в денежных расчетах?

2. Есть ли средства для манипулирования частями массивов, например, строкой или столбцом матрицы? Если есть, то в каком языке и какие?

3. Есть ли средства для работы с битами? Назовите, если они есть.

4. Что называют рекурсивной структурой?

5. Что является признаком переменной структуры?

6. Что такое объединение?

7. Отличаются ли правила обращения к элементу структуры в языках C и Basic?

8. Каковы недостатки использования типа данных variant?

9. Напишите инструкцию явного преобразования типа языка C.

 

 

ОПЕРАТОРЫ. ДОПОЛНЕНИЕ

В этом разделе рассматривается полный перечень операторов языка C, указывается приоритет и порядок выполнения каждого из них. Это связано с тем, что в разделе 4 были приведены не все операторы языка. Операторы языка Basic ранее были рассмотрены практически полностью и поэтому не обсуждаются.

Каждый оператор характеризуется: числом операндов, уровнем (приоритетом) и порядком выполнения. По числу операндов операторы делятся на одноместные (унарные), двуместные (бинарные) и трехместные (тернарные). Уровень 1 означает наибольший приоритет. Порядок выполнения операторов одного уровня может быть слева направо (à) и справа налево (ß).

Уровень 1

Операторы: ( ) [ ] . -> Первые два оператора означают: (...) – список аргументов процедуры, [...] –… Пример.

Уровень 2 (унарные или одноместные операторы)

Порядок: ß

Операторы:

* - извлечь содержимое памяти по известному адресу,

& - получить адрес объекта, для которого задано определение,

+ - присвоение знака,

-- изменение знака,

! - логическое отрицание,

~ - обращение двоичного представления,

++ - увеличение,

-- - уменьшение,

(<имя-типа>) - приведение типа,

sizeof(a) - объем операнда в байтах, где a - выражение|имя-типа.

 

Рассмотрим правила и примеры применения некоторых операторов данной группы.

Операторы * и & применяются при работе с объектами типа указатель (pointer). * имеет операндом выражение типа указатель, то есть определяющее некоторый адрес в памяти, результатом будет значение, лежащее по этому адресу. Для оператора & операндом является любой объект программы (скаляр, массив или структура), которому выделена память. Результатом будет начальный адрес отведенной объекту памяти. Для переменных типа указатель литералы не определены, т.е. указателю нельзя задать непосредственно адрес памяти.

Пример.

short x, y, *px;

............

x=15;

px=&x;

y=*px; // Это эквивалентно y=x

Для указателей применимы операторы сложения и вычитания.

Пример.

y=*(px+a);

y будет равно значению, которое находится в памяти, смещенной относительно адреса px на aэлементов типа short, т. е. на 2*a байтов. Такие манипуляции имеют смысл только для массивов, элементы которых по определению занимают непрерывную область памяти и располагаются с некоторого начального адреса.

Одноместный оператор + применяется редко, чтобы избежать перестановки коммутативных операндов, когда порядок вычислений существенен. Одноместный оператор - используется для изменения знака операнда и имеет особенности только для операндов типа unsigned, которые не могут принимать отрицательных значений.

Пример.

unsigned short a, b;

a=45846;

b=-a; // b=65536-45846=19690 Такую операцию называют сложением по модулю 216

Оператор ~ является битовой операцией и носит название обращение двоичного представления или поразрядное отрицание.

Пример.

unsigned char a, b;

................

a=201; // =3118=110010012

b=~a=54; // = 668=001101102

Операторы ++ и -- имеют 2 формы: постфиксную: p++ и префиксную: ++p. Разница между ними заключается в том, что, если эти операторы входят в состав более сложного выражения, то при постфиксной форме сначала вычисляется это более сложное выражение, затем происходит изменение значения переменной, а при префиксной форме – наоборот.

Примеры.

int x, n, y;

..........

n=5;

x=++n; // x=6; n=6

y=n++; // y=6; n=7

Дано {ai}, i=1...100. Сформировать {bk}, k=1...100 из ai<0 в порядке их следования.

k=0;

for(i=0; i<100; i++){

if(a[ i ]<0){

b[k++] = a[ i ];

}

}

Оператор sizeof (размер) используется для вычисления объема памяти, занимаемого операндом. Операнды бывают двух типов: <выражение>|<имя_типа>. В первом случае результатом будет значение выражения. Частным случаем выражения является имя объекта программы (скалярной переменной, массива или структуры).

Пример.

short a, b[100], x;

x=sizeof(a); // 2 байта

x=sizeof(b); // 200 байтов

 

Форма sizeof(<имя_типа>) в качестве результата дает объем памяти, отводимый под переменную данного типа. Заметим, что в качестве типа может использоваться тип данных, определенный программистом.

Пример.

sizeof(short) // 2 байта

sizeof(date) // 12 байтов

Чаще всего данный оператор употребляется при выделении памяти, управляемом программистом. Средства такого выделения памяти будут рассмотрены в другом разделе.

Уровень 3 (мультипликативные операторы)

Порядок: à

Операторы: * - умножение, / - деление, % - остаток от деления.

При выполнении оператора * транслятор может переупорядочивать операнды. Иногда это может привести к проблемам. В общем случае a*b*f(&a) != f(&a)*a*b, поскольку при выполнении функции f значение переменной a может измениться.

Уровень 4 (аддитивные операторы)

Порядок: à

Операторы: + - сложение, - - вычитание.

Операндами являются арифметические выражения и\или указатели. При работе с указателями имеются существенные ограничения. При сложении второй операнд может быть только целым литералом или переменной, которая задает смещение относительно исходного адреса на соответствующее число элементов типа указателя. Например, если pимеет тип short*, то выражение p+i дает смещение от значения pна 2*i байтов, если pимеет тип double*, то смещение составит 8*i байтов. Как правило, все получаемые адреса должны находиться в пределах памяти, отведенной некоторому массиву, иначе подобные манипуляции приводят к ошибкам и теряют смысл.

Пример.

double *p, *q, a[100];

int l;

...................

p=&a[5];

q=&a[71];

l=q-p; // l=66

Уровень 5 (сдвиги)

Это битовые операции.

Порядок: à

Операторы: >> - сдвиг вправо, << - сдвиг влево.

Выражение с данными операторами имеет вид: E1>>E2, где E2 - число битов сдвига. Операнд E1 обычно является беззнаковой целой переменной, которой задается восьмеричное или шестнадцатиричное значение.


Пример.

unsigned shorta, b, c;

..........

a=0x0ff0;

b=a<<4; // b=ff00;

c=a>>4; // c=00ff;

Уровень 6 (отношения)

Порядок: à

Операторы: < - меньше, <= - меньше или равно, > - больше, >= - больше или равно.

Операнды: арифметические выражения|указатели.

Нельзя записывать кратные неравенства так: a<b<c. Правильная запись имеет вид: a<c && b<c. В соответствии с порядком получаем (a<b)<c. Выражение a<b может принимать одно из двух значений: true (1) или false (0). Тогда результирующее выражение будет иметь вид: 1<c или 0<c в зависимости от значений aи b.

Уровень 7 (равенство и неравенство)

Порядок: à

Операторы: == - равно, != - не равно.

Если операндами являются арифметические выражения, то имеет место обычное сравнение и результатом выполнения оператора является значение true (1) или false (0). Для операндов – логических выражений – это логические операции: эквивалентность и неэквивалентность.

Указатель можно сравнивать только с целым 0. В файле stdio.h определена

символическая константа #define NULL 0, которая употребляется для указания того факта, что указатель не адресует никакую область памяти.

Поразрядные операторы

Порядок: à

Оператор Уровень Наименование
& И
^ Исключающее или
| Или

Операторы имеют тот же смысл, что и ранее рассмотренные логические операторы, но обрабатывают отдельные двоичные разряды. Отсюда и название: поразрядные или битовые. Операндами для них являются целые (лучше беззнаковыеunsigned) значения.

Пример.

unsigned a, b, c, d, e;

..........

a=0x7ac3; // 0111 1010 1100 0011 – двоичное представление

b=0x5bf9; // 0101 1011 1111 1001

c=a&b; // 0101 1010 1100 0001 -> 0x5ac1

d=a^b; // 0010 0001 0011 1010 -> 0x213a

e=a|b; // 0111 1011 1111 1011 -> 0x7bfb

Логические операторы

Порядок: à

Оператор Уровень Наименование
&& И
|| Или

Если первый операнд для оператора && равен 0, то второй не вычисляется. Если первый операнд для оператора || равен 1, то второй не вычисляется.

Уровень 13 (условное выражение)

Порядок: à

Правило записи: e1?e2:e3, где e1, e2, e3 - выражения.

Порядок вычисления:

- вычислить e1;

- если e1 != 0, то результат = e2, иначе результат = e3.

Пример.

a<b ? 2*x : x/2

Уровень 14 (операторы присваивания)

Порядок: ß

Правило записи: e1[<op>]= e2

Здесь e1 - переменная (простая или с индексами), которой задается значение e2. e2 - выражение. e2 преобразуется к типу e1 (если возможно). Запись <op> является необязательной и означает выполнение указанной операции над "старым" значением e1 (в качестве второго операнда выступает e2), а затем присваивание полученного "нового" значения переменной e1. Допустимыми операциями являются: + - сложение, - – вычитание, * – умножение, / – деление, % – остаток, >>, << – сдвиг вправо или влево, &, ^, | – поразрядные операторы.

Пример.

a*=5; // Это эквивалентно a=a*5;

Замечание. Выражение x*=y+1 означает x=x*(y+1), а не x=x*y+1, поскольку уровень оператора *= ниже уровня оператора +.

В комбинированных операциях значение e1 вычисляется 1 раз, т.е. выражение a[i++]*=n; эквивалентно a[i]=a[i]*n; i=i+1; (постфиксный оператор ++), а выражение a[++i]*=n; - выражению i=i+1; a[i]=a[i]*n; (префиксный оператор ++).

Оператор = может входить в состав выражения.

Пример.

while((c=getchar())!=EOF){// Это означает посимвольное чтение текстового

// файла до его окончания

EOF(End Of File) – символическая константа, означающая конец файла и определенная в файле stdio.h.

Переменная e1 может быть указателем.

Пример.

int *x;

.......

x+=2; // Изменяет значение x на 4 байта.

Замечание. Не увлекайтесь сложными выражениями, пишите проще!

11.12. Уровень 15 (оператор ',' - запятая)

Порядок:à

Формат: e1[,e2]... , где e1, e2 - выражения.

Результат имеет тип и значение самого правого выражения списка. Как правило, используется с выражениями, содержащими оператор присваивания. Весьма удобен при достаточно сложных инструкциях цикла.

Пример.

for(i=0, j=N-1; i<j; i++, j--){ // Одновременное изменение в одном цикле переменных i

// и j в разных направлениях

Некоторые замечания

1. При трансляции программы возможно переупорядочивание коммутативных или ассоциативных операторов. Если порядок вычисления важен, используйте промежуточные переменные.

2. В языке C не задан порядок вычисления операндов. При побочных эф-фектах результат машинно зависим. Побочным эффектом называют изменение значений аргументов функций. В выражении x=f(x, y)+g(&x, &y); при перестановке слагаемых изменится результат.

3. Также не фиксирован порядок вычисления аргументов функций.

Пример.

printf("%d%d\n", ++n, pow(2,n)); // Результат неоднозначен

4. Не применяйте неоднозначных выражений. Чему равно, например, выражение a[i++] = i++;? Так не писать не следует!!!

Постоянные выражения

Постоянные выражения – это выражения, состоящие из литералов и символических констант. Они используются в таких конструкциях языка, как:

- многоальтернативный выбор – инструкция switch, опция case;

- границы массивов;

- директивы препроцессора.

Пример.

int a[SIZE1+SIZE2];

#define PI 3.141593

#define PI2 2*PI

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Чему равно значение выражения sizeof(<имя_типа>)?

2. Какой тип должен иметь левый операнд оператора ->?

3. Дано: i=4; y=i++; x=++i. Чему равны значения i, y, x ?

4. Какой тип имеет результат выполнения унарного оператора &?

5. Что означают операторы = и == в языке C? Чей приоритет выше?

6. В чем отличие операторов унарного и бинарного оператора &?

7. Какой оператор имеет 3 операнда?

Контрольные вопросы

1. Требуется сформировать массив из отрицательных элементов другого массива. Правильно ли предложенное решение?

float x[10], y[10], s; short i, k;

for(s=k=i=0; i<10; i++){

x[++k]=y[ i ]<0 ? y[ i ] : 0;

}

2. В чем отличие постфиксной и префиксной форм оператора ++?

3. Что означают операторы & и &&?

4. В чем смысл оператора "запятая"?

5. Дано: a=3; b=4; c=5; Чему равно выражение: a<b<c ?

6. Где употребляются постоянные выражения?

 

ПЕРЕДАЧА ДАННЫХ ПОТОКОМ

Функции scanfи printf и некоторые другие, о которых речь пойдет ниже, называют функциями передачи данных потоком. Это означает, что все данные,… В языке определены 3 стандартных потока обмена данных: поток ввода stdin,… 12.1. Спецификация "s" управляющей строки функций scanf и printf

Функции getchar и putchar

Файл прототипа: stdio.h. Возвращаемое значение: символ (при успешном вводе)или EOF (ошибка ввода или… Прототип: int putchar(int); - вывод одного символа на экран.

Функции gets и puts

Файл прототипа: stdio.h. Возвращаемое значение: указатель на введенную строку (успех) | NULL-… Ограничитель ввода: символ перевод строки, который после ввода заменяется на конечный нулевой символ.

Внутренняя передача данных (функции sscanf и sprintf)

Преобразование из символьной строки во внутреннее представление. Прототип: int sscanf(char *buf, char *control, аргумент[, аргумент]...); Здесь buf – исходная строка, control – управляющая строка.

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Какие символы являются ограничителями ввода для спецификации s функции scanf?

2. Удаляются ли символы-ограничители из входного потока функцией gets?

3. Какой символ помещается в конец выводимой строки функцией puts?

4. Можно ли ввести строку, содержащую пробелы, функцией scanf?

Контрольные вопросы

1. Какой символ ограничивает ввод функции gets?

2. Что возвращает функция getcharпри ошибке ввода?

3. Для чего можно использовать функции внутренней передачи данных?

4. Какие стандартные потоки определены в языке C?

 

ФАЙЛЫ

Основные понятия

Файл – это набор данных ограниченного объема, хранящийся на некотором носителе информации. Файлом можно назвать книгу, музыку, записанную на магнитной ленте, картину на холсте и многое другое. Однако исторически сложилось, что файлом называют наборы данных, которые можно обрабатывать средствами вычислительной техники. Основными носителями информации для них в настоящее время являются: "жесткий" диск, дискета, компакт-диск (CD ROM), магнитная лента, микросхемы.

По типу организации файлы делят на 2 основных вида: последовательные и файлы с прямым (произвольным) доступом. Последовательными называют файлы, в которых для доступа к нужному фрагменту информации необходимо просмотреть всю предыдущую информацию. Примером таких файлов является информация, записанная на магнитной ленте. Этот носитель может хранить только последовательные файлы. Однако последовательная организация файлов применяется и на носителях информации, где возможен произвольный доступ. Файлы с произвольным (random) доступом позволяют обратиться к нужному фрагменту, не просматривая предыдущую информацию. Очевидно, что для нахождения нужного фрагмента эти данные должны иметь некий, отличающий их от других фрагментов файла, признак (ключ).

Также принято различать текстовые и бинарные файлы. В текстовых файлах информация хранится в виде последовательности символов, обычно разбитой на отдельные строки. Бинарные файлы содержат данные во внутреннем представлении, т.е. в том виде, в котором они хранятся в памяти компьютера в соответствии с их типом (целые, с плавающей точкой и т.д.).

В данном разделе будут рассмотрены средства работы с последовательными текстовыми файлами, как с наиболее распространенными и простыми. Такие файлы могут быть подготовлены обычными редакторами текстов, например: NotePad (Блокнот) - ОС Windows и Norton Editor (ne), Borland C++ 3.1 – ОС MS DOS. В языке Basic для цели обмена информацией между приложением и внешней средой используются специальные инструкции, а в языке C – набор библиотечных функций.

Описание файла

<имя_файла>.< расширение>. Пример. квартплата.xls

Открытие и закрытие файлов

- проверка наличия файла с данным именем при чтении; - наличие свободного пространства на диске при создании файла; - установка указателя файла на начало (позиционирование).

Средства языка С

Прототипы всех функций обмена данных хранятся в файле stdio.h.

Открытие и закрытие файла

Параметры: - a – имя файла (полный путь); - b – способ обработки:

Основные функции обмена

Прототипы: int fscanf(FILE *file,… int fprintf(FILE *file,<управляющая_строка>,[<список_данных>]);См.printf

Средства языка Basic

Открытие и закрытие файла

Инструкция open

Формат: open <полный_путь> for <режим> as #<дескриптор> Здесь:

Инструкция close

Закрывает 1 или более файлов.

Формат:

close [#<дескриптор>][, #<дескриптор>]...

Инструкция close без списка дескрипторов закрывает все открытые файлы.

Пример.

close #5, #6

Работа с файлами

Инструкция input

Читает из файла элементы данных, записанные через разделители. Разделителем могут служить следующие символы: запятая, пробел(ы), табуляция, новая строка.

Формат:

input # <дескриптор> <переменная>[, <переменная>]...

Пример.

input # 5, x, y

for i=1 to10

input #6, arr(i)

Next

В список данных нельзя включать имена массивов. Разделители и ограничивающие строковые данные кавычки игнорируются.

Функция input

Читает из файла n символов.

Формат:

input( n, <дескриптор>)

Пример.

input(FileSize, #5)

В отличие от инструкции inputчитает все символы, в том числе и разделители.

Инструкция line input

Читает из файла текстовую строку целиком и присваивает ее значение переменной типа string или variant. Текстовая строка ограничена символом перевод строки.

Формат:

line input # <дескриптор>, <переменная>

Пример.

line input # 6, VarString

Инструкция write

Записывает значения элементов списка данных в одну текстовую строку. Элементы в файле разделяются запятыми, строки заключаются в кавычки, после записи последнего элемента списка данных заносится символ перевод строки.

Формат:

write # <дескриптор>, [<выражение>[, <выражение>]...]

Пример.

write # 5, x+2, i+1

При отсутствии списка данных в файл записывается пустая строка. Инструкцию writeрекомендуется использовать, если файл затем будет читаться инструкцией input, поскольку она обеспечивает четкое разделение элементов данных.

Инструкция print

Формат: print # <дескриптор>, [<список_данных>] Разделителями элементов списка данных служат символы: ";" и ",". Если разделителем служит символ…

Инструкция width

Задает длину текстовой строки в файле.

Формат:

width # <дескриптор>, <длина>

Длина – целое выражение в диапазоне [0 – 255]. Если длина равна 0, то длина строки не ограничена. По умолчанию длина равна 0.

Пример.

width # 6, 70

print # 6, "Вектор – результат"

for i=1 to 10

print #6, x( i ),

Next

Содержимое файла будет иметь вид:

Вектор – результат

23 -45 -12 45 0

-6 -67 1 -34 21

Длина файла

Полезными могут оказаться 2 функции, возвращающие длину файла в байтах.

Длина неоткрытого файла: filelen(<путь>).

Длина открытого файла: lof(<дескриптор>).

Функция MsgBox

Формат: MsgBox(<сообщение>, , <заголовок>) Пример.

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. В чем отличие последовательных файлов и файлов с произвольным доступом?

2. Что представляют файлы с расширением по умолчанию bak?

3. Что такое дескриптор файла?

4. Что означает запись FILE* в языке C?

5. Что делает инструкция close без параметров?

6. Укажите тип первого параметра функции MsgBox.

Контрольные вопросы

1. Чем отличаются текстовые и бинарные файлы?

2. Перечислите различия в правилах записи имен файлов ОС Windows и MS DOS?

3. Что представляет собой дескриптор файла в языке Basic?

4. Перечислите и поясните значения параметра способа обработки функции open?

5. Чем отличается использование инструкций write и print в языке Basic?

6. Какой параметр добавляется в функциях работы с файлами по сравнению со стандартными потоками?

 

СТРУКТУРА ПРОГРАММЫ

Некоторые процедуры могут иметь общие данные и их разумно объединить в один фрагмент программы, назваемый модулем. Каждый модуль может… - борьба со сложностью, - возможность подключения к программе ранее разработанных компонентов,

Элементы структуры программы.

Язык C

<программа>:=<файл> [<файл>]...

<файл>:=[<объявления>][<функция>][[<объявления>][<функция>]]...

<объявления>:={<определения>|<описания>}

<функция>:=<заголовок><блок>

<блок>:={[объявления][<исполняемая_инструкция>|<блок>]...}

Определение – объявление объекта программы с выделением под него памяти.

Описание – любая невыполняемая инструкция языка или директива препроцессора.

Замечания.

1. Следует стремиться не располагать объявления вне текста функций. Если же в этом есть необходимость, то нужно располагать их в начале файла перед текстом первой функции.

2. Внутри функций объявления должны находиться перед исполняемыми инструкциями.

3. Исполняемые инструкции не могут находиться вне функций.

4. Следует избегать применения внутренних и, тем более, вложенных блоков в функциях, поскольку в большинстве приложений без них можно обойтись.

5. В состав исходных текстов программ, работающих под управлением ОС MS DOS, входят, кроме файлов с расширением .c, заголовочные файлы с расширением .h, содержащие директивы препроцессора и описания. Эти файлы добавляются к текстам .c файлов директивой препроцессора #include. В программах, работающих под управлением ОС Windows, к исходному тексту программы относят также файлы других типов, которые будут рассмотрены в последующих курсах цикла программирования.


Язык Basic

<программа>:=<файл> [<файл>]...

<файл>:=[<объявления>][<процедура>]...

<процедура>:=<подпрограмма>|<функция>

<подпрограмма>:=<инструкция sub>[<объявления>]<исполняемые_инст-рукции>end sub

<функция>:=<инструкция function>[<объявления>]<исполняемые_инструк-ции>end function

Замечания.

1. Объявления не могут располагаться между текстов процедур.

2. Внутри тела процедуры объявления должны предшествовать первой исполняемой инструкции. Исполняемые инструкции не могут находиться вне тела процедуры.

3. В состав исходного текста программ на языке Visual Basic также входят файлы других типов, которые будут рассмотрены при изучении других дисциплин.

Область видимости (действия) и время жизни переменных

Областью видимости (scope) объекта является та часть программы, в пределах которой использование его имени является корректным. Область видимости имени (определения или описания) внутреннего объекта – это… Области видимости внешнего объекта в языках Cи Basic несколько отличаются. В языке Cона распространяется от места его…

Язык C

Здесь этой цели служит атрибут класса памяти, который добавляется к объявлению объектов.

<объявление>:= [<атрибут класса памяти>] <тип> <список объектов>;

<атрибут класса памяти>:=auto|static|extern|register

Объекты класса памяти auto – это внутренние объекты, память под которые выделяется при входе в функцию или блок и освобождается при выходе. Такой тип памяти называют стек.

Объекты класса памяти static – это также внутренние объекты, но память под них выделяется только один раз и они существуют в течение работы всей программы, причем доступны они только в своей области видимости и при повторном входе в нее сохраняют предыдущие значения. Объекты static имеют одинаковую с объектами auto область видимости, но разное время жизни.


Пример. Подсчитать число обращений к функции из произвольных точек программы.

void function(...){

static int kol=0;

.................

kol++;

.................

}

Объекты класса памяти extern – это внешние объекты и поэтому потенциально доступны для многих функций. Сами функции всегда внешние, т.к. синтаксис языка C не определяет внутренних функций.

Внешние объекты служат для передачи информации между функциями как внутри одного файла, так и между функциями различных файлов. Это второй механизм передачи данных, отличный от механизма аргументов и параметров.

Каковы же возможные причины применения этого механизма?

1. Связь между функциями с большим числом объектов обмена.

2. Инициализация объектов (позже).

3. Две или более функций имеют общие данные, но непосредственно не обращаются друг к другу.

Пример.

1. Функция: добавить элемент в таблицу.

2. Функция: найти элемент в таблице.

Общие данные – таблица (или список).

Если класс памяти объекта не указан явно, то он задается по умолчанию положением его определения в тексте. Если определение находится внутри функции или блока, то класс памяти объекта – auto, если вне, то – extern. Время жизни объекта класса памяти extern равно времени выполнения приложения, т.е. оно совпадает с временем жизни объекта класса памяти static. Если внешний объект объявлен с ключевым словом static, то он локализован в файле, т.е. его имя не может быть объявлено в другом файле с ключевым словом extern.

Пример.

/* file1.c */

int i; /* класс extern */

..........

void f1(...){

int i; /* класс auto*/

..........

}

Если программа состоит из нескольких файлов, то внешние объекты могут использованы в других файлах. Для этого их необходимо описать в нужных местах с атрибутом класса памяти extern. Ключевое слово extern в данном случае означает описание и говорит о том, что определение такого объекта находится где-то в другом файле.

Пример.

/* file1.c */ /* file2.c */

void f1(...){ int i;

extern inti; ...........

............. один и тот же объект

}

voidf2(...){

int i; другой объект

.............

}

Замечание. В определениях функций ключевое слово extern записывать не надо, поскольку они по умолчанию внешние, т.е. могут быть вызваны из любого файла. Однако в случае необходимости функцию можно локализовать в файле. Для этого ее определение надо начать с ключевого слова static.

Пример.

static int a(...){ К функции a можно обратиться только из функции b.

.........

}

int b(...){

.........

n=a(...);

.........

}

Выводы.

1. В программе, состоящей из нескольких файлов, может быть только одно определение внешнего объекта (без ключевого слова extern). Объявление имени с атрибутом класса памяти extern означает описание, а не определение.

2. Область видимости внешнего имени – это текст от его определения до конца файла плюс блоки или функции в других файлах, где имеет место описание этого имени с атрибутом класса памяти extern.

3. Внешний объект с атрибутом класса памяти static локализован в файле.

4. Функции могут вызываться до их определения, если их прототипы указаны до места вызова.

5. Статические объекты при выделении памяти всегда инициализируются нулевыми(для строк – "пустыми") значениями, если не указана явная инициализация какими-либо другими значениями. Автоматические объекты при размещении не получают никакого определенного значения. Принято говорить, что после определения они содержат "мусор", если не было их явной инициализации.

Замечание. Правила явной инициализации объектов излагаются ниже.

Рекомендация. Не следует использовать внешние объекты без крайней необходимости и достаточного опыта программирования, поскольку их применение ухудшает принцип изоляции данных, который является одним из критериев надежности программ.

Объекты класса памяти register – это объекты, аналогичные объектам класса памяти auto, которые транслятор стремится разместить в регистрах процессора для обеспечения быстрого доступа. Такое размещение выполняется только при наличии свободных регистров. Атрибут применим также для параметров функции.

Замечание. Регистров мало и, если переменная используется редко, то вместо ускорения быстродействие может упасть, т.к. будет использоваться меньшее число регистров.

Язык Basic

Пример. static number as integer, point(1 to2) as single Замечание. В отличие от языка C все объекты при их определении инициализируются (не содержат "мусор")…

Проект программы

14.3.1. Использование директивы препроцессора #include В языке C откомпилировать исходные файлы и собрать из полученных объектных… Пример.

Средства управления проектом

Эти средства включены в описание сред разработки Borland C++ 3.1 иVisual Basic 6.0 и приведены в Приложениях 1 и 2.

Инициализация данных

Любое определение может задать начальное значение определяемого объекта с помощью инициаторов. Инициатор: =<выражение>|{<список_выражений>} Все выражения для static и extern объектов – постоянные, для auto и register – произвольные. Если объект типа static…

Рекомендуемая структура программы

Программы на языках Cи Basic в общем случае состоят из нескольких модулей, структура каждого из них строится по общим правилам.

Структура модуля на языке Basic

Раздел деклараций (Declarations)

общие невыполняемые инструкции

определения глобальных данных

Раздел процедур

тексты процедур и функций

Структура модуля на языке C

Декларации

определения символических констант(#define)

включаемые файлы(#include)

инструкции typedef, описания и определения внешних объектов

Функции

void main(void){

локальные определения и описания

выполняемые инструкции

}

тексты функций

 

Рекомендуемая структура не вполне корректна по следующим причинам:

- директивы препроцессора могут встречаться в любом месте файла, единственное ограничение в том, что они должны предшествовать определяемым константам;

- перед текстом функции main() могут быть определения других функций.

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Могут ли исполняемые инструкции записываться вне тела процедур?

2. Может ли в одной области видимости исполняемая инструкция предшествовать декларации?

3. Отличается ли время жизни для объектов staticи extern?

4. Объявление объекта с ключевым словом extern это определение или описание?

5. Что произойдет, если число инициаторов будет больше числа элементов массива?

Контрольные вопросы

1. В чем отличие применения ключевого слова static в языказ Cи Basic?

2. Укажите различия в действии инструкции public и атрибута extern?

3. Чем инициируются определяемые объекты в языке Basic?

4. Что определяет инструкция private?

5. Что понимают под проектом приложения?

 

УКАЗАТЕЛИ, МАССИВЫ, СТРОКИ

Материал этого раздела посвящен указателям, связи указателей с массивами, выделению памяти по указанию программиста (так называемым динамическим объектам) и строкам. Следовательно, большая его часть относится к языку C, поскольку в языке Basic нет понятия указателя. Приемы работы со строками включены в этот раздел в связи с тем, что в языке C нет такого типа данных и все манипуляции со строковыми данными осуществляются с помощью библиотечных функций, большинство из которых в качестве аргументов и возвращаемого значения используют данные типа char * (указатель на тип char). Представляется логичным рассмотреть в соответствующем подразделе средства манипулирования со строками языка Basic, которые будут специально выделены.

Указатели

Указатель – это переменная, содержащая адрес некоторого объекта программы, причем определенного типа, в том числе и заданного программистом с помощью инструкции typedef. Следовательно, указатель содержит не только адрес, но и информацию о длине объекта данного типа.

Определение указателей

Признаком указателя при объявлении переменных является символ '*'. Указатели могут быть на любой тип данных и даже на функцию, которая к данным не относится.

Пример.

char *s, *x;

double *t, *p;

complex *y; // Тип данных пользователя

Задание значений

Задать значение указателю можно следующими способами:

· p=&l; // Задание адреса объекта программы

· t=p; // Присваивание значения другого указателя

· p=NULL; // Символическая константа NULL, определенная в

// файле stdio.h, используется для задания значения,

// не указывающего ни на 1 объект программы

· scanf("%p",&q); // Ввод c клавиатуры. Спецификация p

· pt=(double*)0777000; // Ссылка на фиксированный адрес

Последние 2 способа используются редко.

Вывод значений

Используется редко.

Пример.

printf("Адрес структуры=%p\n",ptr); // Адрес структуры=FF00

Указатели и массивы

Если имеется определение вида short a[10], то упоминание имени a в про-грамме означает ссылку (адрес) на элемент массива a[0], т.е. на начальный… Над указателями можно производить любые действия, лишь бы они имели смысл. Пример.

Работа со строками

Здесь будут рассмотрены средства манипулирования со строковыми данными как в языке C, так и в языке Basic. Эти средства группируются по функциональному признаку с тем, чтобы получить представление об общих чертах и отличиях в их реализации на каждом языке. Наряду с новыми средствами будут приведены и описанные ранее. Цель такого изложения материала заключается в том, чтобы свести в одном разделе практически все аспекты обработки символьных данных.


Литералы

Правило записи строковых литералов в языках Cи Basic одинаково:

строковый литерал := "<текст>"

Пример.

"Это строковый литерал"

В языке Basic литерал типа string относится к виду строк переменной длины и занимает в памяти (10 + длина строки) байтов.

В языке C любой строковый литерал есть массив символов, заканчивающийся символом '\0', который добавляет транслятор, т.е. его длина в памяти на 1 символ (байт) больше числа символов между кавычками.

Пример.

"Это строка!" (11 знаков) à в памяти будет: Это строка!\0 (12 знаков)

Переменные


Basic

Тип данных string.

2 вида: строки переменной и фиксированной длины.

Объявление:

<имя> as string [*<длина>]

 

C

Типа данных string нет.

Вместо строковых переменных используются массивы типа char. Следовательно, они аналогичны строкам фиксированной длины языка Basic.

Объявление:

char <имя>[<длина>]


Операторы и функции


Basic

C



Ввод - вывод



Ввод строки в окноInputBox(поясняющий текст[, заголовок окна] [,значение по умолчанию][,xнач] [, yнач]).

Возвращаемое значение: строка, введенная с клавиатуры в поле ввода.

Аргументы:

- если заголовок окна опущен, то в окно помещается имя приложения;

- значение по умолчанию – значение, появляющееся в поле ввода; если пользователь согласен с

этим значением, то, не вводя значение с клавиатуры, нужно щелкнуть по кнопке ОК;

- xнач, yнач – координаты левого верхнего угла окна; если xнач опущено, то окно центрируется по горизонтали; если yнач опущено, то окно располагается примерно на уровне 1/3 от верха экрана.


Файл прототипов stdio.h.

Ввод с клавиатуры:

- функция scanf(спецификация %s);

- функция gets(char*).

Введенное значение заносится

в символьный массив. Обе функции добавляют конечный символ '\0'.

Можно заполнять символьный массив с клавиатуры в цикле с помощью функции getchar(char). В этом случае, конечный нуль не добавляется.

Пример. Поэлементное присваивание.

char str1[20], str2[20];

...................................

gets(str1);

for(i=0; str2[ I ]=str1[ I ]; i++);



Пример. InputBox("Число людей в кругу:")


Поясняющий текст: Число людей в кругу.

Заголовок окна: Flavii.

Вывод строки в окноMsgBox (сообщение[, кнопки][, заголовок]).

Возвращаемое значение: код нажатой кнопки. Используется для организации диалога. Изучить самостоятельно.

Аргументы:

- кнопки – целое выражение, кодирующее число и названия выводимых в окно кнопок; если опущено, выводится одна кнопка ОК;

- заголовок – см.функцию InputBox.

 
 

Пример. MsgBox("Остался жив №" & nomer)


Вывод на экран:

- функция printf (спецификация %s);

- функция puts(char*).

Также в цикле можно выводить строки с помощью функции putchar(char).

 



Конкатенация (сцепление)

 


Оператор &


Файл прототипов для после-дующих функций string.h.

char* strcat(левая строка, правая строка)


Копирование (присваивание)


Оператор =

char* strcpy(копия, оригинал)

 


 


Сравнение


Оператор =

Пример.

dim str1 as string, str2 as string

str1="Привет " : str2="семье!"

str1 & str2 à "Привет семье!"

if str1 = str2 then ' Результатàfalse

Есть 3 режима сравнения строк, которые задаются инструкцией вида:

option compare <режим>

Режимы:

- binary – с учетом регистра (по умолчанию);

- text – без учета регистра;

- database – для MS Access.
int strcmp(строка 1, строка 2)

Возвращаемое значение равно:

- < 0, если строка 1 < строки 2;

- ==0, если строка 1 == строке 2;

- > 0, если строка 1 > строки 2.

Пример.

char str1[20], str[20];

strcpy(str1, "Привет ");

strcpy(str2, "семье!");

strcat(str1, str2); à "Привет семье!"

if(strcmp(str1, str2)) àstr1 != str2


Длина строки

 


Len(строка)
unsigned strlen(char *);

Возвращает число символов в строке без конечного нуля.


Первое вхождение строки s2 в s1

 


InStr([начальная позиция,] где ищем, что ищем[, режим сравнения])

Возвращаемое значение: позиция, с которой строка что ищем входит в строку где ищем; если вхождения нет, возвращается 0.

Аргументы:

- начальная позиция – позиция, с которой начинается поиск; если опущена, то поиск с первой позиции;

- режим сравнения := {binary | text | database}; если опущен, то определя-ется инструкцией option compare; если задан, то начальная позиция обязательна.

Пример.

s1="0123456789" : s2="345"

k=InStr(5, s1, s2) ' k=0


char* strstr(где ищем, что ищем);

Возвращаемое значение: указатель на символ, с которого начинается вхождение s2 в s1; если вхождения нет, возвращается NULL.

Пример.

strcpy(s1, "0123456789");

­

strcpy(s2, "345");

p=strstr(s1, s2);

 


Формирование строки из повторяющихся символов


Строка из пробелов:

space(число пробелов)

Строка из произвольных повторяющихся символов:

string(число, строка)

Строка строится из первого символа строки.


char* strset(строка, символ)



Другие возможности



Выделение подстрок:

- left(строка, n)n первых символов строки;

- right(строка, n)n последних символов строки;

- mid(строка, начало[, n])n символов строки с позиции начало.

- trim(строка) – удалить пробелы с двух концов строки.

Выравнивание:

Инструкция lset строка1 = строка2

Присваивает строке1 значение строки2 и, если длина строки1 больше длины строки2, лишние "правые" символы заменяются пробелами.

Инструкция rsetстрока1 = строка2

Делает то же самое, но "прижимает" строку2 к "правой" границы строки1.


Инициализация символьного массива.

char mes[ ]="Это строка!";

Длину массива можно не указывать, транслятор сам определит ее по числу символов инициализирующей строки.


Пример. Определить, являются ли 2 строки анаграммой.


function anagr(str1 as string, str2 as _ string) as boolean

dim len1 as integer, _

len2 as integer, _

i as integer, _

j as integer, _

fl1 as boolean, _

fl2 as boolean, _

sled( ) as boolean

len1=len(str1) : len2=len(str2)

iflen1<>len2 then

anagr=false

Exit function

End if

redim sled(1 tolen1)

fori=1 tolen1

sled( i )=false

Next

i=1 : fl1=true

do while i<=len1 andfl1

j=1 : fl2=true

do whilej<=len2 andfl2

if notsled( j ) and _

mid(str1, i, 1)= _

mid(str2, j, 1) then

sled(j)=true: fl2=false

End if

j=j+1

loop

if fl2 then fl1=false

i=i+1

loop

anagr=fl1

end function
short anagr(char *str1, char *str2){

short len1,

len2,

i, j,

fl1=1,// 1 - анаграмма, 0 - нет

fl2, // 1 - символ в str2 найден,

// 0 - нет

sled[20]; /* 1 - j-й символ в str2

использован, 0 – нет */

len1=strlen(str1); len2=strlen(str2);

if(len1 != len2)return 0;

for(i=0; i<len2; i++)sled[ i ]=0;

for(i=0; i<len1 && fl1; i++){

fl2=1;

for(j=0; j<len2 && fl2; j++){

if(!sled[ j ] && str1[ i ]==str2[ j ]){

sled[ j ]=1;

fl2=0;

}

}

if(fl2)fl1=0;

}

return fl1;

}


Динамические объекты

Для этих целей в библиотеки языка Cвключены функции malloc, calloc и free. Их прототипы хранятся в файле alloc.h. Выделение памяти. void* malloc(unsigned size); // Размер в байтах

Типичные ошибки, связанные с указателями

Отсутствие инициализации указателя

Пример.

int *x;

.......

*x = 16; // x не задано значение

Двойное указание

y = (int*)malloc(sizeof(int)), z = (int*)malloc(sizeof(int)); *x = 14; *y = 15; *z = 16;

Hе выполнено освобождение выделенной памяти

Забыли вызвать функцию free (См. использование функции substr).

Задание адреса локальной (auto) переменной

См. пример для функции substr, использование локального массива для строки. После выхода из функции память, отведенная под массив, была бы освобождена и указатель p стал бы ссылаться на "мусор".

Не следует использовать явное задание адреса (pt=(double*)0777000)

При переходе на другую операционную систему программа даст ошибку. Этот критерий качества программы называют немобильностью.

Примеры использования указателей. Структуры данных

Стек

Стек – это совокупность данных, в которой доступен только последний помещенный в нее элемент – вершина стека. Если удалить элемент из вершины, становится доступным предыдущий и т.д.

Состояние Операция Содержимое
Нет (пусто)
Поместить в стек элемент 1
Поместить в стек элемент 2 элемент1
Извлечь из стека элемент 1
Извлечь из стека (пусто)

 


Пример. Работа со стеком.

typedef <скалярный_тип> TypeEl; // Описание делает фрагмент независимым

//от типа обрабатываемых данных

typedef struct stack{ // Элемент стека – рекурсивная структура

TypeEl zap; // Хранимые данные

struct stack *p;// Ссылка на предыдущий элемент

} Stack; // Это были описания, вводящие 2 новых типа

/* Определения */

typeEl sod; // Содержание хранимых данных элемента

Stack *TekPtr = NULL, // Текущий элемент – пока никуда не указывает

*PrPtr = NULL;// Предыдущий элемент – также не задан

........................................

/* Поместить в стек */

TekPtr = (Stack*)malloc(sizeof(Stack));// Выделяем память под элемент стека

TekPtr -> zap = sod; // Задаем значения элемента

TekPtr -> p = PrPtr; // 1 элемент стека не имеет предыдущего

PrPtr = TekPtr; // Запоминаем адрес элемента стека

........................................

/* Извлечь из стека */

if(TekPtr == NULL){ /* Стек пуст */ // Попытка извлечь из "пустого" стека

/* Обработка ошибки */ // Ошибка! Обрабатываем

}else{ //Извлекаем данные. Запоминаем адрес предыдущего. Освобождаем память

sod = TekPtr->zap; PrPtr = TekPtr -> p; free(TekPtr); TekPtr = PrPtr;

} // В вершине стека предыдущий элемент

Пример. Дан массив {a[ i ]}, i=1...n. Перестроить его в следующем порядке: сначала все a[ i ]<0 в порядке следования, затем все a[ i ]>=0 в обратном порядке.

typedef float type_el; // Настройка типа

typedef struct stack{ // Определение типа Stack

type_el zap; // Хранимые данные

struct stack *p;// Ссылка на предыдущий элемент. Использование метки

} Stack; // структуры. Нельзя ссылаться на определяемый тип

void perest(type_el *a, short n){// Параметр - указатель a; аргумент - массив

int i,k;

Stack* tek_ptr, // Указатель на текущий элемент стека

*pr_ptr=NULL;// Указатель на предыдущий элемент. Пока его нет

for(k=i=0; i<n; i++){ // 1-й проход по массиву

if(a[ i ]<0){ // Заполнение a[ I ]<0

a[k++]=a[ i ];

}else{ // a[ I ]>=0 помещаются в стек

tek_ptr=(Stack*)malloc(sizeof(Stack));// Выделение памяти

tek_ptr->zap=a[ i ]; tek_ptr->p=pr_ptr; pr_ptr=tek_ptr;// Заполнение

}

}

for(i=k; i<n; i++){ // 2 проход. Извлечение из стека и помещение в массив a

a[ i ]=tek_ptr->zap; pr_ptr=tek_ptr->p; free(tek_ptr); tek_ptr=pr_ptr;

}

}/* End perest */

Однонаправленный список

    Пример. Сортировка массива методом вставки в список. typedef struct zap{ // Строение элемента списка struct {...} dan; // Хранимая информация

Ссылки и многомерные массивы

Для решения одних и тех же задач можно использовать многомерные массивы и массивы указателей. Для простоты сравнения возьмем двумерный массив и одномерный массив указателей. Пусть имеем следующие определения:

short a[10][10];

short *b[10];

и пусть оба массива используются аналогичным образом, т.е. a[5][5] и b[5][5] допустимые обращения к одному и тому же целому значению. Тогда под массив a будет выделена память размером в 100 целых значений (200 байтов), а под массив b – размером в 10 указателей типа short. Если каждая ссылка массива b указывает на массив из 10 целых, то потребная память для решения составит: 100 целых + 10 указателей на short. Кроме того, необходимо будет динамически выделять память под массив. Однако, не требуется вычислять адрес элемента двумерного массива, а можно обратиться прямо по ссылке.

Второе преимущество: каждый элемент массива ссылок может указывать на на массив, количество элементов которого может быть произвольным, т.е. с его помощью можно реализовать так называемые непрямоугольные массивы, содержащие разное число элементов в младших измерениях. Обычно это используют при работе с массивами строк (string). См. пример "Инициализация массива ссылок".

Пример. Вывод сообщений в окна.

#include <conio.h>

#define Screen BLACK

void message(short nom, // Номер сообщения

short reg){ // Режим: 1-вывод сообщения, 0-очистить окно

static struct mes{ // Описание сообщения

short beg_x, // Начальная позиция окна по x

beg_y, // Начальная позиция окна по y

end_x, // Конечная позиция окна по x

end_y, // Конечная позиция окна по y

regim; // Режим вывода текста: 'r' – с разрядкой, 'p' - плотный

char *text; // Текст сообщения

} def[ ]={ // Инициализация списка сообщений

28, 2, 54, 4, 'r', "ВВОД ДАННЫХ",

19, 12, 61, 14, 'p', "Имя файла входных данных",

.

.

.

19, 12, 61, 14, 'r', "ВВОД ДАННЫХ ЗАКОНЧЕН"

};

struct mes *p;// Указатель на элемент списка

p = &def[nom-1];

if(reg){ // Вывод сообщения в окно

init_window(p->beg_x, p->beg_y, p->end_x, p->end_y,

BLACK, LIGHTGRAY, 1);

out_text(2, 2, 200, p->regim, p->text);

}else{ /* Очистка окна */

clear_window(p->beg_x, p->beg_y, p->end_x, p->end_y, Screen);

}

} /* End message */

Рекурсивные процедуры

Пример. Вычислить n!=n*(n-1)!. short factorial(shortn){ shortfact;

Рекурсивное решение

void hanoi(short a, // № начальной площадки

short b, // № конечной площадки

short n){ // Число дисков

if(n == 1){ // Конец рекурсии

printf(" %2d %2d\n", a, b);

return;

}

hanoi(a, 6-a-b, n-1);

printf(" %2d %2d\n", a, b);

hanoi(6-a-b, b, n-1);

} // End hanoi

При каждом рекурсивном вызове процедуры hanoi транслятор помещает значения аргументов a, b, n в так называемый стек вызова, т.е. программисту не надо вручную записывать операции помещения в стек и извлечения из стека.

В нерекурсивном решении возможны 2 варианта реализации стека: в виде массива и в виде списка.

Нерекурсивное решение. Стек в виде массива

void hanoi(short a, // Исходная площадка short b, // Площадка - цель short n){ // Число дисков

Нерекурсивное решение. Стек в виде списка

- элемент стека – произвольная структура; - операции над стеком позволяют организовать в программе произвольное число… Файл hanoi.c. Главная процедура и процедура решения "ханойской башни".

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Что означают операторы * и & при работе с указателями?

2. Что означает запись *(p + i), где p – указатель?

3. Есть ли понятие указатель в языке Basic?

4. Различается ли запись литералов типа string в языках Basicи C?

5. Укажите средство для сравнения строк в языке C.

6. Что делает функция gets?

7. Укажите средства для сцепления строк в языках C и Basic.

8. Для чего служит функция free?

9. Дайте определение рекурсивной процедуры.

10. С помощью какой структуры данных реализуется рекурсия?

Контрольные вопросы

1. Можно ли менять начальный адрес массива во время выполнения программы?

2. Эквивалентны ли записи a[ i ] и *(a+i), если a – имя массива?

3. В каком из изучаемых языков отсутствуют переменные предопределенного типа string?

4. Укажите средство для сравнения строк в языке Basic.

5. Можно ли задать значение одной строки другой в языке C оператором присваивания?

6. Чем отличаются результаты выполнения функций lsetи rset?

7. Чем отличаются функции malloc и calloc?

8. Как освобождается память, выделенная в "куче"?

9. Что такое стек?

10. Укажите способ "потери" выделенной в "куче" памяти.

 

РАБОТА С ЭКРАHОМ

Различают текстовый и графический режимы(mode). В текстовом режиме экран делится на 25 строк и 80 позиций или 43 строки и 80… В графическом режиме экран делится на элементы разложения(пиксели). Каждый пиксель выглядит точкой на экране. Число…

Текстовый режим(textmode)

BW40 0 черно-белый, 40 позиций в строке; C40 1 16 цветов, 40 позиций в строке; BW80 2 черно-белый, 80 позиций в строке;

Ввод

int cscanf(...); Аналогично функции scanf.

int getch( ); Чтение символа с клавиатуры без отображения на экран.

int getche( ); То же с отображением с отображением символа на экране.

char* cgets(char*); Аналогично функции gets.

Вывод

int cprintf(...); Аналогично функции printf.

int putch(int); Аналогично функцииputchar.

int cputs(char*); Аналогично функцииputs.

Манипулирование цветом и курсором

void gotoxy(intx, inty); Установить курсор в окне в точку с координатами (x,y). Если обращение к ней некорректно, то оно игнорируется. Пример. gotoxy(50, 15); Если правый нижний угол окна расположен в ячейке с координатами (35, 25), то действие не…

Управление режимом и окном

void textmode(intmode); Переводит экран в текстовый режим. При запуске программы(по умолчанию) устанавливается текстовый режим, окно составляет весь экран, т.е. эта функция нужна только для возврата из графического режима.


Пример.

textmode(C80);

void window(int left, int top, int right, int bottom); Описывает окно с абсолютными координатами. При некорректных аргументах выполнение игнорируется. Никаких внешних действий на экране не происходит!!!

Управление атрибутом(цветами символа и фона в окне)

void textcolor(int color); Цвет символа кодируется целыми значениями из диапазона [0-15]. При использовании символических констант необходимо… Пример. textcolor(BLINK+RED); // Красный цвет с мерцанием void textbackground(int color); Цвет фона. Диапазон [0-7].

Информация о текстовом режиме

void gettextinfo(struct text_info *ptr);

Структура text_info определена в файле conio.h и имеет вид:

struct text_info{

unsigned char winleft, wintop, winright, winbottom; //Текущее окно

unsigned char attribute, normattr; //Текущий атрибут

unsigned char currmode; //Текстовый режим

unsigned char screenheight, screenwidth; // Размеры экрана

unsigned char curx, cury; // Координаты курсора в окне

}

Пример

Формирование окон сообщений, подсказок, полей ввода.

Набор функций:

- message - вывод сообщений,

- status - вывод подсказок,

- diagnos - вывод диагностических сообщений,

- vvod - формирование полей ввода,

- out_text - вывод строки в окно,

- init_window - инициализировать окно,

- clear_window - очистить окно,

- ramka - нарисовать рамку окна.

 

/*****************************/

/* MESSAGE */

/* Вывести сообщение */

/*****************************/

#include <conio.h>

#include <dos.h>

#define EKRAN BLACK

#define LAG 3 // Задержка(сек)

void message(int nom, // N сообщения

int reg){ // режим: FULL=1-вывод, CLEAR=0-очистить окно

static struct mes{

int beg_x, // Коорди-

beg_y, // наты

end_x, // ок-

end_y, // на

char regim; // r-разрядка, p-плотный

char *text; // Текст сообщения

}def[ ]={ // Описание сообщений

28,2,52,4,'r',"ВВОД ДАННЫХ",

19,12,61,14,'p',"Имя файла входных данных",

.........................................

19,12,61,14,'r',"ВВОД ДАННЫХ ЗАКОНЧЕН"

};

struct mes *p; // Указатель на элемент описания

p=&def[nom-1];

if(reg){

init_window(p->beg_x, p->beg_y, p->end_x, p->end_y, BLACK,

LIGHTGRAY, 1);

out_text(2, 2, 200, p->regim, p->text);

}else{

clear_window(p->beg_x, p->beg_y, p->end_x, p->end_y, EKRAN);

}

} // End message

Пример(продолжение)

Приведенные ниже функции включены в файл window.c.

/* Вывод строки в окно */

void out_text(int x, // Начальная позиция курсора по X

int y, // Начальная позиция курсора по Y

int kol, // Число выводимых символов

int reg, // Режим: r-разрядка, p-плотный

char *text){ // Текст сообщения

int i;

gotoxy(x, y);

for(i=0; i<kol && *(text+i) != '\0'; i++){

if(reg=='r')putch(' ');

if(*(text+i)=='\n'){

y++;

gotoxy(x, y);

}else{

putch(*(text+i));

}

}

} // End out_text

 

Замечание. Символы второй кодовой страницы надо задавать в виде:

\<код символа в 8-й системе счисления>. См. ниже пример.

 

/* Рисование рамки */

void ramka(int type, // 0-одинарная, 1-двойная

intwidth, // ширина(в позициях)

int height){ // высота(в строках)

static unsigned char *cont[ ]={// коды символов псевдографики в 8-й системе

"\332\300\331\277\263\304", // одинарная рамка

"\311\310\274\273\272\315" // двойная рамка

};

int i;

gotoxy(1, 1);

putch(cont[type][0]);

for(i=2; i<width; i++)putch(cont[type][5]);

putch(cont[type][3]);

for(i=2; i<height; i++){

gotoxy(1, i);

putch(cont[type][4]);

gotoxy(width, i);

putch(cont[type][4]);

}

gotoxy(1, height);

putch(cont[type][1]);

for(i=2; i<width; i++)putch(cont[type][5]);

putch(cont[type][2]);

} /* End ramka */

Графический режим

Графический режим характеризуется установленным драйвером экрана и видеорежимом(mode). Поскольку ОС MS DOS достаточно "древняя", то наиболее высокая по разрешению экрана и числу используемых цветов установка соответствует драйверу VGA с разрешением 640*480 пикселей и 16 цветами. Драйверы представляют собой файлы с расширением bgi(Borland Graphics Interface). Для описанного выше видеорежима подходит драйвер egavga.bgi. Возможно существуют для работы в MS DOS и драйверы SVGAс лучшим качеством, однако для решения наших задач указанного видеорежима достаточно. Чтобы работать в данном режиме, необходимо в пункте Options\Linker\Libraries среды разработки установить флажок Graphics Library. Перечень функций, входящих в эту библиотеку, и пояснения к ним можно найти в пункте Help\ContentsàFunctionsàGraphics routines.

Установка и закрытие

void initgraph(int* driver, int* mode, char* path); Она инициализирует графический режим. Символические константы для параметров… Пример.

Форматирование

Цвета

int getcolor(void); Возвращает текущий установленный цвет рисования.

void setcolor(int color); Устанавливает текущий цвет рисования.

Замечание. Для стандартного видеорежима VGA набор(палитра) содержит 16 цветов. К сожалению, в отличие от текстового режима неясно соответствие номера(0 – 15) цвету. Надо проверить. Вероятно, можно использовать символические константы для текстового режима.

int getbkcolor(void); Возвращает текущий установленный цвет фона.

void setbkcolor(int color); Устанавливает текущий цвет фона.

Битовые образы(pattern)

Для заполнения создаваемых фигур на экране используются образы размером 8*8 пикселей, заполненные некоторым образом. Стандартно доступны 12 различных стилей заполнения, на каждый из которых определена символическая константа.

0 EMPTY_FILL Цвет фона

1 SOLID_FILL Сплошное заполнение

2 LINE_FILL -- -- --

3 LTSLASH_FILL / / /

4 SLASH_FILL / / / (жирные)

5 BKSLASH_FILL \ \ \ (жирные)

6 LTBKSLASH_FILL \ \ \

7 HATCH_FILL Тонкая штриховка

8 XHATCH_FILL Толстая штриховка

9 INTERLEAVE_FILL Линии слоями

10 WIDE_DOT_FILL Широко расположенные точки

11 CLOSE_DOT_FILL Близко расположенные точки

12 USER_FILL Определенный пользователем образ заполнения

void setfillstyle(int pattern, int color); Устанавливает текущий образ и цвет рисования. Этой функцией нельзя устанавливать образ, заданный пользователем (USER_FILL).

void getfillsettings(struct fillsettingstype* fillinfo); Дает информацию о текущем битовом образе заполнения. Информация помещается в структуру типа, которая имеет вид:

structfillsettingstype{

int pattern; // Текущий образ заполнения

int color; // Текущий цвет заполнения

}

void setfillpattern(char* upattern, int color); Устанавливает определенный пользователем образ и цвет заполнения.

void getfillpattern(char* pattern); Запоминает определенный пользователем образ в памяти. Для запоминания используется массив char pattern[8], каждый байт которого хранит информацию о 8 пикселях. Если какой-либо бит имеет значение 1, то соответствующий пиксель рисуется.

Пример. Образ типа "шахматная доска".

char CheckerBoard[8]={

0xAA, // 10101010

ox55, // 01010101

0xAA, // 10101010

0x55 // 01010101

0xAA, // 10101010

0x55, // 01010101

0xAA, // 10101010

0x55 // 01010101

};

Линии

void setlinestyle(int linestyle, unsigned upattern, int thickness); Устанавливает стиль линии для рисования.

void getfillsettings(struct linesettingstype* lineinfo); Дает информацию о текущих стиле, образе и толщине линии.


Структура linesettingstype имеет вид:

struct linesettingstype{

int linestyle;

unsigned upattern;

int thickness;

}

Стили линии задаются символическими константами:

0 SOLID_LINE Сплошная линия

1 DOTTED_LINE Пунктирная линия

2 CENTERED_LINE Линия по центру

3 DASHED_LINE Штриховая линия

4 USER_BIT_LINE Линия, заданная образом пользователя

upattern представляет собой 16-битовый образ, который применяется только при стиле USER_BIT_LINE. Так например, стиль SOLID_LINE эквивалентен значению 0xFFFF, а штриховая линия может задаваться значениями:

0x3333 ..xx..xx..xx..xx Короткие штрихи

0x0F0F ….xxxx….xxxx Длинные строки

0x3F3F ..xxxxxx..xxxxxx Еще более длинные штрихи

Толщина линии задается символическими константами:

1 NORM_WIDTH Толщина 1 пиксель

3 THICK_WIDTH Толщина 3 пикселя

Текстовые фонты

Текстовым фонтом называют файл, с помощью которого на устройстве вывода(экран, принтер) отображаются символы. Различают точечные(bit-mapped, символы отображаются точечным образом – пикселями) и штриховые(stroked, символы строятся из отрезков прямых линий) фонты. В графическую систему встроен один точечный(8*8 пикселей) фонт, употребляемый по умолчанию (DEFAULT_FONT), и несколько штриховых, которые загружаются с диска из файлов с расширением .chr. Эти файлы располагаются в директории BGI транслятора. Для обозначения допустимых фонтов в файле graphics.h определены символические константы:

0 DEFAULT_FONT // 8*8 точечный фонт

1 TRIPLEX_FONT // Штриховые фонты

SMALL_FONT

SANS_SERIF_FONT

GOTHIC_FONT

SCRIPT_FONT

SIMPLEX_FONT

TRIPLEX_SCR_FONT

COMPLEX_FONT

EUROPEAN_FONT

BOLD_FONT

void settextstyle(int font, int direction, int charsize); Устанавливает фонт, направление вывода текста(горизонтальное, символическая константа –… Пример. settextstyle(EUROPEAN_FONT, VERT_DIR, 3);

Восстановление установок по умолчанию

void graphdefaults(void); Возвращает все установки, которые имели место при выполнении функции initgraph, текущее окно – во весь экран, текущую позицию курсора – в точку с координатами (0, 0).

Размещение на экране

Окна

void setviewport(int left, int top, int right, int bottom, int clip); Устанавливает границы текущего окна. Курсор перемещается в позицию (0, 0) окна. Параметр clip определяет, ограничен ли вывод пределами окна или нет. Если clip не равен 0, то вывод выполняется только в пределах окна.

void getviewsettings(struct viewporttype* viewport); Дает информацию о текущем окне.

Структура viewporttype имеет вид:

struct viewporttype{

int left;

int top;

int right;

int bottom;

int clip;

}

void clearviewport(void); Очищает текущее окно(фактически закрашивает его установленным цветом фона) и перемещает курсор в позицию (0, 0) данного окна.

void cleardevice(void); Очищает весь экран цветом фона и перемещает курсор в начало экрана(абсолютные координаты (0, 0)).

void getimage(int left, int top, int right, int bottom, void* bitmap); Сохраняет битовое изображение прямоугольной области экрана в отведенной памяти. Использует абсолютные координаты.

void putimage(int left, int top, void* bitmap, int op); Извлекает сохраненный функцией getimage битовый образ и располагает его в области с координатами левого верхнего угла (left, top). Параметр op определяет, как взаимодействуют пиксели "старого" и "нового" экранов. Возможные значения определяются символическими константами:

0 COPY_PUT "Старый" экран полностью заменяется "новым".

1 XOR_PUT Стираются пиксели, совпадающие в обоих экранах.

2 OR_PUT Сохраняются рисунки обоих экранов

3 AND_PUT Сохраняются только пиксели, совпадающие в обоих экранах.

4 NOT_PUT "Старый" экран заменяется инверсным изображением "нового".

Эти функции позволяют реализовывать так называемые всплывающие окна, сохраняя область экрана, закрываемую ими.

Поскольку в памяти, кроме битового изображения, запоминается информация о высоте и ширине области, то для определения необходимого размера памяти для хранения используется специальная функция:

unsigned imagesize(int left, int top, int right, int bottom);

Для выделения памяти под сохраняемую область рекомендуется импользовать функцию:

void* malloc(unsigned size); Прототип в alloc.h.

Координаты курсора и перемещения

int getmaxx(void); Возвращает максимальную координату x для установленного драйвера и видеорежима. Для принятого видеоадаптера VGA она равна 639.

int getmaxy(void); То же для координаты y. Для VGAона равна 479.

int getx(void); Возвращает относительную(зависящую от окна) координату x курсора.

int gety(void); То же для координаты y.

void moverel(int dx, int dy); Перемещает курсор на dx пикселей по горизонтали и dy пикселей по вертикали относительно текущего положения.

void moveto(int x, int y); Перемещает курсор в точку (x, y) в относительных координатах окна.

Вывод на экран

Текст

void outtext(char* textstring); Выводит текстовую строку с текущей позиции курсора. Используются установленные: фонт, направление, размер символа и выравнивание. Если направление горизонтальное и выравнивание LEFT_TEXT, то позиция курсора перемещается на расстояние, равное длине строки. При других параметрах позиция курсора не меняется.

void outtextxy(int x, int y, char* textstring); Выводит строку с относительных координат окна x и y.

Курсор

void _setcursortype(int cur_t); Управляет видом курсора. Возможные значения параметра cur_t:

_NOCURSOR Выключает курсор

_SOLIDCURSOR Сплошной прямоугольный курсор

_NORMALCURSOR Подчеркивание

Прямоугольники

void rectangle(int left, int top, int right, int bottom); Рисует прямоугольник с заданным битовым образом и цветом заполнения. Границы области не выделяются.

void bar3d(int left, int top, int right, int bottom, int depth, int topflag); Рисует

3-мерный прямоугольник с заданным битовым образом и цветом заполнения. Границы области выделяются установленным стилем и цветом линии. Нормальная глубина(depth) составляет 25% от ширины прямоугольника. Если topflag не равен 0, то верхняя грань показывается, если равен 0, то нет. Это позволяет поместить несколько прямоугольников один на другой.

Пример.

bar3d(left, top, right, bottom, (right-left)/4, 1);

Линии

void line(int x1, int y1, int x2, int y2); Рисует линию между 2-мя заданными точками. Положение курсора не меняется.

void linerel(int dx, int dy); Рисует линию от текущего положения курсора до точки, лежащей на относительном расстоянии (dx, dy). Курсор перемещается в конечную точку.

void lineto(int x, int y); Рисует линию от текущего положения курсора до точки с координатами (x, y). Курсор перемещается в конечную точку.

Эллипсы

- x, y – координаты центра эллипса в пикселях, - stangle, endangle – начальный и конечный углы сектора в градусах(0 – 360), … - xradius, yradius – радиусы по x и y соответственно.

Круги

void arc(int x, int y, int stangle, int endangle, int radius); Рисует незаполненный круговой сектор.

void pieslice(int x, int y, int stangle, int endangle, int radius); Рисует заполненный круговой сектор.

void circle(int x, int y, int radius); Рисует незаполненный круг.

Также полезной может оказаться функция:

void arccoords(struct arccoordstype* arccoords); Получить информацию о параметрах последнего вызова функции arc. Информация выдается структурой вида:

struct arccoordstype{

int x, y; // Коодинаты центра

int xstart, ystart; // Начальная точка дуги

int xend, yend; // Конечная точка

}

Многоугольники

void drawpoly(int numpoints, int* polypoints); Рисует, в общем случае, ломаную линию установленным стилем и цветом линии. Здесь:

- numpoints – число вершин,

- polypoints – координаты вершин(2 * numpoints значений) в порядке (x1, y1), (x2, y2), ….

Для того, чтобы нарисовать замкнутый многоугольник, координаты 1-й и последней вершин должны совпадать.

void fillpoly(int numpoints, int* polypoints); Рисует границы ломаной линии (многогоугольника) установленным стилем и цветом линии, затем заполняет получившуюся область установленным битовым образом и цветом.

Пиксели

unsigned getpixel(int x, int y); Возвращает цвет пикселя с заданными координатами.

void putpixel(int x, int y, int color); Рисует пиксель цветом color в точке (x, y).

Дополнительные функции

void sound(unsigned frequency); Включить звук(частота в гц).

void nosound(void); Выключить звук.

void delay(unsignedtime); Задержка выполнения в миллисек.

void sleep(unsigned lag); Задержка выполнения в сек.

Прототипы в файле dos.h

Данные функции не относятся к библиотеке graphics. Они приводятся в этом разделе, чтобы программист имел возможность включить звук в проектирование интерфейса.

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Как перейти в графический режим?

2. Укажите размер экрана и начальные координаты курсора в текстовом и графическом режимах соответственно.

Контрольные вопросы

1. Что представляют собой файлы с расширением bgi?

2. Почему в графическом режиме используются битовые образы размером 8*8 пикселей?

УПРАВЛЕНИЕ ПРОГРАММОЙ С ПОМОЩЬЮ КЛАВИАТУРЫ

Обычно это реализуется с помощью ввода с клавиатуры без отображения на экране каких-либо символов. Более того, чаще всего используют клавиши, не… Клавиши, не имеющие графического изображения: ß à PgUp PgDn Del End Home и т.п.

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Каков состав расширенного кода клавиатуры?

2. Как выделить из прочитанного расширенного кода содержимое младшего байта(ASCII-символ)?

Контрольные вопросы

1. В чем отличие процесса чтения расширенного кода функциями bioskey и getch?

2. Какую инструкцию удобно использовать для управления программой с помощью клавиатуры?

 

ЗАДАЧИ

Элементарные конструкции

X Begin a[3] 3D_Studuo Step1 sin(x) CTEK a15x Str.X a1 конец _XX x_x 2. Какие из записей ниже являются целыми литералами: 0 +006 -45 3. .55 0712 &034 0xabc 0X12a5 &habc &H12A5

Простые циклы

2x3/(x2+1), если |x|<3 y = 1.5|tg p/x|, если |x|>=3.

Вложенные циклы

2. Дана матрица {aij}, i =1...10, j = 1...10. Найти индексы максимального элемента. Если их несколько, взять первый из них. 3. Дана матрица {aij}, i =1...10, j = 1...10. Определить, является ли она… 4. Дано натуральное число n. Вычислить:

Процедуры

1. Даны 2 натуральных числа n и m(m<=n). Определить сумму m последних цифр числа n. 2. Известны данные о среднесуточной температуре за каждый день месяца.… - количество дней, когда температура была ниже 00C;

Работа со строками

2. Дана строка символов. Сформировать из нее строку, содержащую только символы, входящие в другую заданную строку. 3. Дана строка символов. Подсчитать количество входящих в нее символов:… 4. Дано предложение, представляющее собой последовательность слов, разделенных произвольным числом пробелов.…

Разное

1. Дан массив: {xi}, i = 1...25, состоящий из натуральных чисел. Преобразовать массив так, чтобы у каждого исходного числа поменялись местами первая и последняя цифры.

2. Первоклассники на уроке физкультуры не смогли построиться по росту. Найти количество учеников, которые оказались больше следующих в строю соучеников.

3. Дан массив: {xi}, i = 1...25. Найти максимальную длину "пилообразной (зубьями вверх)" подпоследовательности идущих подряд чисел, т.е. ее элементы должны удовлетворять условию:

xk<xk+1>xk+2<xk+3>…

4. Чтобы открыть секретный сейф, агент №007 должен в возрастающем порядке набирать все трехзначные числа, у которых нет одинаковых цифр. Составить программу, которая бы печатала на экране его карманного компьютера такие числа, а также определить, сколько времени понадобится, чтобы открыть сейф, если на набор одного числа он тратит t секунд.

5. Результаты футбольного чемпионата задана в виде целой матрицы размером NxN, диагональные элементы которой равны 0, остальные равны: 3 – победа, 1 – ничья, 0 – поражение. Определить победителя. В случае равенства очков преимущество получает команда, имеющая большее число побед. Если и по этому показателю не выявлен победитель, выдать сообщение о переигровке.

6. Даны 2 четырехзначных натуральных числа. Определить число совпадений цифр по месту и по значению. Совпадение по месту означает, что в одинаковой позиции каждого числа находятся одинаковые цифры, совпадение по значению означает, что одинаковые цифры в числах находятся на различных позициях.

7. Дана дата в виде: № дня в месяце, № месяца, год. Проверить ее корректность.

8. Дан порядковый № дня в году и значение года. Определить дату в виде: № дня в месяце, № месяца, год.

9. Дана дата в виде, описанном в предыдущей задаче. Найти порядковый № дня в году.

10. Определить, какой день недели будет 1 сентября текущего года.

11. Определить по заданной дате № дня недели. В расчете исходить из гипотезы, что1/1/1 был понедельник.

12. Найти разницу в днях между 2 заданными датами.

13. Даны координаты 50 точек на плоскости. Определить № той из них, для которой круг радиуса R содержит максимальное количество точек множества.

14. Даны результаты n(n>4) бегунов на 100м, измеренные в сотых долях секунды. Отобрать 4-х лучших для участия в эстафете 4х100м.

15. На плоскости координатами своих вершин задан выпуклый n-угольник. Вершины упорядочены в порядке обхода по часовой стрелке. Найти площадь n-угольника. Площадь треугольника равна Öp(p-a)(p-b)(p-c); p = (a+b+c)/2, где a, b, c – стороны треугольника.

16. Дана матрица {aij}, i =1...n, j = 1...n. Сформировать матрицу {bij}, i = 1...n, j = 1...n, где bij есть минимальный элемент в треугольнике, образованном главной диагональю, строкой и столбцом, содержащими элемент aij.

17. Дан массив: {xi}, i = 1...n. Определить количество "внутренних" точек массива. Элемент массива называют "внутренней" точкой, если соседние элементы имеют совпадающие с ним знаки.

18. Определить сумму всех чисел Фибоначчи, не превышающих 1000. Числа Фибоначчи определяются по формуле: a0 = a1 = 1; an = an-1 + an-2. Вспомогательный массив не использовать.

19. Дана матрица {aij}, i =1...n, j = 1...n. Каждую строку матрицы циклически сдвинуть вправо на число позиций, равное № строки.

ПРИЛОЖЕНИЯ

    Основное окно интерфейса с пользователем имеет вид: Назначение основных элементов окна очевидны, за исключением строки статуса.… П1.1. Меню File (Файл)

П1.3. Разное

2. Запуск на компиляцию – "горячие" клавиши Alt+F9. В случае нарушений правил языка сообщения об ошибках и предупреждения появляются в… 3. Запуск на компоновку – клавиша F9. 4. Запуск на выполнение – клавиши Ctrl+F9. Если при компиляции ошибок не обнаружено, происходит автоматический переход…

П1.4. Редактирование текста

Undo (Отмена) – отменяет действие последней команды над текущей редактируемой строкой. Клавиши – Alt+BkSp. Redo – отмена последней команды Undo. Клавиши – Shift+Alt+BkSp. Cut (Вырезать) – удаляет выделенный текст из окна редактирования в буфер обмена (Clipboard). Клавиши – Shift+Del.

П1.5. Сообщения

Сообщения могут появиться после компиляции, компоновки и во время выполнения программы.

Трансляция

Пример. Compiling EXAMPLES\FLAVII\FLAVII.C: Далее выводятся диагностические сообщения об ошибках, если они есть. Эти сообщения бывают трех типов:

Компоновка (редактирование связей)

Ошибки при компоновке относительно редки, связаны, в основном, с неправильным размещением объектных файлов по папкам и поэтому не рассматриваются.

Ошибки времени выполнения

Происходят из-за неправильного алгоритма решения задачи и нехватки памяти, поэтому их наиболее трудно исправлять. Сообщения о таких нарушениях выводятся в окно User Screen (Экран пользователя). Для их просмотра используются клавиши Alt+F5, вызывающие это окно. Для возврата в окно редактирования надо повторно нажать эти клавиши.

Примеры таких сообщений:

Divide error (Ошибка деления) – попытка разделить целое значение на 0.

Floating point error: Overflow (Ошибка для данных с плавающей точкой: Переполнение) – превышение максимально допустимого значения для таких данных.

П1.6. Отладка

Основным приемом отладки программы является проверка значений интересующих объектов в контрольных точках алгоритма. Для этого необходимо иметь… Для работы отладчика необходимо в пункте Главного меню Options выставить… Основными функциями, предоставляемыми отладчиком пользователю, являются:

Прогон до точки прерывания

Go to cursor (F4) – выполнить программу до места в тексте, помеченного курсором. В скобках здесь и далее указываются "горячие" клавиши.

Того же эффекта можно достичь установкой точек прерывания (об этом ниже).

Пошаговое выполнение программы

Trace into (F7) – нажатие клавиши F7 вызывает выполнение одной инструкции. Сложные инструкции типа цикла или условной рассматриваются как последовательность инструкций, их составляющих. При выполнении инструкции, содержащей вызов процедуры, эта команда переходит в тело данной процедуры и продолжает пошаговое выполнение ее инструкций.

Step over (F8) – команда работает аналогично предыдущей, но при выполнении инструкции, содержащей вызов процедуры, в ее тело не переходит.

Установка точек прерывания

Toggle breakpoint (Ctrl+F8) – установить точку прерывания на строке, где находится курсор. Повторное нажатие этих клавиш в той же строке снимает точку прерывания. При запуске программы на выполнение (клавиши Ctrl+F9) при достижении указанной строки программа остановится. В этот момент можно посмотреть значения отслеживаемых объектов программы или запросить значения таких объектов. Продолжить выполнение программы можно или в пошаговом варианте, или с помощью клавиш Ctrl+F9или F4. Имеется возможность прекратить выполнение программы без продолжения с помощью команды Program reset (Ctrl+F2).

Число установленных точек прерывания в программе неограниченно. В пункте Главного меню Debug\Breakpoints можно получить доступ ко всем точках прерывания в программе. Здесь можно добавлять, удалять или изменять точки прерывания.

Получение значений объектов программы

Inspect (Alt+F4) – вызывает появление окна, в котором можно задать имя объекта программы. После чего в другом окне будет показано его значение (или… Evaluate\modify (Ctrl+F4) – работает подобным же способом, но может вычислять… Также можно задать имена нужных объектов для отслеживания, т.е. показа их значений без запроса в каждой точке…

П1.7. Окна

После завершения программы управление автоматически возвращается в среду пользователя, поэтому, если Вы хотите сразу же видеть результаты,… Пример. printf("Нажмите любую клавишу:");

Управление окнами

Переходы между окнами. Если окно видно на экране, то проще всего щелкнуть мышью по видимой части окна. Если его не видно, но оно уже открывалось в… Закрытие окна. Активное окно может быть закрыто: - щелчком мыши по прямоугольнику в левом верхнем углу рамки окна;

Приложение 2. Среда разработки Visual Basic Express

Edition

П2.1. Запуск среды

Выше стартовой страницы располагается Главное меню и Панель инструментов, нужные пункты котрых будут рассмотрены ниже.    

П2.3. Окна и режимы работы

- разработки (design mode); - выполнения приложения (execution mode); - прерывания (break mode).

П2.4. Главное меню

П2.5. Меню File (Файл) New Project (Ctrl+N) – выбор типа проекта и его создание. Open Project (Ctrl+O) – выбор и открытие существующего проекта.

П2.6. Редактирование текста

Undo (Ctrl+Z) – отменить последние изменения. Redo – возвратить последние изменения, сделанные командой Undo. Cut (Ctrl+X) – переместить выделенный фрагмент текста в буфер.

П2.9. Отладка

Команды отладки находятся в меню Debug.

Точки прерывания

Toggle Breakpoint (F9) – установить точку прерывания; предварительно необходимо расположить курсор на нужной линии кода; самый простой способ установки точки прерывания: щелкнуть напротив выбранной линии кода в области серой полосы в левой части окна Code, которая называется Margin Indicator Bar(индикатор границы); при этом там появляется индикатор точки прерывания, выбранная линия кода выделяется цветом; повторный щелчок в том же месте снимает точку прерывания.

Run To Cursor (Ctrl+F8) – поместить курсор в нужной линии кода и запустить приложение, используя эту команду; при достижении выбранной линии произойдет переход в режим прерывания.

Clear All Breakpoints (Ctrl+Shift+F9) – очистить все точки прерывания.

Достаточно запомнить команду Run To Cursor (Ctrl+F8) и отладку можно выполнять, не обращаясь к этому меню.

Определение значений объектов программы в момент прерывания

Окно Locals. Это окно вызывается в момент прерывания и показывает значения всех объектов процедуры, в которой произошло прерывание. Содержание окна… Окно Immediate. В данном окне можно задавать программный фрагмент, состоящий в… Режим показа значений. Если этот режим включен, то при наведении курсора на имя объекта программы "всплывет"…

Продолжение работы

- командой Start (описывается ниже); выполнение продолжается до ближайшей точки прерывания, если она установлена; - командой Run To Cursor; выполнение продолжается до строки, в которой… - командами пошагового исполнения Step Into (F8) или Step Over (Shift+F8).

Приложение 3. Ответы на вопросы для самопроверки

Перед каждой группой ответов указаны № и заголовок раздела, в конце которого сформулированы вопросы.

Элементы языка

1. Различаются ли прописные и строчные буквы в изучаемых языках? В языке Cотличаются, в языке Basic – нет.

2. Перечислите допустимые имена.

x X X_X A15B 15C a2 KOH A1b MAKC_HOMEP

Допустимые имена: x X X_X A15B KOH A1b MAKC_HOMEP

3. Перечислите знаки разрядки. К ним относят: пробел, табуляцию (клавиша Tab), переход на новую строку (клавиша Enter).

4. Где могут записываться комментарии в тексте программы на языке C? Комментарии в языке C могут записываться в любом месте, где допустим пробел.

5. Чем отличается запись нескольких инструкций в одной строке в языках Cи Basic? В языке C инструкция заканчивается символом ";", а в языке Basicпри записи нескольких инструкций в одной строке они должны разделяться символом ":".

Элементы данных

1. Каковы ориентировочно максимальные целое и вещественные значения? Максимально допустимое целое значение в языке Cсоставляет 232-1 (»4*109), для Basic – 264-1, для данных с плавающей точкой они совпадают и »1.79*10308.

2. В каком языке отсутствует логический тип данных? В языке C.

3. Есть ли отличия в правилах записи строковых литералов в языках C и Basic? Нет.

4. Можно ли в языке C задать произвольную нижнюю границу индекса? Нет.

5. Что такое длина измерения массива? Количество элементов в данном измерении.

6. В каком языке есть ключевое слово для описания структур? В языке C.

Выражения

1. Чему равно выражение: -7\2? На каком языке оно написано? Выражение написано на языке Basic и равно –3.

2. Известно целое значение n. Как определить младшую цифру числа? На языке Cследует записать выражение abs(n % 10), в языке Basicabs(nmod 10).

3. Как следует записать на языке C соотношение a<b<c? a<b && b<c.

4. Как на языке Basic записать условие попадания точки M(x,y) в квадрат с центром в начале координат и стороной a? abs(x)<=a/2 and abs(y)<=a/2.

Основные инструкции

2. Какой новый объект программы позволяет выполнить инструкцию goto? Этот новый объект – метка. 3. Допустим ли выход из тела цикла с помощью инструкции goto? Да. 4. Можно ли реализовать разветвление алгоритма более, чем на 2 ветви? Да, вложенными инструкциями if или инструкцией…

Ввод-вывод

1. Что происходит, когда длина выводимого значения больше величины W? Значение выводится полностью.

2. При каких условиях при выводе значений с плавающей точкой не ставится десятичная точка? Когда значение параметра D равно 0.

3. Перечислите символы – ограничители ввода. Знаки разрядки и любой символ, который не преобразуется данной спецификацией.

4. Чем отличаются правила ввода значений по спецификациям fи e? Ничем.

5. Что возвращают функции printfи scanf? Функция printf возвращает число выведенных символов, функция scanf – число введенных скалярных значений.

Процедуры

1. Что такое блок? Блок – это составная инструкция + описания, расположенные в начале блока.

2. Есть ли в языке Basic главная процедура? Да, есть.

3. В каком языке не определено понятие подпрограммы? В языке C.

4. Что такое указатель на функцию? Это специальный тип указателя, задающий адрес определения некоторой функции.

5. Чем являются выходные скалярные параметры в языке C? Выходные скалярные параметры должны быть указателями.

6. Что передается в вызываемую процедуру, если аргумент – имя массива? В этом случае передается адрес начального элемента массива.

Препроцессор

1. С какой позиции записываются директивы препроцессора? С первой.

2. Какова область действия директивы #define? От текста директивы до другой директивы, отменяющей ее действие. Если такой директивы нет, то до конца файла, где она записана.

3. Можно ли обойтись без директивы #include в языке C? Можно, если в тексте программы не используется ни одна библиотечная функция.

Стиль программирования

2. Какую роль играют отступы при размещении вложенных инструкций? Отступы подчеркивают и выявляют структуру программы, показывая уровень вложенности… 3. В чем суть "венгерской" нотации имен? Имя содержит информацию о… 4. На что, вероятно, указывает предупреждение при трансляции? На место вероятного нарушения правил языка или…

Данные. Дополнение

2. Есть ли предопределенный тип для дат/времени в языке C? Нет. 3. Какое средство языка C напоминает тип variant языка Basic? Объединение или… 4. Для чего нужен тип void? Для описания процедур, не возвращающих значений или не имеющих параметров, а также для…

Операторы. Дополнение

1. Чему равно значение выражения sizeof(<имя_типа>)? Длине (числу байтов) элемента данного типа.

2. Какой тип должен иметь левый операнд оператора ->? Указатель.

3. Дано: i=4; y=i++; x=++i. Чему равны значения i, y, x ? i=6; y=4; x=6.

4. Какой тип имеет результат выполнения унарного оператора "&"? Результат должен быть указателем на тип объекта программы, адрес которого вычисляется.

5. Что означают операторы "=" и "==" в языке C? Чей приоритет выше? "=" – это оператор присваивания, "==" – это оператор равенства, приоритет последнего выше.

6. В чем отличие операторов унарного и бинарного оператора "&"? Унарный "&" – это нахождение адреса объекта, бинарный "&" – это поразрядный оператор "И".

7. Какой оператор имеет 3 операнда? 3 операнда имеет условное выражение "?".

Передача данных потоком

1. Какие символы являются ограничителями ввода для спецификации s функции scanf? Пробел и перевод строки (клавиша Enter).

2. Удаляются ли символы-ограничители из входного потока функцией gets? Да, заменяются на конечный нулевой символ.

3. Какой символ помещается в конец выводимой строки функцией puts? Перевод строки.

4. Можно ли ввести строку, содержащую пробелы, функцией scanf? Нет, пробел является ограничителем ввода.

Файлы

1. В чем отличие последовательных файлов и файлов с произвольным доступом? В последовательных файлах для того, чтобы получить доступ к нужному фрагменту, необходимо прочесть все предыдущие. В файлах с произвольным доступом к нужному фрагменту можно обратиться непосредственно, указав уникальный ключ.

2. Что представляют файлы с расширением по умолчанию bak? Это предыдущая версия файла с расширением c(cpp).

3. Что такое дескриптор файла? Это идентификатор канала передачи данных.

4. Что означает запись FILE* в языке C? Это указатель на тип FILE, который представляет собой структуру, определенную в файле stdio.h.

5. Что делает инструкция close без параметров? Закрывает все открытые файлы.

6. Укажите тип первого параметра функции MsgBox. Тип string.

Структура программы

1. Могут ли исполняемые инструкции записываться вне тела процедур? Нет, не могут.

2. Может ли в одной области видимости исполняемая инструкция предшествовать декларации? Нет, не может.

3. Отличается ли время жизни для объектов staticи extern? Нет, не отличается.

4. Объявление объекта с ключевым словом extern это определение или описание? Это описание.

5. Что произойдет, если число инициаторов больше числа элементов массива? Произойдет ошибка при трансляции.

Указатели, массивы, строки

2. Что означает запись *(p + i), где p – указатель? Извлечь значение по адресу, смещенного от адреса p, на i элементов типа указателя в сторону… 3. Есть ли понятие указатель в языке Basic? Нет. 4. Укажите средство для сравнения строк в языке C. Функция strcmp.

Работа с экраном

1. Как перейти в графический режим? Необходимо вызвать функцию initgraph.

2. Укажите размер экрана и начальные координаты курсора в текстовом и графическом режимах соответственно. При установках по умолчанию размер экрана в текстовом режиме составляет 25 строк по вертикали и 80 позиций по горизонтали, начальные координаты курсора – (1,1); в графическом режиме – размер определяется установленным драйвером экрана, для драйвера VGA – это 480 пикселей по вертикали и 640 пикселей по горизонтали, начальные координаты курсора – (0,0).

Управление программой с помощью клавиатуры

1. Каков состав расширенного кода клавиатуры? Расширенный код клавиатуры состоит из 2 байтов, младший из которых содержит ASCIIсимвол или 0 для управляющих клавиш, старший – сканкод.

2. Как выделить из прочитанного расширенного кода содержимое младшего байта(ASCII-символ)? Необходимо записать выражение вида:

<расширенный код> & 0x00ff.

 

Приложение 4. Темы для курсовой работы

Решение следует оформлять в виде отдельной процедуры. Главная процедура должна содержать ввод исходных данных, вызов процедуры и печать результата.

Для оформления работы предусмотреть эхо-печать входных данных и результатов в файл для последующей распечатки на принтере.

Отчет по курсовой работе должен содержать:

- титульный лист;

- условие задачи;

- исходные данные и результат;

- инструкцию пользователя, в которой указываются ограничения программы и порядок ввода исходных данных.

 

1. Решение системы линейных алгебраических уравнений: метод Зейделя.

2. Решение системы линейных алгебраических уравнений: метод Гаусса.

3. Решение системы линейных алгебраических уравнений: метод покоординатного спуска.


4. Решить методом итераций с точностью e систему n линейных алгебраических уравнений. Условие прекращения вычислений:

, I=1, 2, …, n.

В качестве примера решить систему:

7.9x1+5.6x2+5.7x3-7.2x4=6.68

8.5x1-4.8x2+0.5x3+3.5x4=9.95

4.3x1+4.2x2-3.2x3+9.3x4=8.6

3.2x1-1.4x2-8.9x3+8.3x4=1

Точность e = 10-5.

5. Найти экстремум функции нескольких переменных методом покоординатного спуска.

6. Найти экстремум функции нескольких переменных методом деформируемого многогранника.

7. Найти корни полинома методом Лина.

8. Упорядочить массив методом пирамидальной сортировки.

9. Упорядочить массив методом двухпутевого слияния.

10. Упорядочить массив методом Шелла.

11. Упорядочить массив методом бинарных вставок.

12. Написать генератор перестановок.

13. Определить, является ли натуральное число n простым.

14. Определить седловую точку матрицы.

15. Определить, является ли целая матрица Bклеткой целой матрицы A.

16. Определить максимальный размер клетки матрицы A, состоящей только из положительных элементов.

17. Составить "магический" квадрат для нечетного n.

18. Найти максимальное число, входящее в матрицу Aболее одного раза.

19. Найти количество вхождений каждого числа в последовательность целых значений.

20. Определить количество различных чисел в целой матрице.

21. Даны 2 целых последовательности чисел Aи B. Сформировать последовательность C, содержащую все элементы последовательности A без повторений, не входящие в последовательность B.

22. Даны nточек на плоскости. Найти минимальный угол, в который бы всегда попадали минимум 2 точки при произвольном повороте этого угла вокруг начала координат.

23. Даны nточек на плоскости. Определить 2 из них такие, что количества точек, лежащих по обе стороны от прямой, проходящей через эти точки, различались минимально.

24. Найти все простые числа, меньшие натурального числа n.

25. Дана упорядоченная последовательность натуральных чисел b. Найти, входит ли в эту последовательность l-е число Фибоначчи. Числа Фибоначчи определяются по формуле: a0=1; a1=1; an=an-1+an-2.

26. Найти коэффициенты полинома R2n(x)=Pn(x)*Qn(x), где:

Pn(x)=anxn+an-1xn-1+…+a1x+a0, Qn(x)=bnxn+bn-1xn-1+…+b1x+b0.

27. Представим шахматную доску матрицей 8*8. Целые m и n задают позицию ферзя. Заполнить позицию ферзя символом "ф", позиции, находящиеся под боем, - символом "*".

28. Решить такую же задачу для коня.

29. Программа с помощью функции, генерирующей равномерно распределенное случайное число, выбирает целое значение от 0 до 9. Пользователь за 3 попытки должен угадать выбранное число. При каждой попытке выдается сообщение о том, равно, меньше или больше предложенное значение выбранному.

30. Для заданного четного числа n(n>2) проверить гипотезу Гольдбаха о том, что его можно представить в виде суммы 2-х простых чисел. В случае подтверждения гипотезы получить эти 2 числа, в противном случае выдать сообщение.

31. Заданы положение и массы n материальных точек на плоскости. Найти разбиение этого множества на 2 непустых и непересекающихся множества так, чтобы их центры тяжести находились наиболее близко друг к другу.

32. Выпуклая оболочка множества точек на плоскости состоит из тех точек множества, через которые можно провести такую прямую, что все точки лежат с одной стороны от прямой. Найти выпуклую оболочку такого множества.

33. "Задача о рюкзаке". Имеется n предметов с известным весом и стоимостью. Требуется поместить все или часть их в рюкзак, чтобы стоимость груза была максимальна, а вес не превышал m кг.

34. Пусть на экране имеется "жучок", который может перемещаться по прямой на заданное расстояние и поворачиваться на заданный угол. У него есть "перо", которое может быть опущено или нет. Реализовать с помощью "жучка" процедуру рисования на экране цифр(по образцу почтовых индексов на конвертах). Предусмотреть возможность изменения масштаба.

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

2. Абрамов С.А. и др. Задачи по программированию. – М: Наука, 1988. – 224с. 3. Балуев А.Н., Даугавет В.А., Шидловская Н.А. Сборник упражнений по АЛГОЛ 60.… 4. Брудно А.Л., Каплан Л.И. Олимпиады по программированию для школьников. – М: Наука ФМ, 1985. – 96с.

– Конец работы –

Используемые теги: основные, понятия, Определения, Элементы, языка, Элементы, данных, выражения, основные, инструкции, процедуры, препроцессор, стиль, программироваhия0.141

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: ОСНОВНЫЕ ПОНЯТИЯ И ОПРЕДЕЛЕНИЯ. ЭЛЕМЕНТЫ ЯЗЫКА. ЭЛЕМЕНТЫ ДАННЫХ. ВЫРАЖЕНИЯ. ОСНОВНЫЕ ИНСТРУКЦИИ. ПРОЦЕДУРЫ. ПРЕПРОЦЕССОР. СТИЛЬ ПРОГРАММИРОВАHИЯ

Что будем делать с полученным материалом:

Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Еще рефераты, курсовые, дипломные работы на эту тему:

Общее понятие о базах данных. Основные понятия систем управления базами данных. Модели данных. 10
Сетевые технологии обработки данных Компоненты вычислительных сетей... Принципы организации и основные топологии вычислительных сетей Принципы... Сетевой сервис и сетевые стандарты Средства использования сетевых сервисов...

Объекты базы данных. Язык определения данных
На сайте allrefs.net читайте: "Объекты базы данных. Язык определения данных"

Грамматика как языковой уровень. Морфология и смежные уровни языка; морфология и фонология; основные понятия морфонологии; морфология и синтаксис
Термин морфология состоит из двух древнегреческих корней и буквально означает учение о форме Он имеет два основных значения... Система механизмов языка обеспечивающая построение и понимание его... раздел грамматики изучающий закономерности функционирования и развития этой системы...

Грамматика как языковой уровень. Морфология и смежные уровни языка; морфология и фонология; основные понятия морфонологии; морфология и синтаксис
Термин quot морфология quot состоит из двух древнегреческих корней и буквально означает quot учение о форме quot Он имеет два основных... Система механизмов языка обеспечивающая построение и понимание его... раздел грамматики изучающий закономерности функционирования и развития этой системы...

Основные макроэкономические понятия. Список основных макроэкономических элементов. Классическая теория
В литературе можно найти много определений экономической теории Вот одно из них Экономическая теория исследует проблемы эффективного... Объект исследования экономической теории называется экономикой... Понятно что составление модели является очень важной частью исследования Вопрос о том что существенно и...

Введение. Основные понятия и определения
Введение Основные понятия и определения... Основные критерии работоспособности и расч та деталей машин...

Основные понятия языка C++. Переменные, константы
На сайте allrefs.net читайте: "Основные понятия языка C++. Переменные, константы"

Определение иммунологии, основные ее понятия
МОРФО ФУНКЦИОНАЛЬНАЯ ХАРАКТЕРИСТИКА ИММУННОЙ СИСТЕМЫ Общая морфо функциональная характеристика иммунной... МЕХАНИЗМЫ НЕСПЕЦИФИЧЕСКОГО ИММУНИТЕТА... Понятие о неспецифическом иммунитете...

изучение основных встроенных функций, системных переменных и выражений языка PL/SQL
На сайте allrefs.net читайте: "изучение основных встроенных функций, системных переменных и выражений языка PL/SQL"

Понятие о языке и речи. Основные функции языка
Понятие о языке и речи Основные функции языка... Понятие об основных и дополнительных формах существования языка Разнообразие... Литературный язык как высшая форма существования национального языка Основные черты литературного языка...

0.031
Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • По категориям
  • По работам