Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Text_lektsy_Si-dlya_studentov.pdf
Скачиваний:
6
Добавлен:
08.05.2015
Размер:
1.22 Mб
Скачать

С И

( I S O / I E C 1 4 8 8 2 ( 1 9 9 8 ) )

Начнем мы с краткого экскурса в историю.

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

Язык Pascal был создан Н. Виртом для обучения студентов программированию. Надо сказать, что именно для этих целей – это действительно прекрасный язык. Но не пытайтесь на нем писать программы размером более 5000 строчек – неблагодарное это занятие.

Билл Гейтс создал BASIC таким образом, чтобы его синтаксис был максимально приближен к английскому языку, вследствие чего языком смогли пользоваться американские студенты, не знакомые с компьютерами.

был создан в далеком 1972 году в компании Bell Labs Деннисом Ритчи во время работы над ОС Unix. После окончания разработки вся система была на нем и написана.

Сегодня три самые известные ОС: DOS, Windows и UNIX написаны именно на C. А из этого следует, что проще всего писать программы под эти системы именно на С.

Но тогда обстановка была достаточно интересной: единого стандарта на опе-

рационную систему и аппаратную платформу не существовало (это теперь все сидят на IBM PC-производных и MS Windows).

Отсюда вытекало первое требование к языку: КОД ДОЛЖЕН БЫТЬ МОБИЛЬНЫМ, то есть программист при желании должен был иметь возможность создания программ, которые без изменений могли быть откомпилированы на ЛЮБОЙ системе, на которой реализован компилятор C.

Сейчас язык стандартизирован (если у вас установлен Borland C++ версий от 1.0 до 3.1 (на остальных – не знаю, не искал), то вы в описании на любую библиотечную функцию можете увидеть таблицу поддерживаемых платформ. Если там отмечен пункт ANSI, то отмечены и все остальные), и ту его часть, которая включена в этот стандарт, реализована на всех платформах.

Во-вторых, ЯЗЫК ДОЛЖЕН БЫЛ БЫТЬ ДОСТАТОЧНО МОЩНЫМ, чтобы на нем писать ОС.

В Си нет многих ограничений, введенных для удобства в других языках. Разумеется, это существенно удобнее и мощнее, но вся ответственность за соблю-

дение некоторых правил лежит целиком на программисте.

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

1

Глава 1 ЭЛЕМЕНТЫ ЯЗЫКА

Программиста спрашивают:

-Как вам удалось так быстро выучить английский язык?

-Да ерунда. Они там почти все слова из С++ взяли.

Втексте на любом естественном языке можно выделить четыре основных элемента: символы, слова, словосочетания и предложения.

Подобные элементы содержит и алгоритмический язык, только слова называются лексемами, словосочетания – выражениями, а предложения - операторами. Лексемы образуются из символов, выражения – из лексем и символов, а операторы – из символов, выражений и лексем.

алфавит языка или его символы – это основные неделимые знаки, с помощью которых пишутся все тексты на языке.

лексема – минимальная единица языка, имеющая самостоятельный смысл.

выражение задает правило вычисления некоторого значения.

оператор задает законченное описание некоторого действия.

1.1 Алфавит

Основа – код ASCII,

буквы – латинские (прописные и строч-

ные);

символ подчеркивания;

цифры – арабские,

спецсимволы.

пробельные символы: пробел, табуляция, переход на новую строку.

1.2 Лексемы языка

1.2.1Идентификаторы

Идентификатор – имя программного объекта (переменных, констант, массивов, структур и т.д.).

Состав идентификатора: буквы, цифры, _ . Первый символ буква или символ подчеркивания.

Максимальная длина идентификатора – 32 символа. Пробелы внутри идентификатора недопустимы.

Пример: STEP KOD A1 player_1 next_step

При создании идентификатора следует иметь в виду следующее:

2

идентификатор не должен совпадать с ключевыми словами и именами используемых стандартных объектов языка.

Например: в языке PL/1 допустимо:

IF IF = THEN

THEN

THEN = ELSE;

 

ELSE

в Си такое недопустимо!

ELSE = IF;

не рекомендуется начинать идентификатор с символа подчеркивания, т.к. велика вероятность совпадения таких идентификаторов с именами стандартных объектов языка.

Основной принцип лежащий в основе понятия «стиль программирования»– писать так, чтобы программу могли прочесть не только машины, но и люди.

СТИЛЬ – набор приемов или методов программирования, используемых для получения ПРАВИЛЬНЫХ, УДОБНЫХ ДЛЯ ПРИМЕНЕНИЯ, ЛЕГКОЧИТАЕМЫХ и, желательно, ЭФФЕКТИВНЫХ программ. Особый стиль – это программы, понятные лишь автору.

Стиль Си:

идентификаторы – малые буквы.

Имена должны быть осмысленными. Hе надо! x xx aa a1 a2

Hормально!

type

size adress

Еще лучше!

beg_km

end_km field_name max_lenght

Существуют два соглашения о правилах создания имен (нотации)

Паскалевская нотация! BegKm

EndKm

FieldName

«Венгерская» нотация! intBegKm

intEndKm

charFieldName

Сходные имена не надо!

value и values

ax1 и axi

k и K

Цифры располагаются в конце идентификаторов.

fund1 Tab15

1.2.2Ключевые слова

Это зарезервированные идентификаторы, которые тимеют специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены. По ходу.

3

1.2.3Знаки разрядки (пустые символы).

В языке СИ пустыми символами являются: пробел, табуляция (Tab), переход на новую строку (Enter)

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

Размещение операторов. 1 оператор (кроме сложных) в строку.

Причины:

-

соответствует требованиям структурного программирования, требующим сдви-

гать оператор по строке в соответствии с уровнем его вложенности;

-

облегчает коррекцию.

Перенос.

-если слово не входит в строку, начинайте его с новой строки;

-делайте перенос после знака операции;

-при переносе оператора строки продолжения сдвигать на 5…6 позиций.

Пример:

a = b – c

Hехорошо! a = b – c – Хорошо!

– (d+2);

(d+2);

Отступы – это абзац, выявление структуры программы.

Пример: Циклы

пока ( условие_1 ) действие_1-1; пока ( условие_2)

действие_2-1; действие_2-2;

конец пока действие_1-2; конец пока

4

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

если ( условие ) то действие_1; действие_2; иначе действие_3; действие_4;

Пропуск строк и пробелы обеспечивают уникальную разрядку текста. Применение:

выделение логических частей текста (процедур, блоков);

после нарушения естественного порядка выполнения операторов

(continue, break, goto);

выделение комментариев.

выявление структуры программы.

Вывод: Пробелы употреблять везде, где это допустимо и улучшает читабельность программы.

Пример:

if ( a<b && b<c ) {

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

Цель – пояснить логику, облегчить отладку, тестирование и сопровождение программ.

Комментарий должен учитывать уровень возможных читателей текста программы (кроме автора, конечно).

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

Комментарии должны представлять собой правильное предложение без сокращений слов и без орфографических ошибок.

Формат

/* <произвольный текст> */

ЗАМЕЧАНИЕ <...> в описании правил записи (формата) конструкций языка означают понятие языка, в программе не записываются.

Пример /* Это предложение – комментарий! */

Внимание!!!

Нет необходимости комментировать ключевые слова и стандарт-

ные действия!

 

 

Пример

 

/* Цикл по параметру к */ Неверно!

for ( k=0, k<10, k += 0.1 )

long sum, m;

/* Описание переменных */ Неверно!

/* сумма элементов массива,

 

наименьший элемент массива */ Верно!

5

ВВЕДЕНИЕ В СИ

Глава 2 ЭЛЕМЕНТЫ ДАННЫХ

ДАННЫЕ – это значения, которые могут задаваться объектам программы и использоваться при ее выполнении.

По организации различают скаляры (одиночные значения): переменные, константы и указатели, и совокупности: массивы, структуры и файлы.

Элемент данных имеет тип и изображение. ТИП – множество допустимых значений элемента данных и множество операций над ними. Элементом данных какого-либо типа является переменная или константа.

2.1Константы

Константами называют неизменяемые величины. Компилятор, выделив константу в качестве лексемы, относит ее к одному из типов по ее внешнему виду, т.е. тип констан-

ты определяется ее изображением. (Программист может задать тип константы самостоятельно, но это будет не совсем константа!)

 

Тип

 

Раз

При-

 

кон-

Формат

 

мер

меры

 

станты

 

 

 

 

 

 

 

Десятичный: последовательность десятич-

 

8, 0,

 

 

ных цифр, начинающаяся не с нуля, если это

2(4)

 

 

2345

 

 

число не ноль.

 

 

 

 

Восьмеричный: нуль, за которым следуют

2(4)

01, 00,

 

Целая

восьмеричные цифры (0,1,2,3,4,5,6,7)

066, 07654

 

 

 

0xA3,

 

 

 

 

 

 

Шестнадцатеричный: 0х или 0Х, за кото-

 

0x1B5,

 

 

рым следуют шестнадцатеричные цифры

2(4)

0X0FF,

 

 

(0,1,2,3,4,5,6,7, 8,9, A, B, C, D, E, F)

 

0x1234

 

 

 

 

5

 

 

 

 

 

 

Тип

 

Раз

При-

 

кон-

Формат

 

мер

меры

 

станты

 

 

 

 

 

 

 

Десятичный:

 

8.8146

 

 

[ цифры ] . [ цифры ]

 

 

 

8

0.567,

 

 

могут быть опущены либо целая, либо

 

 

 

23.

 

Веществе

дробная части, но не обе сразу .

 

 

 

 

 

нная

 

 

 

 

Экспоненциальный:

 

0.1E7,

 

 

[ цифры ].[ цифры ]{E|e}[цифры]

8

0.1e+7

 

 

могут быть опущены либо целая, либо

0.1E–7

 

 

 

 

 

дробная части, но не обе сразу. Если указаны

 

.11e–7

6

 

обе части символ точки обязателен.

 

1E10

 

 

 

 

 

 

 

Тип

 

 

Раз

Приме-

 

констан-

 

Формат

 

 

мер

ры

 

ты

 

 

 

 

 

 

 

 

 

 

Один символ, заключенный в апострофы

1

‘A’, ‘a’,

 

Символь-

 

‘*’, ‘ ’

 

 

 

 

 

 

 

Два символа, заключенных в апострофы

 

‘\n’,

 

ная

 

2

 

 

 

Первый символ размещается в байте с

‘\a’, ‘\012’,

 

 

 

меньшим адресом.

 

‘\’’

 

 

 

 

 

 

 

Символ косой обратной черты используют для представления:

управляющих последовательностей символов, не имеющих графического изображения;

символов: ' , \ , ? , “ ;любого символа с помощью его шестнадцатеричного или восьмеричного кода.

Числовое значение должно находиться в диапазоне от 0 до 255.

Пустая символьная константа не допустима.

Тип

 

 

 

кон-

Формат

Размер

Примеры

станты

 

 

 

Строко-

последовательность симво-

кол-во

“Ура!”

символов+

“\t Значение

вая

лов, заключенная в кавычки

+1 байт

R=\0xF5 \n”

 

 

7

В конец каждой строковой константы компилятором добавляется нулевой символ, представляемый управляющей последовательностью \0. Поэтому длина строки всегда на 1 больше количества символов в ней. Поэтому пустая строка имеет длину в 1 байт!

Обратите внимание на разницу между строкой символов “A” и символом 'A'. Управляющие последовательности могут встречаться и в строковых констан-

тах.

Например:

“Челябинский завод \“ Теплоприбор \” ”

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

Например:

“ Это очень длинная, длинная, \ длинная, длинная, \ длинная строка”

8

2.2Переменные

Тип константы определяется ее изображением. Для переменной необходима спе-

циальная конструкция языка – ОПИСАНИЕ.

ВСЕ ПЕРЕМЕННЫЕ В ЯЗЫКЕ Си ДОЛЖНЫ БЫТЬ ОБЪЯВЛЕНЫ! Любители Бейсика, забудьте о том, чтобы использовать большую кучу перемен-

ных без объявления! В принципе, объявлять переменные до их использования – это просто правило хорошего тона. Кроме того, оно позволяет компилятору разделить типы, переменные и функции.

В языке различают понятия описания переменной и ее определения (объявления). Описание устанавливает свойства объекта: его шаг (целый), размер (4 байта). Объявление наряду с этим вызывает выделение памяти.

Формат:

<описание>:= [модификатор_типа] <тип_переменной> <список>

<список>:= <имя_переменной> [= начальное значение, …, имя_переменной [= начальное_значение]... ];

ВНИМАНИЕ! Все переменные должны быть описаны до их использования (по описаниям выделяется память для них).

2.2.1Базовые типы данных Си

ЦЕЛЫЕ

Тип – integer, в программе int.

Размер переменной типа int может быть 16 или 32 бита.

Пример: описание переменных int i=0, kol=5, hod;

Ти

Размер

Диапазон значений

п

 

 

 

in

2

-32768

…+32768

t

 

 

 

in

4

-2147483648

…+2147483647

t

 

 

 

Объекты некоторого базового типа могут быть модифицированы. С этой целью используются специальные ключевые слова – МОДИФИКАТОРЫ.

Рассмотрим 4 из них: unsignet, signet, short, long. Модификатор записывается перед спецификацией. Если после модификатора опущен спецификатор, то он int (long int Along A).

Модификаторы типа:

short – Явно указывает компилятору, что под данную переменную необходимо отвести 2 байта, независимо от разрядности платформы.

9

long – Явно указывает компилятору, что под данную переменную необходимо отвести 4 байта, независимо от разрядности платформы.

signed – Указывает компилятору, что данная переменная является знаковой (то есть может принимать как положительные, так и отрицательные значения).

unsigned –Указывает компилятору, что данная переменная является беззнаковой (то есть может принимать только положительные значения).

В общем случае:

объект (short) <= объект (int) <= объект (long)

IBM PC

 

байты

 

диапазон

short

 

2

 

от –32768 до 32767

int

 

2

 

от215до

2151

long

 

4

 

от231 до

2311

 

 

( –2147483648 … 2147483647 )

 

 

 

 

Пример: описание переменных

 

 

int i, kol;

 

 

 

 

shortlow, high;

 

 

 

 

long max;

 

 

 

 

ДАННЫЕ С ПЛАВАЮЩЕЙ ТОЧКОЙ

Существуют три описания для действительных чисел, отличающихся размером выделяемой памяти и точностью представления

float

4 байт

6…7 десятичных цифр

double

 

8 байт

 

16

… …

long double

10 байт

 

16

… …

Все КОНСТАНТЫ имеют тип double!

floatstep_x=0.01, step_y=0.5;

 

 

double

koord_x, koord_y;

 

 

IBM PC

байты

 

диапазон

float

 

4

 

3.4e–38<|x|<3.4e38

double

 

8

 

1.7e–308<|x|<1.7e308

long double

 

10

 

1e–3000<|x|<1e3000(приблизительно)

СИМВОЛЫ (ЗНАКИ)

Для переменных символьного типа используют служебное слово char (character). Длина переменной – 1 байт. Диапазон значений [–128, 127].

Обратите внимание: тип char может являться как знаковым, так и беззнаковым, в зависимости от конкретного компилятора. Т.е. переменные типа char так же могут быть модифицированы с использованием модификаторов unsigned / signed. Поэтому, чтобы быть уверенным в допустимых значениях, используйте типы signed char и unsigned char.

Пример: char array_name, step;

ЛОГИЧЕСКИЕ ДАННЫЕ

10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]