- •Глава 1 элементы языка
- •Вывод: Пробелы употреблять везде, где это допустимо и улучшает читабельность программы.
- •Введение в си
- •Глава 2 элементы данных
- •Глава 3 массивы и структуры
- •Глава 4 операции и выражения
- •Глава 5 основные операторы
- •Формат: ;
- •Глава 6. Ввод – вывод данных
- •Форма представления одного данного
- •6.2 Функции getchar(), putchar(), getch()
- •Глава 7. Блоки и процедуры
- •Глава 8 Препроцессор
- •Вычисление квадратичной формы
- •Глава 9 Символьная информация и строки
- •9.3 Строки или строковые константы
- •Глава 10 фAйлы
Вывод: Пробелы употреблять везде, где это допустимо и улучшает читабельность программы.
Пример:
if ( a<b && b<c ) {
Комментарии
Цель – пояснить логику, облегчить отладку, тестирование и сопровождение программ.
Комментарий должен учитывать уровень возможных читателей текста программы (кроме автора, конечно).
Когда писать? По возможности одновременно с текстом программы. После написания текста процедуры прочтите его и во всех местах, где, по вашему мнению, возможен вопрос, прокомментируйте. Принцип: программа должна быть понятна без привлечения дополнительной документации.
Комментарии должны представлять собой правильное предложение без сокращений слов и без орфографических ошибок.
Формат /* <произвольный текст> */
ЗАМЕЧАНИЕ <...> в описании правил записи (формата) конструкций языка означают понятие языка, в программе не записываются.
Пример /* Это предложение – комментарий! */
Внимание!!! Нет необходимости комментировать ключевые слова и стандартные действия!
Пример
for ( k=0, k<10, k += 0.1 ) /* Цикл по параметру к */ Неверно!
long sum, m; /* Описание переменных */ Неверно!
/* сумма элементов массива,
наименьший элемент массива */ Верно!
Введение в си
Глава 2 элементы данных
ДАННЫЕ – это значения, которые могут задаваться объектам программы и использоваться при ее выполнении.
По организации различают скаляры (одиночные значения): переменные, константы и указатели, и совокупности: массивы, структуры и файлы.
Элемент данных имеет тип и изображение. ТИП – множество допустимых значений элемента данных и множество операций над ними. Элементом данных какого-либо типа является переменная или константа.
Константы
Константами называют неизменяемые величины. Компилятор, выделив константу в качестве лексемы, относит ее к одному из типов по ее внешнему виду, т.е. тип константы определяется ее изображением. (Программист может задать тип константы самостоятельно, но это будет не совсем константа!)
Тип константы |
Формат |
Размер |
Примеры |
Целая |
Десятичный: последовательность десятичных цифр, начинающаяся не с нуля, если это число не ноль. |
2(4) |
8, 0, 2345 |
Восьмеричный: нуль, за которым следуют восьмеричные цифры (0,1,2,3,4,5,6,7) |
2(4) |
01, 00, 066, 07654 | |
Шестнадцатеричный: 0х или 0Х, за которым следуют шестнадцатеричные цифры (0,1,2,3,4,5,6,7, 8,9, A, B, C, D, E, F) |
2(4) |
0xA3, 0x1B5, 0X0FF, 0x12345 |
Тип константы |
Формат |
Размер |
Примеры |
Вещественная |
Десятичный: [ цифры ] . [ цифры ] могут быть опущены либо целая, либо дробная части, но не обе сразу . |
8 |
8.8146 0.567, 23. |
Экспоненциальный: [ цифры ].[ цифры ]{E|e}[цифры] могут быть опущены либо целая, либо дробная части, но не обе сразу. Если указаны обе части символ точки обязателен. |
8 |
0.1E7, 0.1e+7 0.1E–7 .11e–7 1E10 |
Тип константы |
Формат |
Размер |
Примеры |
Символьная |
Один символ, заключенный в апострофы |
1 |
‘A’, ‘a’, ‘*’, ‘ ’ |
Два символа, заключенных в апострофы Первый символ размещается в байте с меньшим адресом. |
2 |
‘\n’, ‘\a’, ‘\012’, ‘\’’ |
Символ косой обратной черты используют для представления:
управляющих последовательностей символов, не имеющих графического изображения;
символов: ' , \ , ? , “ ;
любого символа с помощью его шестнадцатеричного или восьмеричного кода. Числовое значение должно находиться в диапазоне от 0 до 255.
Пустая символьная константа не допустима.
Тип константы |
Формат |
Размер |
Примеры |
Строковая |
последовательность символов, заключенная в кавычки |
кол-во символов+ +1 байт |
“Ура!” “\t Значение R=\0xF5 \n” |
В конец каждой строковой константы компилятором добавляется нулевой символ, представляемый управляющей последовательностью \0. Поэтому длина строки всегда на 1 больше количества символов в ней. Поэтому пустая строка имеет длину в 1 байт!
Обратите внимание на разницу между строкой символов “A” и символом 'A'.
Управляющие последовательности могут встречаться и в строковых константах.
Например:
“Челябинский завод \“ Теплоприбор \” ”
Длинную строковую константу можно разместить на нескольких строках, используя в качестве знака переноса обратную косую черту, за которой сразу следует перевод строки.
Например:
“ Это очень длинная, длинная, \
длинная, длинная, \
длинная строка”
Переменные
Тип константы определяется ее изображением. Для переменной необходима специальная конструкция языка – ОПИСАНИЕ.
ВСЕ ПЕРЕМЕННЫЕ В ЯЗЫКЕ Си ДОЛЖНЫ БЫТЬ ОБЪЯВЛЕНЫ!
Любители Бейсика, забудьте о том, чтобы использовать большую кучу переменных без объявления! В принципе, объявлять переменные до их использования – это просто правило хорошего тона. Кроме того, оно позволяет компилятору разделить типы, переменные и функции.
В языке различают понятия описания переменной и ее определения (объявления). Описание устанавливает свойства объекта: его шаг (целый), размер (4 байта). Объявление наряду с этим вызывает выделение памяти.
Формат:
<описание>:= [модификатор_типа] <тип_переменной> <список>
<список>:= <имя_переменной> [= начальное значение, …, имя_переменной [= начальное_значение]... ];
ВНИМАНИЕ! Все переменные должны быть описаны до их использования (по описаниям выделяется память для них).
Базовые типы данных Си
Целые
Тип – integer, в программе int.
Размер переменной типа int может быть 16 или 32 бита.
Пример: описание переменных
int i=0, kol=5, hod;
Тип |
Размер |
Диапазон значений |
int |
2 |
-32768 …+32768 |
int |
4 |
-2147483648 …+2147483647 |
Объекты некоторого базового типа могут быть модифицированы. С этой целью используются специальные ключевые слова – модификаторы.
Рассмотрим 4 из них: unsignet, signet, short, long. Модификатор записывается перед спецификацией. Если после модификатора опущен спецификатор, то он int (long int Along A).
Модификаторы типа:
short – Явно указывает компилятору, что под данную переменную необходимо отвести 2 байта, независимо от разрядности платформы.
long – Явно указывает компилятору, что под данную переменную необходимо отвести 4 байта, независимо от разрядности платформы.
signed – Указывает компилятору, что данная переменная является знаковой (то есть может принимать как положительные, так и отрицательные значения).
unsigned –Указывает компилятору, что данная переменная является беззнаковой (то есть может принимать только положительные значения).
В общем случае:
объект (short) <= объект (int) <= объект (long)
IBM PC |
байты |
диапазон |
short |
2 |
от –32768 до 32767 |
int |
2 |
|
long |
4 |
( –2147483648 … 2147483647 ) |
Пример: описание переменных
int i, kol;
short low, high;
long max;
Данные с плавающей точкой
Существуют три описания для действительных чисел, отличающихся размером выделяемой памяти и точностью представления
float 4 байт 6…7 десятичных цифр
double 8 байт 16 … …
long double 10 байт 16 … …
Все КОНСТАНТЫ имеют тип double!
float step_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;
Логические данные
В Си нет. Замена – целые. 0 false, (НЕ)0 true
Указатели
Указатели (ссылки) – это переменные, показывающие место или адрес памяти, где расположены другие объекты (переменные, функции и т.п.). Т.к. указатель содержит адрес некоторого объекта, то через него можно обращаться к этому объекту.
У такого выражения есть АДРЕС, ТИП и, разумеется, ЗНАЧЕНИЕ. Но у него нет ИМЕНИ И нет ОБЛАСТИ ВИДИМОСТИ.
Формат: описания переменной указателя
<тип> *<имя> [,*<имя>]...;
Объекты, состоящие из знака* и адреса необходимо объявлять!
Объявление вида: char *d; говорит о том, что значение, записанное по адресу d, имеет тип char.
Пример:
int *kol, *num; Признаком указателя служит *.
double *lenght;
Операции над указателями: над указателями определены две унарные операции: & *
Унарная операция & возвращает адрес объекта в явном виде, поэтому оператор:
y = &x;
присваивает адрес x переменной y. Операцию & нельзя применять к константам и выражениям. Операция применима только к объектам, имеющим имя и размещенным в памяти.
Унарная операция * воспринимает свой операнд как адрес некоторого объекта и использует этот адрес для выборки содержимого. Поэтому, оператор:
z = *y;
присваивает z значение переменной, записанной по адресу y.
int *a; |
Объявляет переменную a типа «указатель на int», то есть содержащую адрес некоторого целого значения. |
&x |
Возвращает адрес переменной a |
*p |
Возвращает "переменную" по адресу, находящемуся в переменной p. |
Пример: int x, y, *px;
px=&x;
y=*px;
Это эквивалентно y = x;
Указатели могут встречаться в выражениях. Если y – указатель на целое ( int *y; ), то *y может появляться там же, где и любая другая переменная, не являющаяся указателем.
Пример:
*y = 7; //заносим 7 в ячейку памяти по адресу y
*x = *x*5; //увеличиваем значение по адресу x в 5 раз
(*z)++; //добавляем 1 к содержимому ячейки памяти с адресом z, круглые скобки обязательны