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

Изучаем Cи (2001) [rus]

.pdf
Скачиваний:
170
Добавлен:
16.08.2013
Размер:
3.13 Mб
Скачать

Содержание

Предисловие Глава 1. Введение в программирование

Программы

1

Ячейки и типы

4

Программирование и трансляторы

6

Первая программа на Си

9

Глава 2. Первые шаги

Turbo C — среда программирования

12

Связь с внешним миром

16

Простые вычисления

20

В чем преимущество программ

22

Массивы

26

Как это делается

34

Глава 3. Странные типы

Странные типы-1

42

Странные типы-2

45

Анатомия типов

47

Подбирайте выражения

53

Строки и символы

57

Указатели

62

Глава 4. Действия

Очередность

65

ii

Условности

68

Работа с указателями

72

Битовые операции

74

Функции

80

Функции с длинными руками

84

Рекурсия или «раз, два, три»

87

Глава 5. Функции, указатели, массивы

Функции и массивы

96

Массивы и указатели

98

Указатели и массивы

100

Динамические массивы

102

Копирование строк

105

Глава 6. Файлы

Падение железного занавеса

109

Массивы указателей

114

Указатели на указатели

120

Файлы — не массивы!

123

Открытие файла

126

Глава 7. Строки

Считалочка

131

Сортировка строк

136

Указатель на функцию

138

Имена функций и указатели

144

Функция Qsort

146

Иголка, сено и лыко в строку

151

iii

Глава 8. Основные типы на сборочном конвейере

Перечисления

157

Двухмерные массивы и указатели на…

163

Хранение и переработка двухмерных массивов

170

Записи

174

Записи и функции

178

Указатель на запись

182

Связанные записи

186

Typedef

191

Глава 9. Большие программы

Разделяй и властвуй

195

Extern или «Три поросенка»

199

Static

202

Глава 10. Макросы и переходы

Макросы

210

Управление текстом

215

Напутствие или GOTO

218

iv

Приложение А. Приоритеты и порядок

выполнения операторов

223

Что дальше?

224

Литература

225

Об авторе

226

v

Предисловие

Казалось бы, не так важно, какой язык программирования учить первым. Зная один язык, легко выучить любой другой. Но первый язык становится «родным» и для освоения других понадобятся лишние усилия. Так зачем же начинать с устаревшего Бейсика?

В этой книге делается попытка познакомить читателя с программированием на примере языка профессиональных программистов Си. Этот язык не только важен сам по себе, но и открывает дорогу к другим современным и очень популярным языкам, таким как C++, JAVA, PERL и JavaScript.

Язык Си считается трудным для изучения, и это отчасти так, если его учить после Бейсика, Фортрана или даже Паскаля. Но если Си станет первым изучаемым языком, все будет гораздо проще.

Пусть читателя не пугает, что после короткого введения (Глава 1 «Введение в программирование»), мы сразу перейдем к описанию среды программирования Turbo C (глава 2 «Первые шаги» ) и к простейшим программам на Си. Такой порядок изложения только облегчит его первые шаги. Уже в главе 3 «Странные типы» начинается знакомство с указателями — трудной, но крайне важной для понимания языка темой. Это знакомство углубляется на протяжении всей книги, и к ее концу указатели должны стать родными читателю, как становится родным язык, который окружал человека с детства.

Эта книга задумана и написана с целью рассказать пытливому читателю о самых трудных, самых принципиальных особенностях языка, что, конечно, не значит, что она не учит практическому программированию на Си. Книга построена на простых коротких примерах, которые помогут начать программировать уже с первых ее страниц.

Мне хотелось, чтобы эта книга стала одной из первых в длинном ряду других книг по программированию, операционным системам и алгоритмам, которые нужно прочитать, чтобы стать программистом-профессионалом. Насколько исполнилось это желание — судить читателю.

vi

Александр Крупник

krupnik@sandy.ru

http://www.piter.com/display.phtml?a_id=19312&web_ok=all

Нижний Новгород, 16 июля 2001 года.

vii

Глава 1. Введение в программирование

Программы

Чтобы научиться программировать, нужно понимать, как работает компьютер. А для этого совсем не обязательно изучать прохождение электрических сигналов по микросхемам. Достаточно вообразить ряд пронумерованных ячеек, в каждой из которых может храниться число или команда.

Представим себе маленького чумазого мальчика (назовем его процессором), который выполняет команды, хранящиеся в последовательно расположенных ячейках. Чтобы начать работу, мальчику необходимо знать, в какой ячейке хранится первая команда.

Предположим, что первая команда всегда хранится в одной и той же ячейке, например, под номером 37. Открывая ячейку (вообразим, что это ящичек с дверцей), мальчик достает оттуда лист бумаги, на котором записана команда: «поместить в ячейку 1 число 2». Выполнив первую команду (написав на клочке бумаги требуемое число и бросив его в первую ячейку), мальчик переходит к ячейке 38, где записана следующая команда: «поместить число 3 в ячейку 2». После ее выполнения в ячейке 2 оказывается число 3. Далее мальчик переходит к ячейке 39, где содержится команда посложнее: «прибавить к содержимому первой ячейки число из второй и поместить результат в ячейку номер 3». Чтобы выполнить эту команду, мальчику придется открыть первую и вторую ячейки, достать оттуда числа, сложить их и поместить результат (число 5) в третью ячейку. Выполнив эту команду, мальчик переходит к следующей, 40-й ячейке, где записана команда «СТОП». Увидев ее, он заканчивает работу и ждет. Команды и результаты их выполнения показаны в табл. 1.1.

1

Таблица 1.1. Простейшая программа и

результат ее

выполнения на каждом шаге

 

 

 

 

Ячейка

Команда

Ячейки

 

 

памяти

 

 

 

 

 

1-? 2-? 3-?

 

 

 

37

Поместить в ячейку 1 число 2

1-2 2-? 3-?

 

 

 

38

Поместить в ячейку 2 число 3

1-2 2-3 3-?

 

 

 

39

Сложить содержимое ячеек 1 и 2,

1-2 2-3 3-5

 

результат записать в ячейку 3

 

 

 

 

40

СТОП

 

 

 

 

Только что выполненная мальчиком последовательность действий, называется программой. И хотя ее результат — сумма двух чисел — смехотворен, в ней есть многое из того, что необходимо знать начинающему программисту. Становится, например, понятно, что программы и данные хранятся в одной и той же памяти (последовательности ячеек). Чтобы их различать, нужно заранее знать, где начинается программа и где можно хранить данные. Нельзя записать число 2 в ячейку 38, потому что это испортило бы программу. Программа выполняется последовательно по шагам. Выполнив команду из 37-ой ячейки, мальчик переходит к следующей, 38- й и так до тех пор, пока ему не встретится команда СТОП.

Правда, естественный порядок команд может нарушаться, как, например, в программе, показанной в табл. 2, при следующем исходном состоянии ячеек:

Ячейка Содержимое

2 5

5'П'

6'Р'

7'И'

2

8'В'

9'Е'

10'Т'

11'0'

Таблица 1.2. Вторая программа

Ячейка

Команда

 

 

37

Прочитать содержимое ячейки, адрес которой

 

хранится в ячейке 2

 

 

38

Если оно равно 0, перейти к ячейке 42

 

 

39

Напечатать содержимое ячейки, адрес которой

 

хранится в ячейке 2

 

 

40

Увеличить содержимое ячейки 2 на 1

 

 

41

Перейти к ячейке 37

 

 

42

СТОП

 

 

Самая трудная команда в этой программе, — конечно же, первая. Она состоит из нескольких действий. Первое — чтение содержимого ячейки 2. Прочитав число 5 из ячейки 2, мальчик знает, что это совсем не та пятерка, которую он получил в результате выполнения первой программы, а адрес некой ячейки памяти. Такие адреса в языке Си называются указателями. Второе действие уже проще: мальчик читает содержимое ячейки 5 и переходит к следующей команде, записанной в ячейке 38. Здесь проверяется, равно ли нулю содержимое пятой ячейки. Если да, мальчик переходит к 42-й ячейке и останавливается. Если нет, — рисует мелом на грифельной доске букву, хранящуюся в пятой ячейке, увеличивает адрес в ячейке 2 на единицу, и переходит к началу программы, то есть к ячейке 37.

3

Соседние файлы в предмете Программирование на C++