Потом других учить пришел и нам черед.
Какие ж выводы из этой всей науки?
Из праха мы пришли, нас ветер унесет.
Омар Хайям
Оглавление.
0. Напутствие в качестве вступления. .......................................... 1
1. Простые программы и алгоритмы. Сюрпризы, советы. ........................... 3
2. Массивы, строки, указатели. ................................................ 81
3. Мобильность и машинная зависимость программ. Проблемы с русскими буквами.
........................................................................... 122
4. Работа с файлами. .......................................................... 137
5. Структуры данных. .......................................................... 172
6. Системные вызовы и взаимодействие с UNIX. .................................. 186
6.1. Файлы и каталоги. ........................................................ 189
6.2. Время в UNIX. ............................................................ 198
6.3. Свободное место на диске. ................................................ 207
6.4. Сигналы. ................................................................. 212
6.5. Жизнь процессов. ......................................................... 219
6.6. Трубы и FIFO-файлы. ...................................................... 230
6.7. Нелокальный переход. ..................................................... 233
6.8. Хозяин файла, процесса, и проверка привелегий. ........................... 235
6.9. Блокировка доступа к файлам. ............................................. 240
6.10. Файлы устройств. ........................................................ 244
6.11. Мультиплексирование ввода-вывода ......................................... 259
6.12. Простой интерпретатор команд. ........................................... 271
7. Текстовая обработка. ....................................................... 283
8. Экранные библиотеки и работа с видеопамятью. ............................... 348
9. Приложения. ................................................................ 391
9.1. Таблица приоритетов операций языка C++ .................................... 391
9.2. Правила преобразований типов. ............................................ 391
9.3. Таблица шестнадцатеричных чисел (HEX). ................................... 392
9.4. Таблица степеней двойки. ................................................. 393
9.5. Двоичный код: внутреннее представление целых чисел. ...................... 393
10. Примеры. .................................................................. 394
Пример 1. Размен монет. ......................................................
Пример 2. Подсчет букв в файле. ..............................................
Пример 3. Центрирование строк. ...............................................
Пример 4. Разметка текста для nroff. .........................................
Пример 5. Инвертирование порядка слов в строках. .............................
Пример 6. Пузырьковая сортировка. ............................................
Пример 7. Хэш-таблица. .......................................................
Пример 8. Простая база данных. ...............................................
Пример 9. Вставка/удаление строк в файл. .....................................
Пример 10. Безопасный free, позволяющий обращения к автоматическим перемен-
ным. .....................................................................
Пример 11. Поимка ошибок при работе с динамической памятью. ..................
Пример 12. Копирование/перемещение файла. ....................................
Пример 13. Обход поддерева каталогов в MS DOS при помощи chdir. ..............
Пример 14. Работа с сигналами. ...............................................
Пример 15. Управление скоростью обмена через линию. ..........................
Пример 16. Просмотр файлов в окнах. ..........................................
Пример 17. Работа с иерархией окон в curses. Часть проекта uxcom. ............
Пример 18. Поддержка содержимого каталога. Часть проекта uxcom. ..............
Пример 19. Роллируемое меню. Часть проекта uxcom. ............................
Пример 20. Выбор в строке-меню. Часть проекта uxcom. .........................
Пример 21. Редактор строки. Часть проекта uxcom. .............................
Пример 22. Выбор в прямоугольной таблице. Часть проекта uxcom. ...............
Пример 23. UNIX commander - простой визуальный Шелл. Головной модуль проекта
uxcom. ...................................................................
Пример 24. Общение двух процессов через "трубу". .............................
Пример 25. Общение процессов через FIFO-файл. ................................
Пример 26. Общение процессов через общую память и семафоры. ..................
Пример 27. Протоколирование работы программы при помощи псевдотерминала и
процессов. ...............................................................
Пример 28. Оценка фрагментированности файловой системы. ......................
Пример 29. Восстановление удаленного файла в BSD-2.9. ........................
Пример 30. Копирование файлов из MS DOS в UNIX. ..............................
Пример 31. Программа, печатающая свой собственный текст. .....................
Пример 32. Форматирование текста Си-программы. ...............................
1.11. Треугольник из звездочек. ............................................... 6
1.34. Простые числа. .......................................................... 10
1.36. Целочисленный квадратный корень. ........................................ 12
1.39. Вычисление интеграла по Симпсону. ....................................... 14
1.49. Сортировка Шелла. ....................................................... 20
1.50. Быстрая сортировка. ..................................................... 21
1.67. Функция чтения строки. .................................................. 28
1.88. Перестановки элементов. ................................................. 38
1.117. Схема Горнера. ......................................................... 58
1.137. Системная функция qsort - формат вызова. ............................... 67
1.146. Процесс компиляции программ. ........................................... 76
2.58. Функция bcopy. .......................................................... 108
2.59. Функция strdup. ......................................................... 111
2.61. Упрощенный аналог функции printf. ....................................... 112
3.9. _ctype[] .................................................................. 126
3.12. Программа транслитерации: tr. ........................................... 129
3.16. Функция записи трассировки (отладочных выдач) в файл. ................... 132
3.18. Условная компиляция: #ifdef .............................................. 132
4.39. Быстрый доступ к строкам файла. ......................................... 161
4.45. Эмуляция основ библиотеки STDIO, по мотивам 4.2 BSD. .................... 165
5.12. Отсортированный список слов. ............................................ 180
5.16. Структуры с полями переменного размера. ................................. 183
5.17. Список со "старением". .................................................. 184
6.1.1. Определение типа файла. ................................................ 189
6.1.3. Выдача неотсортированного содержимого каталога (ls). ................... 191
6.1.5. Рекурсивный обход каталогов и подкаталогов. ............................ 192
6.2.9. Функция задержки в микросекундах. ...................................... 201
6.4.3. Функция sleep. ......................................................... 217
6.10.1. Определение текущего каталога: функция getwd. ......................... 252
6.10.2. Канонизация полного имени файла. ...................................... 257
6.11.1. Мультиплексирование ввода из нескольких файлов. ....................... 259
6.11.2. Программа script. ..................................................... 261
7.12. Программа uniq. ......................................................... 285
7.14. Расширение табуляций в пробелы, функция untab. .......................... 285
7.15. Функция tabify. ......................................................... 285
7.25. Поиск методом половинного деления. ...................................... 288
7.31. Программа печати в две полосы. .......................................... 292
7.33. Инвертирование порядка строк в файле. ................................... 296
7.34. Перенос неразбиваемых блоков текста. .................................... 298
7.36. Двоичная сортировка строк при помощи дерева. ............................ 300
7.41. Функция match. .......................................................... 309
7.43. Функция контекстной замены по регулярному выражению. .................... 313
7.44. Алгоритм быстрого поиска подстроки в строке. ............................ 316
7.52. Коррекция правописания. ................................................. 321
7.67. Калькулятор-1. .......................................................... 330
7.68. Калькулятор-2. .......................................................... 336
8.1. Осыпающиеся буквы. ....................................................... 350
8.13. Использование библиотеки termcap. ....................................... 359
8.17. Разбор ESC-последовательностей с клавиатуры. ............................ 371
11. Список литературы.
1) Б.Керниган, Д.Ритчи, А.Фьюер. Язык программирования Си. Задачи по языку Си. -
М.: Финансы и статистика, 1985.
2) М.Уэйт, С.Прата, Д.Мартин. Язык Си. Руководство для начинающих. - М.: Мир,
1988.
3) М.Болски. Язык программирования Си. Справочник. - М.: Радио и связь, 1988.
4) Л.Хэнкок, М.Кригер. Введение в программирование на языке Си. - М.: Радио и
связь, 1986.
5) М.Дансмур, Г.Дейвис. ОС UNIX и программирование на языке Си. - М.: Радио и
связь, 1989.
6) Р.Берри, Б.Микинз. Язык Си. Введение для программистов. - М.: Финансы и ста-
тистика, 1988.
7) М.Беляков, А.Ливеровский, В.Семик, В.Шяудкулис. Инструментальная мобильная опе-
рационная система ИНМОС. - М.: Финансы и статистика, 1985.
8) К.Кристиан. Введение в операционную систему UNIX. - М.: Финансы и статистика,
1985.
9) Р.Готье. Руководство по операционной системе UNIX. - М.: Финансы и статистика,
1986.
10) М.Банахан, Э.Раттер. Введение в операционную систему UNIX. - М.: Радио и
связь, 1986.
11) С.Баурн. Операционная система UNIX. - М.: Мир, 1986.
12) П.Браун. Введение в операционную систему UNIX. - М.: Мир, 1987.
13) M.Bach. The design of the UNIX operating system. - Prentice Hall, Englewood
Cliffs, N.J., 1986.
14) S.Dewhurst, K.Stark. Programming in C++. - Prentice Hall, 1989.
15) M.Ellis, B.Stroustrup. The annotated C++ Reference Manual. - Addison-Wesley,
1990.
/* Пример 1 */
/* Задача о размене монеты:
* Поиск всех возможных коэффициентов a0 .. an разложения числа S
* в виде
* S = a0 * c0 + a1 * c1 + ... + an * cn
* где веса c0 .. cn заданы заранее и упорядочены.
* Веса и коэффициенты неотрицательны (ai >= 0, ci >= 0).
*/
#include
/* Достоинства разменных монет (веса ci) */
int cost[] = {
1, 2, 3, 5, 10, 15, 20, 50, 100, 300, 500 /* копеек */
};
#define N (sizeof cost / sizeof(int))
int count[ N ]; /* число монет данного типа (коэффициенты ai) */
long nvar; /* число вариантов */