С Fundamentals
.pdfА.А. Мелещенко
Основы программирования на языке С / Учебное пособие
2-е издание.
Содержание |
|
Предисловие............................................................................ |
5 |
1. Основные конструкции..................................................... |
6 |
Анатомия С-программы................................................................................. |
6 |
Функция main()............................................................................................. |
7 |
Сообщения об ошибках ............................................................................... |
8 |
Заголовочные файлы.................................................................................... |
9 |
Комментарии.............................................................................................. |
10 |
Переменные и типы переменных................................................................. |
11 |
Ключевые слова ......................................................................................... |
13 |
Идентификаторы ........................................................................................ |
13 |
Целые типы................................................................................................. |
14 |
Типы данных с плавающей запятой.......................................................... |
18 |
Символьные типы ...................................................................................... |
21 |
Размеры переменных ................................................................................. |
23 |
Преобразование типов ............................................................................... |
24 |
Символические константы........................................................................... |
26 |
Перечисления................................................................................................ |
28 |
Операторы..................................................................................................... |
29 |
Арифметические операторы...................................................................... |
29 |
Операторы отношений............................................................................... |
31 |
Логические операторы............................................................................... |
31 |
Оператор отрицания................................................................................... |
32 |
Операторы инкремента и декремента....................................................... |
32 |
Оператор присваивания ............................................................................. |
33 |
Оператор if.................................................................................................. |
34 |
Оператор else .............................................................................................. |
35 |
Условные выражения................................................................................. |
37 |
Оператор switch .......................................................................................... |
37 |
Оператор while............................................................................................ |
40 |
© Кафедра информатики БГУИР. Мелещенко А.А. |
1 |
Оператор do-while ...................................................................................... |
41 |
Оператор for................................................................................................ |
42 |
Оператор break ........................................................................................... |
43 |
Оператор continue....................................................................................... |
45 |
Оператор goto ............................................................................................. |
46 |
Резюме........................................................................................................... |
47 |
Обзор функций ............................................................................................. |
48 |
2. Функции............................................................................. |
52 |
Нисходящее программирование.................................................................. |
52 |
Функции, возвращающие пустоту............................................................... |
53 |
Локальные и глобальные переменные ........................................................ |
56 |
Область видимости переменных ............................................................... |
56 |
Рекомендации по использованию переменных ........................................ |
59 |
Функции, возвращающие значение............................................................. |
60 |
Целые функции .......................................................................................... |
60 |
Функции с плавающей запятой ................................................................. |
62 |
Другие типы функций................................................................................ |
66 |
Распространенные ошибки в функциях ...................................................... |
66 |
Параметры и аргументы функций ............................................................... |
67 |
Безымянные параметры ............................................................................. |
72 |
Рекурсия........................................................................................................ |
73 |
Математические функции............................................................................ |
75 |
Резюме........................................................................................................... |
75 |
Обзор функций ............................................................................................. |
76 |
3. Массивы и указатели....................................................... |
79 |
Введение в массивы...................................................................................... |
79 |
Инициализация массивов........................................................................... |
80 |
Использование sizeof с массивами ............................................................ |
86 |
Использование массивов констант............................................................ |
86 |
Символьные массивы................................................................................. |
86 |
Многомерные массивы................................................................................. |
87 |
Двухмерные массивы................................................................................. |
87 |
Трехмерные массивы ................................................................................. |
87 |
Инициализация многомерных массивов................................................... |
88 |
Передача массивов функциям...................................................................... |
92 |
Передача многомерных массивов функциям ........................................... |
93 |
Введение в указатели ................................................................................... |
95 |
Объявление и разыменование указателей................................................. |
95 |
Указатели в качестве псевдонимов ........................................................... |
96 |
Нулевые указатели..................................................................................... |
97 |
Указатели типа void ................................................................................... |
98 |
Указатели и функции ................................................................................... |
99 |
Указатели и динамические переменные.................................................... |
100 |
© Кафедра информатики БГУИР. Мелещенко А.А. |
2 |
Резервирование памяти в куче ................................................................ |
100 |
Удаление памяти в куче........................................................................... |
101 |
Указатели и массивы.................................................................................. |
102 |
Динамические массивы............................................................................ |
104 |
Сортировка и поиск данных....................................................................... |
106 |
Выбор метода сортировки ....................................................................... |
110 |
Линейный и бинарный поиск .................................................................. |
110 |
Резюме......................................................................................................... |
113 |
Обзор функций ........................................................................................... |
115 |
4. Строки.............................................................................. |
117 |
Что такое строка ......................................................................................... |
117 |
Строковые литералы ................................................................................ |
119 |
Строковые переменные............................................................................ |
120 |
Строковые указатели................................................................................ |
120 |
Нулевые строки и нулевые символы....................................................... |
121 |
Строковые функции ................................................................................... |
121 |
Отображение строк .................................................................................. |
122 |
Чтение строк............................................................................................. |
122 |
Преобразование строк в значения........................................................... |
123 |
Определение длины строк ....................................................................... |
124 |
Копирование строк................................................................................... |
125 |
Дублирование строк................................................................................. |
125 |
Сравнение строк....................................................................................... |
128 |
Конкатенация строк ................................................................................. |
130 |
Поиск элементов строк ............................................................................ |
132 |
Разложение строк на подстроки.............................................................. |
136 |
Резюме......................................................................................................... |
138 |
Обзор функций ........................................................................................... |
139 |
5. Структуры ....................................................................... |
143 |
Сравнивание и присваивание структур................................................... |
144 |
Инициализация структур......................................................................... |
144 |
Использование вложенных структур ...................................................... |
146 |
Структуры и функции ................................................................................ |
147 |
Структуры и массивы................................................................................. |
149 |
Массивы структур.................................................................................... |
149 |
Структуры с членами, являющимися массивами................................... |
150 |
Динамические структуры данных ............................................................. |
150 |
Самоссылочные структуры........................................................................ |
151 |
Cтеки......................................................................................................... |
151 |
Очереди..................................................................................................... |
156 |
Списки ...................................................................................................... |
159 |
Деревья ..................................................................................................... |
167 |
Резюме......................................................................................................... |
176 |
© Кафедра информатики БГУИР. Мелещенко А.А. |
3 |
6. Файлы и базы данных ................................................... |
178 |
Что такое файл? .......................................................................................... |
178 |
Текстовые файлы........................................................................................ |
179 |
Чтение в посимвольном режиме ............................................................. |
179 |
Чтение в построчном режиме.................................................................. |
181 |
Посимвольная запись............................................................................... |
182 |
Построчная запись ................................................................................... |
183 |
Функция printf() и родственные ей функции.......................................... |
183 |
Функция scanf() и родственные ей функции .......................................... |
185 |
Бинарные файлы......................................................................................... |
187 |
Обработка бинарных файлов................................................................... |
187 |
Файлы с последовательным доступом.................................................... |
188 |
Файлы с произвольным доступом........................................................... |
190 |
Программирование баз данных ................................................................. |
192 |
Проектирование баз данных.................................................................... |
193 |
Создание файла базы данных .................................................................. |
197 |
Добавление записей в базы данных ........................................................ |
198 |
Редактирование записей базы данных .................................................... |
199 |
Создание отчетов о содержимом базы данных ...................................... |
200 |
Резюме......................................................................................................... |
201 |
Обзор функций ........................................................................................... |
202 |
Приложение 1: Язык программирования С.................. |
206 |
Приложение 2: Таблицы кодов ASCII............................ |
210 |
Приложение 3: Рекомендуемая литература................... |
215 |
© Кафедра информатики БГУИР. Мелещенко А.А. |
4 |
Предисловие
Научиться программировать – непростое дело; в какой-то момент программирование может показаться вам утомительным и «неподъемным». Но его освоение принесет вам ни с чем не сравнимое удовлетворение, а кроме того, возможность стабильного заработка во взрослой части вашей жизни.
Это пособие – для тех, кто хочет научиться программировать на С. Последовательно и подробно рассматриваются основные конструкции языка, функции, указатели и массивы, строки, структуры и файлы. Большое внимание уделяется алгоритмам сортировки и поиска данных, разработке баз данных средствами языка С.
Основная цель пособия – научить основам программирования на С, поэтому некоторые элементы языка, например, бинарные операции, классы переменных, объединения, макросы – не рассматриваются. При необходимости обратитесь к приложению 3 «Рекомендуемая литература» для их самостоятельного изучения.
Хотелось бы выразить благодарность студентам, внесшим существенный вклад в эту работу:
Болбас Татьяне и Мазохе Ольге, которые помогли перевести материалы пособия в электронную форму;
Прудникову Михаилу, подготовившему материал, вошедший в главы 3
и 5;
Михасеву Артему и Сухинину Ивану, которые протестировали примеры программ, входящие в пособие, и устранили некоторые опечатки;
Сотрудники кафедры информатики В.Л. Балащенко и С.И. Сиротко консультировали меня во время работы над рукописью.
Нашли время прочесть рукопись перед ее сдачей в печать и внесли много ценных замечаний Карасик Е.А. и Зиссер Ю.А.
Самая большая благодарность – Тому Свану, американскому программисту, известному лектору, на работах которого основана большая часть материала пособия.
А. Мелещенко
© Кафедра информатики БГУИР. Мелещенко А.А. |
5 |
1. Основные конструкции
Анатомия С-программы
Лучший способ изучить язык программирования – это ввод, компилирование и запуск на выполнение листингов небольшого размера. Введите листинг 1.1 (исключая номера строк с двоеточиями слева), сохраните его под именем welcome.c, затем скомпилируйте и, наконец, выполните программу.
Листинг 1.1. welcome.c (пример простой программы на С)
1: #include <stdio.h> 2:
3:int main(void)
4:{
5:printf(″Welcome to C Programming!\n″);
6:return 0;
7:}
Рассмотрим, из чего состоит программа welcome.c.
Строка 1 – это директива включения. Имя директивы (#include – «включить») указывает компилятору на чтение текста из заданного файла. Используемый в листинге 1.1 включаемый файл stdio.h называется заголовочным и обычно имеет расширение “.h”. Файл stdio.h содержит различные, необходимые для вашей программы стандартные объявления, связанные с вводом и выводом.
Строка 2 – пустая. Пустые строки также выполняют свою роль в программировании, – например, помогают выделить ключевые разделы программ. Компилятор «не обращает внимания» на пустые строки.
Открывающая и закрывающая фигурные скобки в строках 4 и 7 образуют блок – группу элементов, с которой компилятор будет обращаться как с единым целым. Блок также называется составным оператором. Блок из листинга 1.1 содержит два оператора (строки 5 и 6). Операторы представляют собой действия, которые программа должна выполнить.
Первый оператор (строка 5) вызывает стандартную функцию форматированного вывода printf() (произносится принт-эф; функция объявлена в файле stdio.h), чтобы отобразить на экране строку заключенного в кавычки текста. Этот текст заканчивается управляющим символом ‘\n’, который обозначает переход на новую строку.
Строка 6 содержит оператор возврата return. Он завершает
выполнение программы и возвращает некоторое значение операционной системе. Обычно ненулевые значения свидетельствуют об ошибках, нулевые
– об успешном завершении программы.
© Кафедра информатики БГУИР. Мелещенко А.А. |
6 |
В этой короткой программе лишь одна строка 3 осталась без объяснения. В ней расположен один из самых важных элементов каждой С- программы – функция main(). Она заслуживает более пристального внимания.
Функция main()
Все С-программы начинаются одинаково: первый оператор содержит функцию, называемую main(). Именно с этой функции начинает выполняться любая скомпилированная С-программа, независимо от ее размера.
Листинг 1.2 представляет собой минимально полную С-программу. Несмотря на то что эта программа – «лилипут», она все-таки имеет функцию main().
Листинг 1.2. smallest.c (минимально возможная С-программа)
1:int main(void)
2:{
3:return 0;
4:}
Объявление функции начинается со слова int, которое указывает на то, что после запуска программа должна вернуть одно целое число (в данном примере – 0). В круглых скобках функции спряталось слово void («пустой») – это значит, что программа не получает никаких внешних данных.
За именем функции следует блок операторов (строки 2-4). Все, что находится внутри блока, принадлежит функции. В данном случае, у функции есть только один оператор return (строка 3), хотя их может быть и больше. Каждый оператор должен заканчиваться точкой с запятой (;), так что компилятор легко может найти их концы.
Введите листинг 1.2 и вместо обычной компиляции выполните следующие шаги.
1.Нажмите <F8> (если вы работаете в среде Borland C++) или <F10> (Visual C++) для компиляции и пошагового выполнения программы. По первому нажатию выделится заголовок main(). Программа замирает на старте, подобно гонщику, напряженно ожидающему зеленого света.
2.Нажмите <F8> снова. Выделится оператор return. Вы только что выполнили невидимую секцию, называемую кодом запуска. Код запуска программы выполняет различные инициализации, которые обычно нас мало интересуют.
3.Нажмите <F8> еще раз, чтобы выполнить оператор return. Сейчас
выделена последняя скобка и программа готова выполнить другую невидимую секцию, называемую кодом завершения.
4.Нажмите <F8> в последний раз, чтобы завершить программу.
© Кафедра информатики БГУИР. Мелещенко А.А. |
7 |
Сообщения об ошибках
Не удивляйтесь, если при написании и вводе текста программы вы делаете много ошибок. Программирование требует совершенства. Пропустите хотя бы один, казалось, незначительный символ – и компилятор запищит от недовольства.
Существует две категории «жалоб» компилятора.
∙Errors (Ошибки) означают серьезные ошибки, которые не позволяют запустить программу.
∙Warnings (Предупреждения) обращают ваше внимание на потенциальные проблемы, которые могут вызвать сбой в работе программы. Если вы получили от компилятора предупреждение, отнеситесь к нему со вниманием и ликвидируйте его причину как можно скорее.
Поскольку в ходе деятельности на ниве программирования вы, несомненно, будете допускать бесчисленное количество ошибок, сейчас будет полезно специально сделать несколько ошибок, чтобы знать, как исправлять их в дальнейшем. Скомпилируйте листинг 1.3, который содержит несколько грубых ошибок.
Листинг 1.3. bad.c (хорошая программа с большим количеством ошибок)
1: include <stdio.h) 2:
3:main{}
4:(
5:printf(″Problems...\n″);
6:printf(″Problems, problems\n);
7:printf(″Problems all day long!\n″)
8:)
Во время компиляции листинга компилятор сообщит вам, что программа bad.c имеет несколько ошибок:
Error bad.c 1: Declaration syntax error Error bad.c 6: ) expected
Error bad.c 6: Unterminated string or character constant
Каждое сообщение об ошибке содержит имя файла (что важно для многофайловых программ), номер строки и короткое объяснение. Как видите, проблемы гнездятся в строках 1 и 6. Теперь исправьте ошибки в указанных строках. Замените строку 1 на
#include <stdio.h>
Строка 6 упоминается сразу в двух сообщениях. Первое предполагает, что пропущена круглая скобка. Это понятно. Следующее сообщение
«Unterminated string or character constant» («Незаконченная строковая или символьная константа») говорит о том, что строка символов в операторе printf() осталась без заключающих кавычек. Замените строку 6 на
© Кафедра информатики БГУИР. Мелещенко А.А. |
8 |
printf(″Problems, problems\n″);
и скомпилируйте измененную программу. И снова компилятор открывает свою «жалобную книгу»:
Error bad.c 3: Declaration syntax error Error bad.c 6: ) expected
Error bad.c 7: ) expected
Теперь уже строка 3 попала в «черный список». Это обычное дело: вы исправляете одни ошибки и возникают другие. Постарайтесь исправить остальные ошибки самостоятельно. Листинг 1.4 демонстрирует правильную программу.
Листинг 1.4. good.c (исправленная версия bad.c)
1: #include <stdio.h> 2:
3:int main(void)
4:{
5:printf(″Problems...\n″);
6:printf(″Problems, problems\n″);
7:printf(″Problems all day long!\n″);
8:return 0;
9:}
Заголовочные файлы
Такие директивы, как #include <stdio.h>, дают указание компилятору включить текст заданного файла в вашу программу. Просмотрите файл stdio.h (его легко найти с помощью средств поиска на вашем компьютере).
При обработке директивы #include компилятор ищет заданные файлы в соответствии со следующими правилами:
∙если имя файла заключено в угловые скобки (#include <stdio.h>), компилятор осуществляет поиск в стандартных каталогах, заданных в настройках среды разработки программ;
∙если имя файла заключено в кавычки (#include “anyfile.h”), компилятор ищет файл в текущем каталоге;
∙если компилятор не может найти файл, имя которого заключено в кавычки, то он обращается с ним так, как будто его имя окружено угловыми скобками (другими словами, если файла “anyfile.h” нет в текущем каталоге, компилятор ищет его в стандартных каталогах);
∙при указании имен включаемых файлов регистр букв не имеет никакого значения. Все имена MyFile.H, MYFILE.H и myfile.h относятся к одному и тому же файлу. Сама же директива #include вводится на нижнем регистре (строчными буквами).
© Кафедра информатики БГУИР. Мелещенко А.А. |
9 |
Имена файлов могут включать и пути к ним, как, например, в директиве #include ″c:\mydir\myfile.h″. Имена каталогов отделяются обратной косой чертой.
Комментарии
Комментарии – это данные, предназначенные только для вас. Компилятор их полностью игнорирует. Цель комментариев – пояснить содержание программы.
Заключайте комментарии в двухсимвольные ограничители /* и */. Вот пример:
/* Моя первая программа */
Комментарии могут стоять в конце оператора:
printf(″Print this text″); /* отображение текста на экране */
Однако их нельзя ставить внутри текста, заключенного в кавычки, или внутри идентификаторов:
printf(″Not /* комментарий */″); |
/* ??? |
*/ |
int bad/* комментарий */Identifier; / *??? |
*/ |
Мы будем использовать комментарии /* ??? */ для обозначения неправильных конструкций или сомнительных действий. Приведенные выше две строки никуда не годятся.
Вы можете писать комментарии, которые занимают одну или несколько строк, используя одну пару ограничителей. Следующие три строки текста представляют собой один комментарий:
/*
**Программа: Моя вторая С-программа
**Дата: 12.09.2007
**Автор: имя
*/
Как и в случае однострочных комментариев, компилятор игнорирует весь текст, включая ограничители. Дополнительные звездочки здесь только для красоты оформления.
Отладка с комментариями
Комментарии часто бывают полезны для отладки отдельных фрагментов программы. Иногда, закомментировав один или два оператора и выполнив программу без них, можно выявить причину возникшей проблемы. Этот метод можно сравнить с ситуацией, когда воображаемый врач удаляет у пациента сердце и, убедившись, что тот остался больным, делает вывод, что с сердцем как раз было все в порядке (не следуйте этому примеру в жизни).
Замечание. Пользуйтесь комментариями умеренно. Хорошие программы удобочитаемы сами по себе, и вам следует привыкать к чтению программного кода, а не только комментариев. Используйте комментарии,
© Кафедра информатики БГУИР. Мелещенко А.А. |
10 |