
информатика_2 / Программирование_С
.pdfМинистерство образования и науки Российской Федерации Федеральное агентство по образованию Южно-Уральский государственный университет Кафедра информатики
681.3.06(07) К647
Е.А. Конова, Г.А. Поллак, А.М. Ткачев
Основы программирования на языке C
Учебное пособие
Под редакцией А.М. Ткачева
Челябинск Издательство ЮУрГУ
2005
УДК [681.3.06:519.6](075.8)
Конова Е.А., Поллак Г.А., Ткачев А.М. Основы программирования на языке C: Учебное пособие. — Челябинск: Изд-во ЮУрГУ, 2005. — 251 с.
Пособие является попыткой изложения в простой и доступной форме принципов, лежащих в основе современного подхода к разработке сложных программных продуктов, а также применению этих принципов при программировании на языке С.
Материал пособия основывается на лекциях, читанных авторами в течение ряда лет на факультетах ЮУрГУ, и включает множество примеров — как оригинальных, так и взятых из популярных книг по программированию (в том числе являющихся библиографической редкостью).
Пособие предназначено в основном студентам первого курса специальности "Прикладная информатика в экономике", а также других "программирующих" специальностей и может рассматриваться как база для установочного курса по программированию, имеющего целью развитие правильных навыков у начинающего программиста.
Для чтения пособия не требуется каких-либо предварительных знаний, поэтому можно использовать его для изучения основ программирования в специализированных школах, колледжах и лицеях, начиная с седьмых–восьмых классов, атакжедля самостоятельногообучения.
Ил. 38, табл. 9, список лит. — 36 назв.
Одобрено учебно-методической комиссией факультета экономики и управления ЮУрГУ.
Рецензенты: И.А. Прохорова, В.И. Тумашов.
©Конова Е.А., Поллак Г.А., Ткачев А.М., 2005
`© Издательство ЮУрГУ, 2005
2
ПРЕДИСЛОВИЕ
Язык C является тем корнем, из которого выросли такие языки, как C++, Java, PHP и так далее. Поэтому человек, решивший стать профессиональным программистом, не может обойтись без базовых знаний языка C.
Программы представляют собой конкретные формулировки алгоритмов, основанные на определенном представлении структур данных. По меткому определению Н. Вирта [5]:
Алгоритм + Структуры данных = Программа.
Перефразируя, можно сказать, что программы представляют собой конкретные формулировки абстрактных алгоритмов, основанные на конкретных представлениях данных.
Любой язык программирования требует определять тип и структуру данных — представление данных. Обычно в языке имеются стандартные типы данных, которые называют базовыми типами. Однако же любой профессиональный язык программирования (каковым несомненно является язык С) должен располагать методами структурирования данных, что позволяет программисту конструировать новые сложные типы данных, отталкиваясь от базовых.
Цель настоящего пособия — помочь студентам освоить методы структурирования данных и научиться использовать эти структуры при решении практических задач. В пособии вводятся абстрактные концепции и показывается, каким образом они могут быть реализованы на языке С. В пособии использован многолетний опыт, накопленный авторами как при чтении лекций по структурам данных, так и в практической деятельности.
Впервой главе пособия рассматриваются общие вопросы программирования на языке C — основные операции, предложения и синтаксис языка, а также встроенные структуры данных. Часть конструкций относится к C++.
Вторая глава посвящена конструируемым структурам данных. Это статические, а также динамические структуры данных, такие как списковые структуры, двоичные деревья.
Втретьей главе описаны прикладные алгоритмы на структурах данных. Большое внимание уделяется рекурсии. Подробно рассмотрены различные виды сортировок: сортировки включениями, выбором и обменные сортировки. Для каждого типа сортировок приведены улучшенные алгоритмы. Показана реализация различных видов сортировок на языке С. Здесь же обсуждаются проблемы поиска информации.
Изложение материала всех глав сопровождается примерами программ на языке C. Все приведенные в книге программы проверены на работоспособность авторами.
Некоторые замечания по оформлению текста книги. Примеры разделяются на три основных типа.
3
Первый —это полный текст программы, и в этом случае перед началом текста программы присутствует пустая строка.
Второй — фрагмент программы (несколько) строк или псевдокод алгоритма, в этом случае пустой строки нет.
Наконец, пример может быть одной — двумя строками (как правило, это иллюстрации к конструкциям языка). Пустой строки нет.
Следует иметь в виду, что везде в книге правила языка C превалируют над правилами русского языка, поэтому часты, например, ситуации, когда предложение C завершается знаком «;», однако следующий абзац начинается с прописной буквы.
Широко применяются комментарии, которые в соответствии с традицией начинаются со строчной буквы и не имеют знака препинания в конце — за исключением случаев, когда длинный комментарий размещается на двух или более строках.
Взаключение приведем краткий обзор рекомендуемой литературы. Заметим, что многие книги являются библиографической редкостью, однако знать об их существовании полезно.
Книги [1–4] посвящены принципам проектирования и разработки программного обеспечения и могут быть весьма полезны при создании больших программных комплексов.
Книги [5–12] предлагают подходы, основанные на использовании структур данных и многих популярных алгоритмов.
Вкнигах [13–15] делаются попытки построить теорию корректного программирования — например, способы доказательства правильности алгоритмов
Вкнигах [16–19] обсуждаются вопросы создания надежного программного обеспечения.
Наконец, книги [5–12] являются учебниками по языкам С и С++, а книги [30– 36] — это сборники задач.
4

1.ОСНОВЫ ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ C
1.1.Предварительные сведения о разработке программ
1.1.1. Алгоритм, программа, формальные языки
Определение. Алгоритм (программа) — последовательность инструкций компьютеру, которые управляют его работой по обработке данных.
В этом определении подчеркнуты две особые черты алгоритма:
Назначение алгоритма: обработка данных, какое-либо их изменение. Данные могут быть различных типов, например, текстовые, числовые, графические и прочие.
Механизм алгоритма: обработка данных выполняется именно так, как управляет этим процессом программа, что и составляет главный принцип работы компьютера — принцип программного управления.
Укрупненная схема соотношения программы и обрабатываемых ею данных приведена на рис. 1.1.
ПРОГРАММА ДАННЫЕ
ОЗУ
Рис. 1.1. Укрупненная схема соотношения программы и данных
В процессе выполнения сама программа (или ее часть), и данные (или их часть) находятся в оперативной памяти компьютера (ОЗУ).
Требования к программе (алгоритму).
Детерминированность. Это точное, однозначное толкование любого шага алгоритма, отсутствие таких пунктов, которые могут быть поняты двояко.
Результативность. Это свойство позволяет получить результат в любом случае, независимо от данных. Предполагает отсутствие тупиков: из любой нестандартной ситуации, возникшей при выполнении алгоритма, должен быть выход. Для данных, для которых нет решения, например, деление на 0, предусматривается особый код алгоритма, пишутся обработчики ошибок, разрабатываются интерфейсные средства, которые позволят выбрать обходной маневр, изменить процесс, задать новые данные и прочее.
5
Массовость. Это решение некоторого класса задач. Например, решение одного уравнения, это не алгоритмическая, а математическая задача, а решение в общем виде линейных или квадратичных уравнений, это алгоритмы.
Помимо этих требований, программа должна иметь удобный (дружественный) интерфейс, такое человеческое лицо. Требования хорошего интерфейса означают, что используются меню, мышь, окна диалога, справочная система, контекстные меню и т.д. Современные информационные технологии в полной мере обладают такими свойствами.
Большинство современных программ — это программы, управляемые событиями. К событиям относятся любое управляющее воздействие извне. Со стороны человека, сидящего за компьютером, происходит событие путем нажатия клавиш на клавиатуре или кнопок мыши, в ответ на это компьютер выполняет действие.
Определение. Программа — это алгоритм, записанный на каком-либо алгоритмическом языке (формальном языке).
Можно сказать, что язык программирования, это инструмент для создания программ. С++ — алгоритмический язык. Относится к категории формальных языков, которые разработаны специально для укрупненного описания алгоритмов или задач. Написание программ на машинно-ориентированном языке (например, ассемблере) процесс достаточно сложный. Он требует точности и занимает много времени. Использование языков программирования во много раз упрощает и ускоряет написание программ.
Сами языки входят в состав интегрированных сред разработчика (оболочек), которые позволяют программировать надежнее и быстрее. Например, интегрированная среда разработчика Turbo Pascal использует язык Pascal, среда Воrland C использует язык С++, среды Quick Basic, Turbo Basic используют язык
Basic.
Впоследнее время наибольшей популярностью пользуются среды визуальной разработки приложений, главной составляющей которых также являются языки программирования, например Delphi использует язык Pascal, C++ Вuilder и Visual C++ используют язык С++, Visual Basic использует язык Basic.
Всостав любой интегрированной среды разработчика входят, по меньшей мере, девять ниже перечисленных составляющих.
Язык программирования. Это ядро интегрированной среды, все последующие являются его оболочкой.
Редактор кода (Edit). Это обычный текстовый редактор, который имеет все средства редактирования текста, и используется для ввода и редактирования текстов программ.
Компилятор (Compile). Выполняет перевод с формального языка в машинный язык.
Компоновщик (Linker). Собирает программу пользователя из отдельных составляющих и библиотечных программ, строит выполнимый код.
Отладчик кода (Debugger). Это средство работает на всех этапах выполнения программы. Позволяет обнаружить ошибки программиста.
6

Справочная система (Help). Как правило, достаточно разветвлена, позволяет получить помощь и по средствам собственно языка программирования, и по работе в оболочке, и по ошибкам программиста.
Менеджер файлов. Используется для выполнения обычных файловых операций над файлами текстов программ и файлами данных.
Менеджер проектов. Используется для объединения многих файлов программы в единое целое (Project).
Исходный текст программы имя.срр
Препроцессор
Полный текст программы имя.срр
Включаемые файлы имя.h
Компилятор
Объектный код программы имя.obj
Компоновщик |
Библиотечные файлы |
|
|
Исполняемый модуль имя.exe
Рис. 1.2. Схема выполнения задачи в интегрированной среде разработки C
Средства настройки среды и ее составляющих (Options). Схема прохождения задачи в интегрированной среде разработки С приведена на рисунке 1.2.
Вдвойной рамке показаны тексты, обрабатываемые в интегрированной среде,
водинарной рамке — модули их обработки, которые входят в состав интегрированной среды. Исходный текст программы на С — это текстовый файл (один или несколько). Три обязательные этапа обработки текста программы — это препроцессорное преобразование, компиляция и компоновка. Задачей препроцессора является преобразование текста программы до ее компиляции. Препроцессор сканирует текст, находит в нем команды, называемые директивами препроцессора, и выполняет их. В результате происходят изменения в исходном
7
тексте, вставки фрагментов текста и замена некоторых его фрагментов. Полученный текст называется полным текстом программы.
Далее этот текст проходит этап компиляции, на котором исходный код преобразуется во внутреннее машинное представление, некоторую последовательность команд, которая уже понятна компьютеру.
На этапе компоновки происходит редактирование связей и сборка исполнимого текста программы. Компоновщик обрабатывает все вызовы библиотечных функций и выполняет их подключение. Таким образом, к компилированному исходному коду добавляются необходимые функции стандартных библиотек. Готовый код является исполнимым и может быть выполнен компьютером при его запуске.
Языки программирования, и C в их числе, относятся к формальным языкам, задачей которых является описание алгоритмов и функций, выполняемых компьютером. Проведем аналогию изобразительных средств естественных языков и формальных.
В естественном языке (русском, английском) схема построения его конструкций примерно такова, как на рис. 1.3.
алфавит |
слова |
предложения |
тексты |
произведения |
Набор |
Используются |
Добавлены |
Добавлено |
Добавлены |
неделимых |
правила |
знаки |
деление на |
составляющие |
символов |
грамматики. |
препинания. |
разделы |
структуры |
для |
|
Используются |
(абзац, |
(глава, том). |
построения |
|
правила |
параграф). |
|
конструкций |
|
орфографии, |
Используются |
|
языка. |
|
пунктуации. |
правила. |
|
Рис. 1.3. Попытка разложить на составляющие изобразительные средства естественного языка
Естественные языки отличает богатство правил и изобразительных средств, поэтому написание программ на естественном языке невозможно.
В формальном языке (языке программирования) схема построения его конструкций примерно такова, как на рис. 1.4.
Формальные языки отличает скудость синтаксических правил и небольшой набор изобразительных средств, соответственно целям этих языков.
Система правил алгоритмического языка намного беднее систем правил естественных языков. В ее состав входят только две группы:
синтаксис — формальный набор правил, определяющий способ построения любых конструкций языка,
семантика — множество правил, определяющих смысл синтаксических конструкций.
8
алфавит |
лексемы |
|
операторы |
программы |
|
||
(выражения) |
(инструкции) |
(блоки, функции) |
|||||
Входят |
все |
Имеют |
смысл |
Имеют |
смысл |
Имеют смысл текста. |
|
символы |
слов. Строятся по |
предложений. |
Делятся |
на |
|||
языка, |
в том |
определенным |
Описывают |
один |
структурные |
|
|
числе, знаки. |
правилам. |
|
шаг алгоритма. |
составляющие, |
|
||
|
|
|
|
|
|
описывающие |
|
самостоятельные алгоритмы.
Рис 1.4. Попытка разложить на составляющие изобразительные средства формального языка
1.2. Начальные сведения о языке модульного программирования C
К базовым понятиям языка С относятся понятия об алфавите, правилах построения лексем и операторов языка, однако чтобы писать хорошие программы, нужно отчетливо представлять себе механизмы С, поэтому в изложении мы отойдем от предложенной схемы.
1.2.1. Алфавит языка С и лексемы
Алфавит языка содержит четыре группы символов.
Буквы. Разрешается использовать буквы латинского алфавита, прописные
(A..Z) и строчные (a..z).
Русские буквы не входят в алфавит, но используются в комментариях и текстовых константах, то есть там, где они не влияют на смысл программы.
Цифры. Используются арабские цифры 0, 1, .. 9.
Специальные символы. Они могут быть разделены на подгруппы: знаки препинания (разделители): , ; . : ;
знаки операций: + – * / % & | ? ! < = > ;
парные скобки: [ ] { } ( ) " " ' ' прочие символы: _ # ~ ^ .
Невидимые символы. Они могут считаться разделителями, их особенность в том, что символы существуют (каждый имеет код), но в редакторе не видны. Это такие символы как пробел, табуляция, разделитель строк. Их общее название — обобщенные пробельные символы.
Лексемы — это единицы текста (конструкция, слово), воспринимаемые компилятором как единое неделимое целое. Можно выделить пять классов лексем.
9
Имена (идентификаторы) для именования произвольных объектов программы,
например, x1, Alpha, My_file.
Служебные (ключевые) слова, обозначающие конструкции языка (имена операторов), например, for, while, do.
Константы, например, 1, 12.5, "Василий". Операции (знаки операций), например, ++, >=, !=, >>.
Разделители (знаки пунктуации), например, [ ], ( ), { }.
1.2.2. Основные понятия языка
Определение. Данные — все, что подлежит обработке с помощью программы. Классификация данных может быть выполнена по нескольким категориям. По типу. На первом уровне типы данных можно разделить на базовые, то есть
такие, правила организации которых предопределены реализацией языка, и конструируемые, то есть те, которые пользователь строит по определенным правилам для конкретной задачи.
По способу организации. Для каждого из простых (базовых) типов каждое данное может быть неизменяемым или изменяемым. По способу организации данные делятся на два класса.
Константа — данное, которое не меняет своего значения при выполнении программы и присутствует в тексте программы явным образом. Тип константы определен ее записью.
Переменная — данное, которое изменяется при выполнении программы, и в тексте присутствует своим именем (идентификатор). Тип переменной объявляетс в тексте программы.
1.2.3. Константы в языке С
Итак, константа представляет значение, которое не может быть изменено. Константы обладают типом, и тип определяется записью константы. Синтаксис языка выделяет пять типов констант: целые, действительные (вещественные) символьные, перечислимые, нулевой указатель.
1.2.3.1.Целые константы
Синтаксис языка позволяет использовать константы трех систем счисления: десятичные, восьмеричные, шестнадцатеричные. Основание определяется префиксом в записи константы. По умолчанию основание 10, префикс 0 предваряет восьмеричную константу, префикс 0х или 0Х предваряет шестнадцатеричную константу. В остальном, запись целых констант соответствует общепринятой, примеры записи целых констант приведены в таблице 1.1.
10