
- •СОДЕРЖАНИЕ
- •ПРЕДИСЛОВИЕ
- •ГЛАВА 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. Создание графических изображений
- •ЛИТЕРАТУРА
ГЛАВА 2. Базовые средства языка Си
Любая программа, написанная на языке высокого уровня, состоит из последовательности инструкций, оформленных в строгом соответствии с набором правил, составляющих синтаксис данного языка.
При создании программ разработчик может допустить следующие ошибки: синтаксические и логические.
Синтаксические ошибки – это результат нарушения формальных |
|||||
|
|
|
|
|
Р |
правил написания программы на конкретном языке программирования. |
|||||
Логические ошибки разделяются, в свою очередь, на ошибки алгоритма |
|||||
и семантические ошибки. |
|
|
|
И |
|
|
|
|
|
|
|
Причиной ошибки алгоритма является несоответствие построенного |
|||||
|
|
|
У |
|
|
алгоритма ходу получения конечного результата сформулированной задачи. |
|||||
Причина семантической ошибки – неправильное понимание смысла |
|||||
|
|
|
Г |
|
|
(семантики) операторов выбранного языка программирования. |
|
||||
|
2.1. Алфавит языка Си |
|
|
|
|
|
|
а |
|
|
|
Алфавит любого языка составляет совокупность символов – тех |
|||||
неделимых знаков, при помощи которых з писывБются все тексты на данном |
|||||
языке. |
к |
|
|
|
|
|
е |
|
|
|
|
Каждому из множества знач ний, определяемых одним байтом (от 0 до |
255), в таблице знакогенератора ЭВМ ставится в соответствие символ. По кодировке фирмы IBM символы с кодами от 0 до 127, образующие первую половину таблицы знакогенера ора, построены по стандарту ASCII и
одинаковы для всех к мпь |
|
еров, в орая половина символов (коды 128 – |
|
255) может отличаться и |
бычно используется для размещения символов |
||
национального алфав та. |
К ды 176 – 223 отводятся под символы |
||
|
|
ют |
|
псевдографики, а коды 240 – 255 – под специальные знаки (прил. 1). |
|||
Алфавит языка |
о |
|
|
включает: |
|||
– прописныеСистрочные буквы латинского алфавита и знак |
|||
л |
|
|
|
подчерк вания (код 95); |
|
|
|
– ара ск е цифры от 0 до 9; |
|||
– специальныеб |
символы, смысл и правила использования которых |
будемБирассматривать по тексту;
– пробельные (разделительные) символы: пробел, символы табуляции, перевода строки, возврата каретки, новой страницы и новой строки.
2.2. Лексемы
Из символов алфавита формируются лексемы (или элементарные конструкции) языка – минимальные значимые единицы текста в программе:
–идентификаторы;
–ключевые (зарезервированные) слова;
17

–знаки операций;
–константы;
–разделители (скобки, точка, запятая, пробельные символы).
Границы лексем определяются другими лексемами, такими как разделители или знаки операций, а также комментариями.
2.3. Идентификаторы и ключевые слова
Идентификатор (ID) – это имя программного объекта (константы,
использоваться латинские буквы, цифры и знак подчеркивания; первый
переменной, метки, типа, функции и т.д.). В идентификатореРмогут
символ ID – не цифра; пробелы внутри ID не допускаются. |
И |
|
|
Длина идентификатора определяется выбранной версией среды |
|
У |
программирования. Например, в среде Borland C++ 6.0 идентификаторы
могут включать любое число символов, из которых воспринимаются и используются только первые 32 символа. Современная тенденция – снятие ограничений длины идентификатора.
При именовании объектов следует придерживаться общепринятых |
||
соглашений: |
|
Г |
– ID переменных и функций обычно пишутся строчными (малыми) |
||
буквами – index, max(); |
|
Б |
– ID типов пишутся с большой бу вы, н пример, Spis, Stack; |
||
– ID констант (макросов) – большимиабуквами – INDEX, MAX_INT; |
||
– идентификатор долж н н сти смысл, поясняющий назначение |
||
|
к |
|
объекта в программе, наприм р, birth date – день рождения, sum – сумма; |
||
– если ID состоит из н |
кольких слов, как, например, birth_date, то |
|
|
ес |
|
следующее слово с б льштй буквы – birthDate.
принято либо разделять сл ва символом подчеркивания, либо писать каждое
В Си проп сные и строчные буквы – различные символы.
Идентификаторы Name, NAME, name – различные объекты. |
|
||||||
|
|
|
|
о |
|
|
|
Ключевые (зарезервированные) слова не могут быть использованы в |
|||||||
качестве идентификаторов. |
|
|
|
||||
С сок к ючевых слов, определенных в стандарте ANSI Cи: |
|||||||
|
|
л |
|
|
|
|
|
auto |
б |
do |
goto |
signed |
unsigned |
||
|
double |
if |
sizeof |
void |
|||
break |
|
||||||
case |
|
|
else |
int |
static |
volatile |
|
пи |
|
enum |
long |
struct |
while |
||
char |
|
|
|||||
Бconst |
|
extern |
register |
switch |
|
||
continue |
|
float |
return |
typedef |
|
||
default |
|
for |
short |
union |
|
Здесь и далее по тексту объектами будем называть элементы, участвующие в программе.
18

2.4. Комментарии
Еще один базовый элемент языка программирования – комментарий – не является лексемой. Внутри комментария можно использовать любые допустимые на данном компьютере символы, поскольку компилятор их игнорирует.
В Си комментарии ограничиваются парами символов /* и */, а в С++ был введен вариант комментария, который начинается символами // и заканчивается символом перехода на новую строку.
функций, одна из которых имеет идентификатор main – главная (основнаяР). Она является первой выполняемой функцией (с нее начинается выполнение
2.5. Простейшая программа
Программа, написанная на языке Си, состоит из одной или нескольких
программы) и ее назначение – управлять работой всей программы (проекта). |
||||||||
Общая структура программы на языке Си имеет вид: |
И |
|||||||
<директивы препроцессора> |
|
|
|
|
У |
|||
<определение типов пользователя – typedef> |
Г |
|
||||||
<описание прототипов функций> |
|
|
|
|||||
|
Б |
|
|
|||||
<определение глобальных переменных> |
|
|
||||||
<функции> |
|
|
|
|
|
|||
|
|
а |
|
|
|
|||
|
|
|
|
|
|
|
||
|
|
|
к |
|
|
|
|
|
В свою очередь, каждая функция имеет следующую структуру: |
||||||||
<класс памяти> <тип> < ID фун ции> (<объявление параметров>) |
||||||||
|
|
т |
|
|
|
|
|
|
|
{ – начало функции |
|
|
|
|
|
|
|
|
код функциие |
|
|
|
|
|
||
|
о |
|
|
|
|
|
|
|
|
} – конец функции |
|
|
|
|
|
|
|
|
и |
|
|
|
|
|
|
|
Код функции является блоком и поэтому заключается в фигурные |
||||||||
скобки. |
|
|
|
|
|
|
|
|
Функции не могут быть вложенными друг в друга. |
|
|
Рассмотрим кратко основные части общей структуры программ.
Перед компи яцией программа обрабатывается препроцессором (прил. 3), |
|
л |
|
который ра отает под управлением директив. |
|
Препроцессорныеб |
директивы начинаются символом #, за которым |
следует на менование директивы, указывающее ее действие. |
|
и |
|
Препроцессор решает ряд задач по предварительной обработке |
программыБ , основной из которых является подключение (include) к программе так называемых заголовочных файлов (обычных текстов) с декларацией стандартных библиотечных функций, использующихся в программе. Общий формат ее использования
#include < ID_файла.h>
где h – расширение заголовочных файлов.
Более подробное описание функции main рассматривается в п. 11.7.
19
Если идентификатор файла заключен в угловые скобки (< >), то поиск данного файла производится в стандартном каталоге, если – в двойные кавычки (” ”), то поиск файла производится в текущем каталоге.
К наиболее часто используемым библиотекам относятся:
stdio.h – содержит стандартные функции файлового ввода-вывода; math.h – математические функции;
conio.h – функции для работы с консолью (клавиатура, дисплей). Второе основное назначение препроцессора – обработка макроопре-
делений. Макроподстановка определить (define) имеет общий вид
#define ID строка
идентификатора, в которые за люча тся список параметров. Перед ID функции указывается тип возвраща мого ею результата. Если функция не
Например: #define PI 3.1415927 |
|
|
|
|
|
|
|
– в ходе препроцессорной обработки программы идентификатор PI везде |
|||||||
будет заменяться значением 3.1415927. |
|
|
|
|
Р |
||
|
|
|
|
|
|
||
Рассмотрим пример, позволяющий |
понять |
простейшие |
приемы |
||||
программирования на языке Си: |
|
|
|
И |
|
||
|
|
У |
|
|
|||
#include <stdio.h> |
|
|
|
|
|
||
void main(void) |
// Начало функции main |
Г |
|
|
|
||
{ |
|
|
|
||||
|
|
|
|
|
|||
printf(“ Высшая оценка знаний – 10 !”); |
|
|
|
|
|
||
} |
|
Б |
|
|
|
|
|
// Окончание фун ции main |
|
|
|
|
|||
Отличительным признаком фун ции |
служат |
скобки ( ) |
после ее |
||||
|
а |
|
|
|
|
|
|
|
к |
|
|
|
|
|
|
|
е |
|
|
|
|
|
|
возвращает результата и не им |
параметров, указывают атрибуты void – |
||
|
|
о |
|
отсутствие значений. |
|
||
Для начала будем использовать функцию main без параметров и не |
|||
|
и |
|
|
возвращающую значен я.т |
собой набор инструкций, каждая из |
||
Код функц |
представляет |
||
л |
|
|
|
которых оканч вается с мволом «;». В нашем примере одна инструкция – |
|||
б |
|
|
|
функция printf, выполняющая вывод данных на экран, в данном случае – |
|||
указанную фразу. |
|
|
__________________________________________________________________
П |
емы отладки в среде программирования Visual C++ 6.0 |
рассмат |
ваются в прил. 5. |
ри |
|
__________________________________________________________________ |
|
Б |
|
Данные в языке Си разделяются на две категории: простые (скалярные), будем их называть базовыми, и сложные (составные) типы данных.
Тип данных определяет:
– внутреннее представление данных в оперативной памяти;
20