Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

методички.C++ / С Fundamentals

.pdf
Скачиваний:
76
Добавлен:
24.02.2016
Размер:
1.38 Mб
Скачать

А.А. Мелещенко

Основы программирования на языке С / Учебное пособие

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

Соседние файлы в папке методички.C++