- •СОДЕРЖАНИЕ
- •ПРЕДИСЛОВИЕ
- •ГЛАВА 1. Введение в алгоритмы
- •1.1. Этапы решения задач на ЭВМ
- •1.2. Понятие алгоритма
- •1.3. Свойства алгоритмов
- •1.4. Сложность алгоритма
- •1.7. Пример простейшего линейного процесса
- •1.7. Пример циклического процесса
- •ГЛАВА 2. Базовые средства языка Си
- •2.1. Алфавит языка Си
- •2.2. Лексемы
- •2.3. Идентификаторы и ключевые слова
- •2.4. Комментарии
- •2.5. Простейшая программа
- •2.7. Декларация объектов
- •2.8. Данные целого типа (integer)
- •2.9. Данные символьного типа (char)
- •2.10. Данные вещественного типа (float, double)
- •ГЛАВА 3. Константы в программах
- •3.2. Константы вещественного типа
- •3.4. Строковые константы
- •ГЛАВА 4. Обзор операций
- •4.1. Операции, выражения
- •4.3. Операция присваивания
- •4.4. Сокращенная запись операции присваивания
- •4.7. Операции сравнения
- •4.8. Логические операции
- •4.10. Операция «,» (запятая)
- •ГЛАВА 5. Обзор базовых инструкций языка Си
- •5.2. Стандартные математические функции
- •5.3. Функции вывода данных на дисплей
- •5.4. Функции ввода информации
- •ГЛАВА 6. Составление разветвляющихся алгоритмов
- •6.1. Краткая характеристика операторов языка Си
- •ГЛАВА 7. Составление циклических алгоритмов
- •7.1. Понятие циклического кода
- •7.2. Оператор с предусловием while
- •7.4. Оператор цикла с предусловием и коррекцией for
- •ГЛАВА 8. Операторы и функции передачи управления
- •8.1. Оператор безусловного перехода goto
- •8.2. Операторы continue, break и return
- •8.3. Функции exit и abort
- •Советы по программированию
- •ГЛАВА 9. Указатели
- •9.1. Определение указателей
- •9.2. Операция sizeof
- •9.3. Инициализация указателей
- •9.4. Операции над указателями
- •ГЛАВА 10. Массивы
- •10.1. Понятие массива
- •10.2. Одномерные массивы
- •10.4. Строки как одномерные массивы данных типа char
- •10.5. Указатели на указатели
- •10.8. Работа с динамической памятью
- •10.9. Библиотечные функции
- •10.10. Пример создания одномерного динамического массива
- •ГЛАВА 11. Функции пользователя
- •11.1. Декларация функции
- •11.2. Вызов функции
- •11.3. Передача аргументов в функцию
- •11.4. Операция typedef
- •11.5. Указатели на функции
- •ГЛАВА 12. Классы памяти и область действия объектов
- •ЗАДАНИЕ 4. Обработка массивов
- •Первый уровень сложности
- •Второй уровень сложности
- •ЗАДАНИЕ 5. Функции пользователя
- •Первый уровень сложности
- •Второй уровень сложности
- •12.3. Статические и внешние переменные
- •12.4. Область действия переменных
- •Советы по программированию
- •13.1. Структуры
- •13.5. Вложенные структуры
- •13.6. Массивы структур
- •13.7. Размещение структурных переменных в памяти
- •13.8. Объединения
- •13.9. Перечисления
- •13.10. Битовые поля
- •ГЛАВА 14. Файлы в языке Си
- •14.1. Открытие файла
- •14.2. Закрытие файла
- •14.3. Запись-чтение информации
- •14.5. Дополнительные файловые функции
- •Советы по программированию
- •ЗАДАНИЕ 7. Создание и обработка файлов
- •Первый уровень сложности
- •Второй уровень сложности
- •ГЛАВА 15. Динамические структуры данных
- •15.1. Линейные списки
- •15.2.1. Алгоритм формирования стека
- •15.2.2. Алгоритм извлечения элемента из стека
- •15.2.3. Просмотр стека
- •15.2.4. Алгоритм освобождения памяти, занятой стеком
- •15.2.5. Алгоритм проверки правильности расстановки скобок
- •15.3.1. Формирование очереди
- •15.3.2. Алгоритм удаления первого элемента из очереди
- •15.4. Двунаправленный линейный список
- •15.4.1. Формирование первого элемента
- •15.4.3. Алгоритм просмотра списка
- •15.4.5. Алгоритм удаления элемента в списке по ключу
- •15.5. Нелинейные структуры данных
- •15.5.1. Бинарные деревья
- •15.5.2. Основные алгоритмы работы с бинарным деревом
- •15.5.4. Вставка нового элемента
- •15.6. Построение обратной польской записи
- •15.6.1. Алгоритм, использующий дерево
- •15.6.2. Алгоритм, использующий стек
- •15.6.3. Пример реализации
- •15.7. Понятие хеширования
- •15.7.2. Примеры хеш-функций
- •15.7.3. Схемы хеширования
- •15.7.4. Примеры реализации схем хеширования
- •Вариант 2. Двунаправленные списки
- •ГЛАВА 16. Переход к ООП
- •16.1. Потоковый ввод-вывод
- •16.3. Проблема ввода-вывода кириллицы в среде Visual C++
- •16.4. Операции new и delete
- •16.6. Шаблоны функций
- •Первый уровень сложности
- •Второй уровень сложности
- •6.1. Основные понятия
- •6.3. Примитивы GDI
- •6.5. Получение описателя контекста устройства
- •6.6. Основные инструменты графической подсистемы
- •6.7. Закрашивание пустот
- •6.8. Рисование линий и кривых
- •6.9. Пример изображения графика функции sin
- •6.10. Рисование замкнутых фигур
- •6.11. Функция Polygon и режим закрашивания многоугольника
- •6.13. Управление областями вывода и отсечением
- •ЗАДАНИЕ 11. Создание графических изображений
- •ЛИТЕРАТУРА
char ss = ‘У’;
Текстовые символы непосредственно вводятся с клавиатуры, а специальные и управляющие – представляются в исходном тексте парами
символов, например: \\ , \' , \" . |
|
|
|
|
|
|
|
Примеры символьных констант: 'А', '9', |
'$', |
'\n'. |
|
|
|
|
|
3.4. Строковые константы |
|
|
|
|
|||
Строковая константа |
представляет |
собой |
последовательность |
||||
|
|
|
|
|
|
Р |
|
символов кода ASCII, заключенную в кавычки (”). Во внутреннем |
|||||||
представлении к строковым |
константам добавляется |
пустой символ |
'\0', |
||||
|
|
|
|
|
И |
|
|
который не является цифрой 0, на печать не выводится (в таблице кодов |
|||||||
ASCII имеет код = 0) и является признаком окончания строки. |
|
|
|
||||
Кавычки не являются |
частью строки, а |
|
У |
|
ее |
||
служат только для |
ограничения. Строка в языке Си представляет собой массив, состоящий из символов. Внутреннее представление константы "1234ABC": '1' '2' '3' '4' 'A' 'B'
'C' '\0' . |
|
|
|
|
|
|
|
|
Г |
Примеры строковых констант: |
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
"Система", "\n\t Аргумент \n", "Состояние \"WAIT \" " . |
||||||||
Строковые константы еще называют строковыми литералами. |
|||||||||
В конец строковой константы |
|
|
Б |
||||||
омпилятор автоматически помещает |
|||||||||
нуль-символ. |
|
|
|
|
|
|
а |
||
|
|
|
|
|
|
|
|
||
Длинную строковую константу можно разбить на несколько, используя |
|||||||||
|
|
|
|
|
|
к |
|
||
символ переноса – обратный сл ш (\). |
Например: |
||||||||
|
“Вы поступили и \ |
е |
|
|
|||||
|
учитесь на факуль |
е е информационных технологий \ |
|||||||
|
Белорусск |
г сударс венного университета \ |
|||||||
|
информат |
|
традиоэлектроники” |
||||||
|
|
|
|
го |
|
|
|
|
|
Компилятор Си воспримет такую запись как единое целое, игнорируя |
|||||||||
символы о ратного с еша. |
|
|
|
|
|
||||
|
|
|
ки |
|
|
|
|
|
|
|
|
л |
|
|
|
|
|
|
|
|
б |
ГЛАВА 4. Обзор операций |
|||||||
и |
|
|
4.1. Операции, выражения |
||||||
Выражения используются для вычисления значений (определенного |
|||||||||
Б |
|
|
|
|
|
|
|
|
|
типа) и состоят из операндов, операций и скобок. Каждый операнд может быть, в свою очередь, выражением или одним из его частных случаев – константой или переменной. Операнды задают данные для вычислений.
Знак операции – это один или более символов, определяющих действие над операндами, т.е. операции задают действия, которые необходимо выполнить. Внутри знака операции пробелы не допускаются.
27
Операции делятся на унарные, бинарные и тернарные – по количеству участвующих в них операндов, и выполняются в соответствии с приоритетами. Для изменения порядка выполнения операций используются круглые скобки.
Большинство операций выполняются слева направо, например, a+b+c ® ® (a+b)+c. Исключение составляют унарные операции, операции присваивания и условная операция (?:), которые выполняются справа налево.
В языке Си используются четыре унарные операции, имеющие самый высокий приоритет, их часто называют первичными:
–операция доступа к полям структур и объединений приРпомощи идентификаторов «.» – точка;
–операция доступа к полям структур и объединенийИпри помощи указателей «–>» – стрелка;
–операция [ ] индексации, используемая при Удекларации массива и обращении к его элементам;
–операция ( ) обращения к функции. ГБ вприл. 2.
|
а |
|
к |
4.2. Арифметичес ие операции |
|
ес |
|
Обозначения арифметич |
ких опер ций: |
+ (сложение); – (вычитание); |
/ (д ление, для int операндов – с |
Операндами традициотнных арифметических операций (+ – * /) могут быть константы, переменные, обращения к возвращающим значения функциям, э ементы массивов, любые арифметические выражения, указатели (с огра чен ями).
отбрасыванием остатка); * (умножение); % (остаток от деления целочисленных операндов со знаком первого операнда – деление «по модулю»).
Порядок нивыполнения действий в арифметических выражениях
следующий: выражения в круглых скобках; операции *, /, %; операции +, –. |
|||||
|
л |
|
|
||
Унарные |
операции «знак числа» (+, –) обладают самым высоким |
||||
пр ор тетомби |
определены для |
операндов числовых типов (имеющих |
|||
ч словой результат), при этом «+» носит только информационный характер, |
|||||
и |
|
|
|
|
|
«–» меняет знак операнда на противоположный (неадресная операция). |
|||||
Операции |
*, /, % обладают высшим приоритетом над операциями +, –, |
||||
Б |
|
|
|
|
|
поэтому при записи сложных выражений нужно использовать общепринятые |
|||||
математические правила: x + y × z - |
a |
« x+y*z–a /(b+с) , т.е. использовать |
|||
b + c |
|||||
|
|
|
|
круглые скобки.
28
4.3. Операция присваивания
Формат операции присваивания:
Операнд_1 = Операнд_2 ;
Операндом_1 (левый операнд) может быть только переменная. Левый операнд операции присваивания получил название L–значение, (L–value, Left–value) – адресное выражение. Так в Си называют любое выражение, адресующее некоторый участок оперативной памяти, в который можно записать некоторое значение. Переменная – это частный случай адресного выражения.
Операндом_2 (правый операнд) могут быть: константа, переменная или |
|||
любое выражение, составленное в соответствии с синтаксисом языкаРСи. |
|||
|
|
У |
|
Правый операнд операции присваивания назвали R–значение, (R–value, |
|||
Right–value). |
Г |
И |
|
Присваивание значения в языке Cи, в отличие от традиционной |
|||
|
Б |
|
|
интерпретации, рассматривается как выражение, имеющее значение левого операнда после присваивания. Таким образом, присваивание может включать несколько операций присваивания, изменяя зн чения нескольких операндов,
например: |
|
|
|
|
|
|
к |
int i, j, k; |
|
|
|
|
|
||
|
|
|
|
|
а |
||
float x, y, z; |
|
|
|
|
|||
... |
|
|
|
|
те |
|
|
i = j = k = 0; |
|
|
|||||
|
|
↔ k = 0, j = k, i = j; |
|||||
x = i + (y = 3) – (z = 0); |
е↔ z = 0, y = 3, x = i + y – z; |
||||||
|
|
|
|
о |
|
|
|
Примеры недопустимых выражений: |
|||||||
|
|
ие |
|
|
2 = x + y; |
||
– присваиван |
|
к нстан : |
|
||||
– присваиван е функции: |
|
getch() = i; |
|||||
л |
|
|
|
|
|||
– присваиван |
е результату операции: (i + 1) = 2 + y; |
||||||
б |
|
|
|
|
|
|
|
4.4. Сокращенная запись операции присваивания |
|||||||
В языке Си используются два вида сокращенной записи операции |
|||||||
присва ван я: |
|
|
|
|
|
|
|
и1) вместо записи: v = v # e; |
|
|
|||||
где # – любая арифметическая операция (операция над битовым |
|||||||
представлениемБ |
операндов), рекомендуется использовать запись v #= e; |
||||||
Например, |
|
i = i + 2; ↔ |
i += 2; (знаки операций – без пробелов); |
2) вместо записи: x = x # 1;
где # – символы, обозначающие операцию инкремента (+1), либо декремента
(–1), |
x – целочисленная |
переменная |
(или переменная-указатель), |
|
рекомендуется использовать запись: |
|
|
||
|
##x; – префиксную, |
или |
x##; |
– постфиксную. |
|
|
|
|
29 |
Если эти операции используются в чистом виде, то различий между постфиксной и префиксной формами нет. Если же они используются в выражении, то в префиксной форме (##x) сначала значение x изменится на 1, а затем полученный результат будет использован в выражении; в постфиксной форме (x##) – сначала значение переменной х используется в выражении, а затем изменится на 1. Операции над указателями будут рассмотрены в разд. 9.4.
Пример 1: |
|
|
Пример 2: |
|
|
Р |
||
int i, j, k; |
Смысл записи |
|
int n, a, b, c, d; |
|
|
Значения |
||
float x, y; |
|
|
n = 2; a = b = c = 0; |
И |
||||
... |
|
|
a = ++n; |
|
|
|||
|
|
|
|
|
n=3, a=3 |
|||
х *= y; |
x = x*y; |
|
a += 2; |
|
У |
a=5 |
||
i += 2; |
i = i + 2; |
|
b = n++; |
|
b=3, n=4 |
|||
|
|
|
|
|||||
x /= y+15; |
x = x/(y + 15); |
|
b –= 2; |
|
Г |
|
b=1 |
|
--k; |
k = k – 1; |
|
c = --n; |
|
n=3, c=3 |
|||
|
|
|
|
|||||
k--; |
k = k – 1; |
|
c *= 2; |
Б |
|
|
c=6 |
|
|
|
|
|
|
||||
j = i++; |
j = i; i = i + 1; |
|
d = n--; |
|
|
|
d=3, n=2 |
|
j = ++i; |
i = i + 1; j = i; |
|
d %= 2; |
|
|
|
d=1 |
|
|
|
|
а |
|
|
|
|
|
|
|
|
|
|
|
|
||
4.5. Преобразование типов опер ндов рифметических операций |
||||||||
|
е |
|
|
|
|
один тип, то и |
||
Если операнды арифметич с их операндов имеют |
результат операции будеттьиме такой же тип.
Но, как правило, в операциях участвуют операнды различных типов. В
этом случае они пре бразуются к общему типу в порядке увеличения их
«размера памяти», т.е. бъема памяти, необходимого для хранения их
значений. Поэтому неявные преобразования всегда идут от «меньших»
объектов к «бо ьш м». Схема выполнения преобразований операндов |
|||||
|
|
о |
|
|
|
арифметическ х операц й выглядит следующим образом: |
|
||||
|
и |
→ unsigned |
→ long |
→ double |
|
short, char |
→ int |
||||
л |
|
|
float |
→ double |
|
Стрелки отмечают преобразования даже однотипных операндов перед |
|||||
б |
|
|
|
|
|
выполне ем операции. То есть действуют следующие правила: |
Бни– значения типов char и short всегда преобразуются в int;
– если один из операндов имеет тип double, то и другой преобразуется в double;
– если один из операндов long, то другой преобразуется в long. Внимание. Результатом операции 1/3 будет значение 0, чтобы
избежать такого рода ошибок, необходимо явно изменить тип хотя бы одного операнда, т.е. записать, например: 1./3 .
Типы char и int могут свободно смешиваться в арифметических выражениях. Каждая переменная типа char автоматически преобразуется в
30