Язык программирования C. Лекции и упражнения

Стивен Прата

Об авторе

Глава 1. Готовимся изучать язык С
Как возник язык С?
Почему был выбран С?
Структурные особенности языка программирования С
Эффективность
Переносимость
Программу на языке С можно взять домой
Мощь и гибкость
Ориентация на программистов
Недостатки
Эволюция языка программирования С
Использование языка С: семь этапов по созданию программы
Этап 1: Определение целей создания программы
Этап 2; Составление проекта программы
Этап 3: Создание программного кода
Этап 4: Компиляция
Этап 5: Выполнение программы
Этап 6: Проверка и отладка программы
Этап 7: Сопровождение и модернизация программы
Комментарии
Технология программирования
Файлы объектного кода, исполняемые файлы и библиотеки
Операционная система UNIX
Операционная система Linux
Компиляторы командной строки для компьютеров IBM PC
Интегрированные среды разработки (DOS)
Интегрированные среды разработки (Windows)
Реализация С для Macintosh
Причины осуществления компиляции
Стандарты языка С
Стандарт ANSI С
Комитет С9Х
Некоторые соглашения
Тип шрифта
Данные, выводимые на экран
Резюме
Контрольные вопросы
Упражнения по программированию

Глава 2. Введение в язык С
Простая программа на языке С
Объяснение
Первый проход: краткий обзор
Второй проход: детали программы
Структура простой программы
Советы: как сделать программы легко читаемыми
Делаем следующий шаг
Документирование
Объявление нескольких переменных
Умножение
Вывод на экран нескольких значений
Программа, включающая несколько функций
Отладка
Синтаксические ошибки
Семантические ошибки
Состояние программы
Ключевые слова
Резюме
Контрольные вопросы
Упражнения по программированию

Глава 3. Представление данных в языке С
Учебная программа
Что нового появилось в этой программе?
Переменные и константы
Ключевые слова, обозначающие типы данных
Целочисленные данные и данные с плавающей точкой
Целые числа
Числа с плавающей точкой
Типы данных языка С
Тип данных int
Другие типы целочисленных данных
Применение символов: тип данных char
Данные типа float и double
Другие типы данных
Размеры данных различных типов
Использование типов данных
Опасности, связанные с использованием аргументов
Еще один пример программы
Что делает эта программа
Возможная проблема
Резюме
Контрольные вопросы
Упражнения по программированию

Глава 4. Строки символов и форматированный ввод/вывод
Вводная программа
Строки символов: введение
Тип массива char и нулевой символ
Использование строк
Функция strlen()
Константы и препроцессор С
Модификатор const
Одновременное использование #define и #include
Язык С — мастер маскировки: создание псевдонимов
Именованные константы в работе
Исследование и использование функций printf() и scanf()
Функция printf()
Использование функции printf()
Модификаторы спецификации преобразования для функции printf()
Значение преобразования
Использование функции scanf()
Модификатор * и его использование с функциями printf () и scant ()
Советы по использованию
Резюме
Контрольные вопросы
Упражнения по программированию

Глава 5. Операции, выражения и оператор
Начальные сведения о циклах
Основные операции
ОпераТОР присваивания: =
Операция сложения: +
Операция вычитания: -
Операции изменения знака: — и +
Операция умножения: *
Операция деления: /
Порядок выполнения операций
Приоритет операций и порядок вычислений
Некоторые дополнительные операции
Операция sizeof
Операция деления по модулю: %
Операции приращения и уменьшения: ++ и —
Операция уменьшения: -
Приоритет операций
Не будьте слишком самоуверенными
Выражения и операторы
Выражения
Операторы
Составные операторы (блоки)
Преобразования типов
Операция приведения
Функции и аргументы
Объявление функций и заголовки в языке K&R C
Пример программы
Резюме
Контрольные вопросы
Упражнения по программированию

Глава 6. Управляющие операторы языка С: циклы
Пример для начала
Комментарии к программе
Цикл считывания в стиле языка С
Оператор while
Прерывание выполнения цикла while
Когда прекращается выполнение цикла
Оператор while: цикл с предусловием
Синтаксические особенности
Использование операций отношений и выражений
Что такое истина?
Что еще может быть истиной?
Осложнения с понятием "истина"
Приоритеты операций отношения
Неопределенные циклы и циклы со счетчиком
Цикл for
Использование цикла for для большей гибкости!
Дополнительные операторы присваивания: +=, -=, *=, /=, %=
Операция запятая
Греческий философ Зенон и цикл for
Цикл с постусловием: do while
Какой цикл следует выбрать?
Вложенные циклы
Обсуждение
Вариации вложенного цикла
Массивы
Использование цикла for при работе с массивами
Пример цикла, использующего возвращение значения функции
Обсуждение программы
Использование функций с возвращаемым значением
Резюме
Контрольные вопросы
Упражнения по программированию

Глава 7. Управляющие операторы языка С: ветвление и безусловные переходы
Оператор if
Основные сведения об операторе if
Добавление else в оператор if
Еще один пример: знакомство с функциями getchar() и putchar()
Семейство символьных функций из файла ctype.h
Многократный выбор: оператор else if
Объединение else и if в пары
Больше вложений операторов if
Давайте будем логичными
Приоритет операций
Порядок вычисления выражений
Диапазоны значений
Программа подсчета слов
Условная операция: ?
Дополнительные средства организации цикла: continue и break
Оператор continue
Оператор break
Множественный выбор: операторы switch и break
Как пользоваться оператором switch
Считывание только первого символа строки
Множественные метки
Операторы switch и конструкция if else
Оператор goto
Избегайте использования оператора goto
Резюме
Контрольные вопросы
Упражнения по программированию

Глава 8. Символьный ввод/вывод и перенаправление
Односимвольные функции ввода/вывода: getchar() и putchar()
Буферы
Прерывание ввода с клавиатуры
Файлы, потоки и ввод с клавиатуры
Конец файла
Перенаправление и файлы
Перенаправление в системах UNIX и DOS
Графический пример
Создание дружественного интерфейса пользователя
Работа с буферизованным вводом
Комбинированный символьно-числовой ввод
Символьные эскизы
Анализ программы
Организация меню
Задачи
Обеспечение бесперебойного выполнения
Комбинированный символьно-числовой ввод
Резюме
Контрольные вопросы
Упражнения по программированию

Глава 9. Функции
Введение
Создание и использование простой функции
Аргументы функции
Определение функции, имеющей аргумент: формальные аргументы
Объявление прототипа функции, имеющей аргументы
Вызов функции, содержащей аргумент: фактические аргументы
Представление в виде черного ящика
Возвращение значения функции с помощью оператора return
Типы функций
Прототипирование функций ANSI С
Проблема
Решение ANSI
Отсутствующие аргументы и неопределенные аргументы
Рекурсия
Рекурсия в действии
Основы рекурсии
Хвостовая рекурсия
Рекурсия и обратный порядок
Все функции языка С равноправны
Компиляция программ, содержащих две и более функции
UNIX
Linux
Компиляторы командной строки DOS
Компиляторы Windows и Macintosh
Использование заголовных файлов
Определение адресов: операция &
Изменение переменных в вызывающей функции
Указатели: первое знакомство
Оператор косвенной адресации: *
Объявление указателей
Использование указателей для обмена данными между функциями
Резюме
Контрольные вопросы
Упражнения по программированию

Глава 10. Массивы и указатели
Массивы
Инициализация и классы памяти
Присвоение значений элементам массива
Указатели на массивы
Функции, массивы и указатели
Массив имен в качестве аргументов
Использование указателей в качестве аргументов
Комментарии: указатели и массивы
Операции с указателями
Защита содержимого массивов
Использования ключевого слова const применительно к формальным параметрам
Дополнительные сведения о ключевом слове const
Многомерные массивы
Инициализация двумерного массива
Дополнительные измерения
Указатели и многомерные массивы
Функции и многомерные массивы
Планирование программы
Общий план
Функция read_array()
Функция show_array()
функция mean()
Результат
Резюме
Контрольные вопросы
Упражнения по программированию

Глава 11. Символьные строки и строковые функции
Определение строк внутри программы
Константы символьных строк
Массивы символьных строк и инициализация
Сравнение представлений в форме массива и указателя
Явное указание размера массива
Массивы символьных строк
Указатели и строки
Ввод строк
Создание области хранения
Функция gets()
Функция fgets()
Функция scanf()
Вывод строк
Функция puts()
Функция fputs()
функция printf()
Возможность создания собственных функций
Строковые функции
Функция strlen()
Функции strcat() и strncat()
Функции strcmp() и stmcmp()
Функции strcpy() и stmcpy()
Функция sprintf()
Прочие строковые функции
Пример обработки строк: сортировка строк
Сортировка
Символьные функции и строки семейства ctype.h
Аргументы командной строки
Аргументы командной строки в интегрированных средах
Аргументы командной строки в среде Macintosh
Преобразования строк в цифры
Резюме
Контрольные вопросы
Упражнения по программированию

Глава 12. Файловый ввод/вывод
Взаимодействие с файлами
Что такое файл?
Уровни ввода/вывода
Стандартные файлы
Стандартный ввод/вывод
Проверка аргументов командной строки
Функция fopen()
Функции getc() и putc()
Функция fclose()
Стандартные файлы
Простая программа сжатия файлов
Файловый ввод/вывод: fprintf(), fscanf(), fgets() и fputs()
Функции fprintf() и fscanf()
Функции fgets() и fputs()
Реализация произвольного доступа: fseek() и ftell()
Как работают функции fseek() и ftell()?
Двоичный и текстовый режимы
Переносимость
Функции fgetpos() и fsetpos()
За кулисами стандартного ввода/вивода
Другие функции стандартного ввода/вывода
Функция int ungetc(int с, FILE *fp)
Функция int fflush(FILE *fp)
Функция int setvbuf(FILE *fp, char *buf, int mode, size_t size)
Двоичный ввод/вывод: функции •fread() и fwrite()
Функция size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *fp)
Функция size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp)
Функции int feof(FILE *fp) и int ferror(FILE *fp)
Пример
Произвольный доступ с помощью двоичного ввода/вывода
Резюме
Контрольные вопросы
Упражнения по программированию

Глава 13. Классы памяти разработка программ
Классы памяти и область видимости
Область видимости, связывание и продолжительность хранения
Автоматические переменные
Внешние переменные
Определения и объявления
Статические переменные
Внешние статические переменные
Программы, использующие несколько файлов
Область видимости и функции
Переменные регистра
Какой класс памяти выбрать?
Функция генерации случайных чисел
Игра в кости
Сортировка чисел
Глобальные решения
Чтение числовых данных
Функция getarray()
Сортировка данных
Печать данных
Результаты
Комментарии
Классификаторы типов ANSI С
Классификатор типа const
Классификатор типа volatile
Резюме
Контрольные вопросы
Упражнения по программированию

Глава 14. Структуры и другие формы данных
Задача: создание описи книг
Объявление структуры
Определение переменных структуры
Инициализация структуры
Доступ к элементам структуры
Массивы структур
Объявление массива структур
Идентификация элементов массива структур
Анализ программы
Вложенные структуры
Указатели на структуры
Объявление и инициализация указателя структуры
Доступ к элементам структуры с помощью указателя
Передача функциям информации о структурах
Передача элементов структуры
Использование адреса структуры
Передача структуры в качестве аргумента
Новые возможности структур
Выбор между структурами и указателями на них
Выбор между массивами символов и указателями на символы в структуре
Функции, использующие массив структур
Сохранение содержимого структуры в файле
Анализ программы
Структуры: что дальше?
Краткий обзор соединений
Краткий обзор функции typedef
Эффектные объявления
Функции и указатели
Резюме
Контрольные вопросы
Упражнения по программированию

Глава 15. Дополнительные сведения о битах
Двоичные числа, биты и байты
Двоичные целые числа
Целые числа со знаком
Двоичная система с плавающей точкой
Системы счисления с другими основаниями
Восьмеричная система счисления
Шестнадцатиричная система счисления
Побитовые операции языка С
Побитовые логические операции
Применение: маски
Применение; переключение битов в положение ON
Применение: отключение битов
Применение: переключение битов
Применение: проверка значения бита
Операции побитового смещения
Программный пример
Другой программный пример
Поля битов
Пример поля битов
Поля битов и побитовые операторы
Резюме
Контрольные вопросы
Упражнения по программированию

Глава 16. Препроцессор С и библиотека С
Именованные константы: #define
Символы
Переопределение констант
Использование аргументов для #define
Включение в строку макроаргумента
Макрос или функция?
Включение файлов: #include
Заголовочные файлы: пример
Использование заголовочных файлов
Другие директивы
Директива #undef
Условная компиляция
Перечислимые типы
Константы enum
Значения, принятые по умолчанию
Присвоенные значения
Использование
Библиотека С
Получение доступа к библиотеке С
Использование описаний библиотеки
Библиотека математических функций
Библиотека утилит общего назначения
Функции exit() и atexit()
Распределение памяти: malloc() и free()
Функция саllос()
Классы памяти и динамическое распределение памяти
Функция qsort()
Библиотека для хранения утверждений
Резюме
Контрольные вопросы
Упражнения по программированию

Глава 17. Расширенное представление данных
Исследование представления данных
От массива к связанному списку
Использование связанного списка
Создание списка
Запоздалые соображения
Абстрактные типы данных (ADT)
Получение абстрактного типа
Создание интерфейса
Использование интерфейса
Реализация интерфейса
Реализация очереди с помощью ADT
Реализация интерфейса представления данных
Тестирование очереди
Имитация реальных ситуаций с помощью очереди
Сравнение связанного списка с массивом
Деревья двоичного поиска
ADT двоичного дерева
Интерфейс дерева двоичного поиска
Реализация двоичного дерева
Проверка дерева
Размышления по поводу дерева
Другие направления
Резюме
Контрольные вопросы
Упражнения по программированию

Приложение А. Дополнительная литература
Язык С
Программирование
Ссылки

Приложение В. Операторы и операции в языке С
Арифметические операции
Операции отношений
Выражения отношений
Операторы присваивания
Пример
Логические операции
Логические выражения
Порядок оценки логических выражений
Примеры
Условный оператор
Примеры
Операции, связанные с указателями
Пример
Операции изменения знака
Операции над структурами и объединениями
Операция принадлежности
Пример
Операция косвенной принадлежности (или указатель на структуру)
Пример
Побитовые операции
Примеры
Дополнительные операции
Пример

Приложение С. Основные типы данных и классы памяти
Обзор: основные типы данных
Ключевые слова
Целые числа со знаком
Целые числа без знака
Символы
Числа с плавающей точкой
Резюме: как определить простую переменную
Резюме: описатели
Ключевые слова
Общие замечания
Свойства

Приложение D. Выражения, операторы и контроль выполнения программы
Резюме: выражения и операторы
Выражения
Операторы
Резюме: оператор while
Ключевое слово
Общие замечания
Форма
Примеры
Резюме: оператор for
Ключевое слово
Общие замечания
Форма
Пример
Резюме: оператор do while
Ключевые слова
Общие замечания
Форма
Пример
Резюме: использование оператора if для выбора вариантов
Ключевые слова
Общие замечания
Форма 1
Форма 2
Форма 3
Пример
Резюме: многовариантный выбор с помощью switch
Ключевое слово
Общие замечания
Форма
Примеры
Резюме: переходы в программе
Ключевые слова
Общие замечания
Команда break
Команда continue
Команда goto

Приложение Е. Таблица кодов ASCII

Приложение F. Библиотека С стандарта ANSI
Диагностика: assert.h
Обработка символов: ctype.h
Локализация: locale.h
Математическая библиотека: math.h
Нелокальные переходы: setjmp.h
Обработка сигналов: signal.h
Переменные аргументы: stdarg.h
Стандартная библиотека ввода/вывода: stdio.h 396
Общие утилиты: stdlib.h
Обработка строковых величин: string.h
Дата и время: time.h

Приложение G. Различия между языками С и C++
Объявления
Прототипы функций
Определения функций
Комментарии
Константы char
Модификатор const
Структуры и объединения
Перечисления
Управление типами указателей

Приложение H. Комитет С9Х
Типы
Новые типы
Расширение целых чисел: перносимые типы
Усовершенствованные вычислительные средства поддержки
Заголовочный файл fenv.h
Дополнения к библиотеке math.h
Поддержка комплексных чисел
Ключевое слово restrict
Поддержка расширенных наборов символов

Приложение I. Ответы на контрольные вопросы