Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабник по C.pdf
Скачиваний:
74
Добавлен:
01.06.2015
Размер:
876.9 Кб
Скачать

– 4 –

2.2. КОНСТАНТЫ

Целые константы

Десятичные – состоят из цифр от 0 до 9, первая цифра – не 0. Пример: 123, 11. Тип константы – int или long.

Восьмеричные – состоят из цифр от 0 до 7, первая цифра – 0. Пример: 030=(24)10,

011=(9)10.

Шестнадцатеричные – состоят из цифр от 0 до 9 и букв от A до F, первые два символа

0x. Пример: 0xF=(15)10, 0x11=(17)10. Тип константы – unsigned int или unsigned long.

Длинные целые – после записи константы добавляется буква l или L.

Константы с плавающей точкой

Состоят из следующих частей: знак; целая часть – последовательность цифр; десятичная точка; дробная часть – последовательность цифр; символ экспоненты – e или E; экспонента – целая константа м.б. со знаком. Любая часть (но не обе сразу) из нижеследующих пар м.б. опущена: целая или дробная часть; десятичная точка или символ экспоненты вместе с экспо-

нентой. Пример: 345.; 3.14159; 34.4E4; 457e–5. Тип константы – double.

Символьные константы

Символьная константа – символ кода ASCII, заключённый в апострофы. Пример: 'b',

'Ф', 'F', '8'. Тип константы – char.

Для непечатных символов можно применять числовое обозначение – '\вшк', где вшк – восьмеричная или шестнадцатеричная константа. Пример: '\07' – звонок; '\0' – нулевой байт.

Для некоторых непечатных символов используются специальные двухсимвольные последовательности:

'\n' – перевод строки;

'\t' – горизонтальная табуляция;

'\b'– забой (возврат каретки со стиранием);

'\f' – переход на другую страницу.

2.3.ОПРЕДЕЛЕНИЕ ПЕРЕМЕННЫХ И ТИПИЗИРОВАННЫХ КОНСТАНТ

Объявление данных в Си-программах имеет следующий вид:

[класс_памяти] тип имя1, имя2,...;

Например:

int

numb; double pi; unsighned int numb1;

int

m1,m2;

char

simb;

(Классы памяти будут рассмотрены ниже).

При объявлении переменные можно инициализировать: int n=10;

Для записи типизированных констант применяется ключевое слово const:

const [тип] имя=значение;

Например:

const

a=1;

// по умолчанию принимается тип int

const

float

pi=3.14159;

© 1998 Калачев Д.П., Лутай В.Н.

– 5 –

2.4.ОДНОМЕРНЫЙ МАССИВ

Массив объявляется следующим образом:

[класс_памяти] тип имя_массива [размер_массива];

размер_массива – целое выражение – количество элементов массива.

Например:

int array [5];

Элементы массива array расположены в памяти следующим образом:

array[0] array[1] array[2] array[3] array[4]

Массив можно инициализировать при объявлении:

[класс_памяти] тип имя_массива [размер_массива]={C1, C2, ...., Cn},

где Ci – константы соответствующего типа.

Если n<размер_массива, то оставшиеся поля будут автоматически проинициализированы: числовые - нулями, символьные – пробелами.

char str[4] = {'а', 'б', 'в', 'г'};

При инициализации в объявлении массива можно использовать пустые скобки:

int massiv [] = {1,2,3,4};

в этом случае транслятор определяет размер массива по количеству элементов инициализации.

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

2.5. СТРОКИ, СТРОКОВЫЕ КОНСТАНТЫ

Среди одномерных массивов символьного типа выделяют строку символов. От массива строка отличается тем, что её последним символом является символьный нуль: '\0'.

char stroka[] = {'с','т','р','о','к','а','\0'};

Этот символ может заноситься и автоматически, если массив инициализируется следующим образом:

char stroka[] = "строка";

(Длина строки в памяти на 1 байт превышает количество символов в строке справа от знака присваивания). Нуль-символ существенно упрощает работу со строками. Например, несмотря на то, что для строки name в следующем объявлении отведено 25 байтов

char name[25]= "Владимир";

нуль-символ позволяет ограничиться обработкой только первых восьми.

© 1998 Калачев Д.П., Лутай В.Н.

6 –

Вбиблиотеке языка имеется множество функций для обработки строк. Приведем некоторые из них:

int strlen(char* str); // возвращает длину строки; char* strcat(char* str1, char* str2);

//соединяет две строки; результат записывается в первую строку; например char str1[12 ]="Группа ";

char str2[ ]=" A15";

strcat(str1,str2); // в результате str1 будет равна "Группа A15"; int strcmp(строка1, строка2) // <0, если строка1<строка2,

//=0, если строка1=строка2,

//>0, если строка1>строка2.

char* strcpy(char* str1, char* str2) // копирует вторую строку в первую.

int isalpha(int c) // возвращает не ноль если С- буква и ноль если С не буква. int isdigit(int c) // цифра, не цифра.

int islower(int c) // строчная, не строчная (a/A). int isupper(int c) // заглавная, не заглавная (A/a).

Прототипы функций работы со строками находятся в заголовочных файлах string.h и ctype.h.

2.6. УКАЗАТЕЛИ

Указатели – переменные или константы, содержащие адреса переменных; адресом переменной является номер первого байта поля памяти, отведенного под эту переменную.

Указатель в программе объявляется следующим образом:

тип* имя;

Указатель может указывать на объект любого типа: целую переменную, массив, структуру:

int* ptr1; double* ptr2;

Над указателями можно проводить арифметические операции сложения и вычитания.

ptr1 = ptr1+1;

Целая единица, которая прибавляется к указателю ptr1, является адресной единицей и содержит в себе столько натуральных единиц, сколько байтов содержит в себе тип указателя. Т.к. ptr1 объявлено как целое число и соответствующее поле занимает 2 байта, то адресная единица равна 2 натуральным и после выполнения операции сложения ptr1 содержит число, равное адресу следующего поля типа int.

ptr2=ptr2+2;

Здесь адресная единица содержит 8 натуральных единиц (см. табл.1). После выполнения операции в ptr2 записан адрес второго за исходным поля типа double.

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

int number, * ptr; ptr = &number;

В результате выполнения оператора присваивания в переменной ptr запоминается адрес переменной number.

© 1998 Калачев Д.П., Лутай В.Н.

– 7 –

Если запись вида *ptr встречается среди операторов программы, то она означает обращение к значению переменной, адрес которого записан в ptr (косвенная адресация).

char

symb1, symb2; char* ptr;

symb1

= ‘1’;

ptr

= &symb1;

symb2

= *ptr;

В результате значения symb1 и symb2 равны.

Кроме сложения и вычитания, над указателями можно производить операции сравнения. Различают константу и переменную типа «указатель». Переменная типа «указатель» должна быть объявлена явно (см. примеры). Константа типа «указатель» не может быть за-

писана слева от знака присваивания; указателем-константой является имя массива.

2.7. ПЕРЕИМЕНОВАНИЯ ТИПОВ

Отметим, что в программах возможны переименования типов. Выполняется это оператором

typedef старый_тип новый_тип

Например:

typedef char* string;

Теперь вместо объявления char* name[25] можно записывать string name[25].

2.8. СТРУКТУРЫ

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

struct имя_шаблона{ описания элементов; };

struct dinner { char *place; float cost; };

В качестве элементов структуры могут использоваться элементы любого типа, в том числе и структуры. Шаблон может быть объявлен вне функции; структурная переменная описывается на основании шаблона.

struct day { int date; char name[10]; };

void main() { struct day today;

. . .

}

Доступ к элементам структурной переменной может быть двояким:

с помощью квалифицированного имени: имя_переменной.имя_элемента;

©1998 Калачев Д.П., Лутай В.Н.