Слайд 3
Приведение типов
Некоторые операции в зависимости от своих операндов
могут инициировать преобразование значений из одного типа в другой.
Приведение типов (cast) в языке Си может быть явным (explicit) и неявным (implicit).
При явном приведении типов перед выражением ставится имя нужного типа в круглых скобках.
Пример: float k = (float) 1/3; // k = 0.333…
Неявное приведение типов выполняется компиляторов автоматически по указанным далее правилам.
Слайд 4
Преобразования целых типов
Знаковые и беззнаковые значения типа char,
short int и enum могут использоваться в выражениях везде,
где разрешено применение целых чисел. Если тип int позволяет представить все значения исходного типа операнда, то операнд приводится к int, в противном случае— к unsigned int. Эта процедура называется расширением целочисленного типа (integral promotion).
При преобразовании signed-типа А к unsigned-типу В если длина с битах А > В, то лишние левые биты отбрасываются, иначе – недостающие заполняются нулями.
В результате приведения unsigned-типа к signed его значение не меняется, если оно представимо в этом новом типе; в противном случае результат зависит от реализации.
Слайд 5
Преобр-е «целое – веществ-е»
При преобразовании из вещественного типа
в целочисленный дробная часть числа отбрасывается; если полученное при
этом значение нельзя представить величиной заданного целочисленного типа, то результат не определен.
Если число преобразуется из целого в вещественное и находится в допустимом диапазоне, но представляется в новом типе недостаточно точно, то результатом будет большее или меньшее ближайшее значение нового типа. Если результат выходит за границы диапазона допустимых значений, результат не определен.
Слайд 6
Преобр-е вещественных типов
При преобразовании из вещественного типа меньшей
точности к типу большей точности число не изменяется. (float
-> double)
Если преобразование выполняется от большей точности к меньшей и число остается в допустимых пределах нового типа, то результатом будет большее или меньшее ближайшее значение нового типа. Если результат выходит за границы допустимого диапазона, результат не определен:
double R = 2e+100;
float R2 = R; /* Исключение типа Floating overflow – переполнение типа float */
Слайд 8
Арифметические преобразования
если один операнд имеет тип:
то другой преобраз-ся
в:
Во-первых,
Слайд 9
Преобразования указателей
Любой указатель можно привести к типу void
* без потери информации. Если результат подвергнуть обратному преобразованию,
получится исходный указатель. Указатели типа void * можно употреблять совместно с указателями любого типа в операциях присваивания и сравнения каким угодно образом.
При преобразовании указателей других типов по факту ничего не происходит, но транслятор «запоминает», что операции адресной арифметики и разыменования нужно выполнять в соответствии с новым типом данных.
Слайд 11
Кодировки символов
Для представления текста в цифровом формате необходимо
придумать систему кодирования, в которой каждой букве соответствовал бы
уникальный двоичный код. Свои коды понадобятся и для цифр, и для знаков препинания, поскольку без них в тексте не обойтись.
Кодирование – это представление чего-либо чем-нибудь другим.
Кодировка (набор символов, чарсет, charset, кодовая страница) – это набор правил, описывающий способ перевода одного представления в другое, т.е. таблица кодов, закрепляющая за символом набор битов.
Слайд 12
Кодировка ASCII 1967 год
– американский стандартный код для
обмена информацией (American Standard Code for Information Interchange).
ASCII
— это 7-битовая кодировка. Ее коды принимают значения от 0000000 до 1111111 или в шестнадцатеричном выражении от 00h до 7Fh.
Первые 33 кода – управляющие и непечатные символы (например: ‘\t’ – 09h, ‘\n’ – 0Ah), остальные – буквы латинского алфавита, цифры и знаки препинания.
Для кодирования национальных символов используют расширенную ASCII-таблицу и коды 128-255. Для Windows это кодировка Windows CP-1251. Кодировка букв в консоли Windows по умолчанию MS-DOS CP-866.
Кириллицу также содержат кодовые страницы ISO-8859-5 (Linux), CP KOI-8U и CP KOI-8R (СССР). Для других языков существуют свои кодовые таблицы.
Слайд 13
Полная ASCII-таблица есть в файле ascii.pdf. Там же
есть и расширенные таблицы 866 и CP-1251.
Слайд 14
Unicode 1988 год
– таблица кодирования символов, которая содержит 1
114 112 кодов для символов всех языков.
Первые 128
символов — с кодами от 0000h до 007Fh — совпадают с символами ASCII.
Unicode в первую и главную очередь определяет таблицу пунктов для символов. Это такой способ сказать «65 – A, 66 – B, 9731 – ☃». Как эти пункты кодируются в байты зависит от конкретной кодировки. Для представления 1 114 112 значений двух байт недостаточно. Трех достаточно, но 3 – странное число, так что 4 является комфортным минимумом.
UTF-32 – это кодировка, которая переводит все символы в наборы из 32 бит.
UTF-16 и UTF-8 являются кодировками с переменной длиной кодирования. Если символ может быть закодирован одним байтом, UTF-8 закодирует его одним байтом. Если нужно 2 байта, то используется 2 байта. Кодировка сообщает старшими битами, сколькими битами кодируется текущий символ.
UTF-16 является компромиссом: все символы как минимум двухбайтные, но их размер может увеличиваться до 4 байт, если нужно.
Слайд 15
Тип char
Переменная типа char занимает 1 байт памяти
и хранит целое число, обозначающее код символа в какой-либо
стандартной кодировке.
Отсюда следует, что, во-первых, с типом char можно работать, как с обычным целым числом. А во-вторых, что значения типа int тоже можно воспринимать как коды символов.
В случае с типом int по умолчанию подразумевается модификатор знака signed. Но что касается типа char, то в стандарте указано, что тип char должен совпадать либо с signed char, либо с unsigned char, и это зависит от компилятора! То есть в общем случае, типы signed char, unsigned char и char – это 3 разных типа!*
Слайд 16
Функции для работы с char
Ввод/вывод:
1. Указание типа в
printf/scanf - %c. Пример: вывод всей кодовой таблицы:
int main(){
int i;
for( i = 0; i < 256; i++)
printf("symbol: %c, code = %d\n", i, i);
}
2. Ввод: функция getchar() – возвращает код введенного символа.
Вывод: функция putchar(char c).
3. Для ввода/вывода в файл – функции getc(), putc().
4. Функции ungetch(), getch() – посмотреть самостоятельно!
Слайд 17
Функции для анализа символов
isalnum (c) ИСТИННО isalpha(с)ИЛИ isdigit(с)
isalpha (с) ИСТИННО isupper(с)ИЛИ islower(с)
iscntrl (c) Управляющий символ
isdigit
(с) Десятичная цифра
isgraph (с) Отображаемый символ, за исключением пробела
islower (с) Буква нижнего регистра
isprint (с) Отображаемый символ, в том числе пробел
ispunct (с) Отображаемый символ, за исключением пробела, буквы или цифры
isspace (с) Пробел, прогон страницы, конец строки, возврат каретки, табуляция, вертикальная табуляция
isupper (с) Буква верхнего регистра
isxdigit (с) Шестнадцатеричная цифра
Аргумент каждой из них имеет тип int и должен представлять собой либо EOF, либо unsigned char, приведенный к int; возвращаемое значение имеет тип int. Функции возвращают ненулевое значение (истина), если аргумент с удовлетворяет соответствующему условию или принадлежит указанному классу символов, и нуль (ложь) в противном случае.
#include
int tolower(int с) переводит с в нижний регистр;
int toupper(int с) переводит с в верхний регистр.
Слайд 18
#define EOF (-1)
Макрос EOF – определен в
файле stdio.h и служит для индикации того, что в
потоке больше нет данных. В консоли Windows это сочетание Ctrl+Z.
Пример: программа для считывания символов с клавиатуры и вывода их на экран. Работает до нажатия Ctrl+Z. Подробнее
int main(){
int c;
while ((c = getchar()) != EOF) {
putchar(c);
}
getch();
return 0;
}
При операциях ввода-вывода выделяется область временной памяти (буфер), куда и помещаются поступающие символы. Как только поступает специальный сигнал (например, переход на новую строку при нажатии Enter), данные из буфера передаются по месту своего назначения (на экран, в переменную и др.).
Слайд 19
Строки
Строка – это массив элементов типа char, заканчивающийся
символом ‘\0’ (NULL).
char A1[20] = { 's','t','r','i','n','g','\0' };
char
A2[] = { 's','t','r','i','n','g','\0' };
char A3[20] = "string";
char A4[] = "string";
char * A5 = "string";
char B[10];
Слайд 20
Ввод строки:
scanf(“ %s”, str); // до 1-го пробельного
символа
gets( str ); // ввод до Enter
При вводе строки
символ ‘\0’ добавляется без набора ‘\0’ с клавиатуры.
Вывод строки:
printf(“ %s ”, str); // вывод символов до ‘\0’
puts( str ); // . . . до ‘\0’