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

37.ИНФОРМАТИКА Book си

.pdf
Скачиваний:
37
Добавлен:
23.03.2016
Размер:
1.14 Mб
Скачать

Московский Государственный Технический

Университет имени Н.Э.Баумана

Специализированный учебно-научный центр ГОУ лицей № 1580 (при МГТУ имени Н.Э. Баумана)

ИНФОРМАТИКА

В.М. Демидов М.М. Григорошенко

Си и Си++

Учебное пособие

Москва

2002

Демидов В.М., Григорошенко М.М.

Си и Си++. Учебное пособие.

В данном пособии описывается Си — язык программирования, широко распространенный среди системных программистов и разработчиков прикладных программ. Приведены основные характеристики языка. Изложены основы языка Си++ как объектноориентированного расширения языка Си. Приведены задачи (лабораторные работы) для освоения языка.

Пособие может быть использовано учащимися 11 классов физи- ко-математических школ, школ с углубленным изучением информатики, студентов младших курсов технических университетов, а также для самостоятельного изучения языков Си и Си++. Предполагается знание основ языка Паскаль. Может быть полезно как при изучении языков, так и при создании системных и прикладных программ на них.

2

Содержание

 

Введение .....................................................................................................

6

Почему язык называется Си?...............................................................

6

Достоинства языка Си ..........................................................................

7

Недостатки языка Си ............................................................................

7

Часть 1. Язык Си ......................................................................................

8

1.1 Синтаксис языка Си........................................................................

8

1.2 Структура программы ....................................................................

9

Пример простейшей программы..................................................

10

1.3 Базовые типы данных ...................................................................

11

Целые типы.....................................................................................

12

Типы с плавающей точкой............................................................

12

Прочие.............................................................................................

12

1.4 Объявление переменных ..............................................................

13

1.5 Операции языка Си .......................................................................

13

Арифметические операции...........................................................

14

Операции присваивания ...............................................................

15

Операции отношения ....................................................................

16

Логические операции ....................................................................

16

Поразрядные (побитовые) операции ...........................................

17

Другие операции ............................................................................

19

Преобразование типов ..................................................................

20

1.6 Операторы......................................................................................

20

Условный оператор if ....................................................................

20

Программа для вычисления корней квадратного уравнения ...

21

Оператор switch..............................................................................

23

Циклы while и do while..................................................................

24

Цикл for...........................................................................................

25

Операторы break и continue ..........................................................

26

Оператор goto .................................................................................

28

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

30

Массивы..........................................................................................

30

Массивы символов или строки ....................................................

32

Указатели........................................................................................

34

1.8 Функции в языке Си .....................................................................

37

Объявление и описание функции ................................................

38

Рекурсивный вызов функции .......................................................

40

Передача параметров функции по адресу...................................

42

Передача массивов и строк...........................................................

43

 

3

Функции, возвращающие указатель.............................................

45

1.9 Типы, определяемые пользователем ...........................................

46

Структура ........................................................................................

46

Битовое поле ...................................................................................

49

Объединение ...................................................................................

50

Перечислимый тип .........................................................................

52

Переименование типов ..................................................................

54

Часть 2. Язык Си++ ................................................................................

55

2.1 Простейшие расширения Си++....................................................

55

Комментарии...................................................................................

55

Константы .......................................................................................

55

Упрощение введения новых типов данных .................................

56

Ввод/вывод ......................................................................................

56

Положение описания переменной ................................................

58

Контроль типов...............................................................................

58

Вставляемые функции ...................................................................

58

Переопределяемые функции .........................................................

59

Параметры функции по умолчанию.............................................

59

Ссылки на переменные ..................................................................

60

Доступ к глобальной переменной, скрытой локальной

 

переменной с тем же именем .................................................

62

Операторы динамического распределения памяти ....................

62

2.2 Классы.............................................................................................

64

Классы и структуры .......................................................................

64

Функции и переменные — члены класса ....................................

64

Конструкторы и деструкторы .......................................................

66

Ссылка класса на самого себя .......................................................

69

Скрытые и видимые элементы класса .........................................

69

Интерфейс класса и реализация класса .......................................

70

Приложение 1. Стандартные заголовочные файлы ........................

73

П1.1 Функции ввода/вывода высокого уровня (stdio.h) ..................

73

Форматный вывод (printf)..............................................................

74

Форматный ввод (scanf).................................................................

77

Функции getchar и putchar .............................................................

79

П1.2

Функции ввода/вывода с консольного терминала (conio.h) .79

П1.3

Работа со строками (string.h) .....................................................

80

Функции работы со строками .......................................................

81

П1.4

Проверка и преобразование символов (ctype.h) ......................

82

П1.5

Форматные преобразования данных (stdlib.h).........................

82

4

П1.6 Математические функции (math.h) ..........................................

83

П1.7 Динамическое распределение памяти (alloc.h).......................

83

П1.8 Графика Borland C++ (graphics.h).............................................

84

Приложение 2. Приоритет и порядок выполнения операций ......

86

Задание на лабораторные работы.......................................................

88

Лабораторная работа № 1. Знакомство с Borland C. Форматный

 

ввод/вывод. Математическая библиотека math.h.......................

88

Лабораторная работа № 2. Разветвляющиеся алгоритмы ..............

89

Лабораторная работа № 3. Циклы. Нахождение суммы ряда

 

Маклорена. .....................................................................................

91

Лабораторная работа № 4. Массивы.................................................

94

Лабораторная работа № 5,6. Строки, указатели, функции и

 

стандартные функции работы со строками ................................

94

Лабораторная работа № 7. Структуры..............................................

95

Лабораторная работа № 8. Битовые поля и побитовые операции. 96

Лабораторная работа № 9. Возможности языка Си++....................

98

Лабораторная работа № 10. Классы и динамическая память .......

99

Литература.............................................................................................

100

5

Введение

Почему язык называется Си?

Си — это язык программирования, широко распространенный среди системных программистов и разработчиков прикладных программ. В отличие от других языков, язык Си появился как инструментальный язык в процессе работы Кэном Томпсоном из научно-исследова- тельской лаборатории фирмы Bell Telephone Laboratories над операционной системой UNIX. В 1969 году Томпсон начал работать над этой системой для мини-ЭВМ PDP-7 фирмы DEC. В 1972 году Дэнисом Ритчи и Кэном Томпсоном был создан язык программирования Си. В нем сочетались лучшие свойства языка ассемблера и языков высокого уровня. От ассемблера были взяты гибкие и эффективные средства работы с памятью, от языков высокого уровня — широкий набор управляющих конструкций, возможность работы со сложными структурами данных, гибкие средства ввода/вывода.

Почему язык называется C (Си)? Если вы заметили, это название соответствует третьей букве английского алфавита. Первую букву занял язык, появившийся в семидесятых годах и названный APL (A Programming Language) или просто А (Эй). Во время работы над операционной системой UNIX для PDP-7 Томпсоном был создан язык программирования B (Би), который оказал сильное влияние на следующий язык, разработанный Ритчи и Томпсоном. Показывая эту преемственность, авторы назвали язык С (Си).

Всвязи с появлением множества различных диалектов языка в 1983 г. при Американском Национальном Институте Стандартов (ANSI) был образован комитет по стандартизации языка Си. В октябре 1986 г. разработанный этим комитетом проект был опубликован для общественного обсуждения, а в 1989 г. окончательный вариант проекта был утвержден в качестве стандарта ANSI.

Вначале 1980-х годов сотрудником AT&T Laboratories Бьярном Страуструпом был разработан язык C++ (Си++) как объектно-ориен- тированное расширение языка Си. Благодаря своей совместимости с языком Си, Си++ стал основным языком, воплощающим объектноориентированное программирование (ООП) для практических разработок как системных, так и прикладных программ.

К сожалению, ограниченный объем не позволит нам глубоко затронуть не только ООП на Си++, но и подробно разобрать методы написания программ на языке Си, а также его библиотеки функций. Однако, изучив изложенный здесь материал, Вы сможете уверенно

Введение

7

 

 

чувствовать себя при работе на языке Си и Си++. Если Вы соберетесь заняться программированием всерьез, то Вам следует изучить Си++ более подробно, поскольку применение ООП существенно ускоряет создание программ. Освоение Си++ дается просто программисту, хорошо знакомому с обычным Си.

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

Достоинства языка Си

По компактности и скорости выполнения программы на языке Си приближаются к программам, написанным на ассемблере.

Широкий набор управляющих конструкций и возможность работать со сложными структурами данных.

Способность поддерживать разработку модульных программ. Основной программной единицей является функция, есть возможность создавать многофайловые программы.

Программы, написанные на языке Си, могут быть легко перенесены на другой компьютер в другую операционную систему.

Программы на Си получаются короче, чем на других языках программирования. При этом не теряется, а увеличивается наглядность и ясность программ.

В настоящее время большинство реализаций языка Си имеет очень богатые библиотеки функций и других объектов.

Недостатки языка Си

Язык Си обладает одним существенным недостатком: он предъявляет достаточно высокие требования к квалификации программиста. В связи с этим хочется дать следующую рекомендацию: в процессе изучения необходимо очень осторожно пользоваться не до конца изученными возможностями, правилами, умолчаниями и т.д. и не полагаться на свою программистскую интуицию (она может подвести).

7

Часть 1. Язык Си

1.1 Синтаксис языка Си

Компилятор языка Си воспринимает исходный файл, содержащий программу, как последовательность текстовых строк. Каждая строка разбивается на группы символов, называемые лексемами. Лексема — это единица текста программы, которая имеет самостоятельный смысл для компилятора и не содержит в себе других лексем. Никакие лексемы, кроме символьных строк, не могут продолжаться на последующих строках. Идентификаторы и ключевые слова, описанные здесь, являются примерами лексем. Внутри идентификаторов и ключевых слов, а также знаков операций, состоящих из нескольких символов (==,&&,+=,++ и др.), пробельные символы (пробел, табуляция, перевод строки, возврат каретки и др.) недопустимы.

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

Комментарием в программе на Си является любая последовательность символов, заключенная между знаками /* и */. Заметим, что между символами / и *, а также * и / пробелы недопустимы. Недопустимы также вложенные комментарии, т.е. комментарии внутри комментариев. Комментарии могут располагаться как на одной строке, так и на нескольких. Размещать комментарии можно везде, где только может находиться пробельный символ в программе. Они не могут появиться внутри идентификаторов, чисел и других служебных комбинаций символов.

Идентификаторы — это имена переменных, функций и меток, используемых в программе. Идентификатор вводится в объявлении переменной или функции, либо в качестве метки оператора. После этого его можно использовать в дальнейших операторах программы. Идентификатор представляет собой последовательность латинских букв, цифр и символов подчеркивания, которая начинается с буквы или символа подчеркивания. Допускается любое число символов в идентификаторе, однако только первые 32 символа рассматриваются компилятором языка Си как значащие. К примеру, если у двух идентификаторов совпадают первые 32 символа, то компилятор рассмат-

Часть 1. Язык Си

9

 

 

ривает их как один и тот же идентификатор. Следует обратить внимание на то, что, в отличие от компиляторов некоторых других языков, компилятор языка Си прописные и строчные буквы рассматривает как различные символы ('A'≠'a').

Компилятор языка Си не допускает использования идентификаторов, совпадающих по написанию с ключевыми словами. Ключевые слова — это предопределенные идентификаторы, которые имеют специальное значение для компилятора. Их использование строго регламентировано.

Далее приведен список ключевых слов, предусмотренных стандар-

том ANSI.

auto

default

extern

int

signed

typedef

break

do

float

long

sizeof

union

case

double

for

register

static

unsigned

char

else

goto

return

struct

void

continue

enum

if

short

switch

while

В разных реализациях есть дополнительные ключевые слова, на-

пример, в Turbo C 2.0: asm, cdecl, far, fortran, huge, interrupt, near, pascal, const, volatile. Язык C++ добавляет еще несколько: catch, class, friend, inline, new, operator, private, protected, public, template, this, throw, try, virtual.

1.2 Структура программы

Исходная программа представляет собой совокупность следующих элементов: директив препроцессора, указаний компилятору, объявлений и определений. Директивы препроцессора дают указания препроцессору (препроцессор — программа, обрабатывающая исходный текст до компиляции) по преобразованию текста программы перед компиляцией. Указания компилятору — это специальные инструкции, которые выполняет компилятор. Директивы препроцессора и указания компилятору начинаются с символа #. Объявлению и определению подлежат переменные, функции и типы, созданные программистом. Следует различать объявление и определение. Объявление задает имя и вид объекта, а определение описывает его действия. Для типов эти понятия совпадают. Исходная программа может содержать произвольное число директив, указаний компилятору, объявлений и определений.

9

10

Си и Си++

 

 

Для того чтобы программа на языке Си могла быть скомпилирована и выполнена, она должна содержать по крайней мере одно определение функции. Главная функция должна иметь имя main. С нее начинается выполнение программы, и она определяет действия, выполняемые программой, и вызывает другие функции. Порядок следования определений функций в исходной программе несуществен.

Текст программы на языке Си может быть разделен на несколько исходных файлов. Исходный файл представляет собой текстовый файл, который содержит либо всю программу, либо ее часть. Отдельные исходные файлы можно объединять и компилировать как единое целое с помощью директивы препроцессора #include (почти как uses в Паскале). Исходный файл может содержать любую целостную комбинацию директив, указаний компилятору, объявлений и определений. Под целостностью подразумевается, что такие объекты, как определения функций, структуры данных, должны целиком располагаться в одном файле, т.е. не могут начинаться в одном файле, а продолжаться в другом. Исходный файл не обязательно должен содержать выполняемые операторы. Иногда удобно размещать объявления и определения в разных файлах.

В отличие от Паскаля, в языке Си точка с запятой обозначает конец оператора (в Паскале точка с запятой разделяла операторы), поэтому в Си необходимо ставить точку с запятой и после последнего оператора в блоке. Блок в Си выделяется фигурными скобками { }, т.е. { — аналог begin в Паскале, а } end. Блок можно рассматривать как один сложный оператор. После блока точка с запятой не ставится. Конец программы никак не выделяется.

Пример простейшей программы

Далее приведен пример простейшей программы, выводящей на экран две строки: ―Hello!‖ и ―C and C++‖.

/* Программа на C*/

#include <stdio.h> /* стандартная библиотека ввода-вывода */

main() {

/* Выводит на экран две строки */ printf("Hello!\nC and C++\n");

}

10