Программирование на языке высокого уровня C++ Лекция 5 Символы. Кодировки. Строки Кафедра АСОИУ ОмГТУ, 2012 Богатов Р.Н.
«Ходовые» типы данных Тип Размер (байт) Диапазон значений int4-2 млрд … 2 млрд float4±10 ±38, точность – 7 разрядов double8±10 ±308, точность – 15 разрядов bool1true или false char1-128 … 127 (код символа)
Символы Скольки-значный код потребуется для представления одного символа текста? A…Z a…z 0…9 – это … 96 символов 6 бит = 64 значения 7 бит = 128 значений 8 бит = 256 значений Изначальная идея: один символ – один байт. Коды 0…127 – основной набор символов, коды 128…255 – для национального алфавита. ASCII – базовая 7-битовая кодировка для латинского алфавита и основных символов. Кириллические кодировки (CP866, Windows CP1251, KOI8-R и другие) отличаются только размещением русских букв в диапазоне кодов 128…255.
Кодировка Windows CP !49165A81Q97a113q 21834"50266B82R98b114r 31935#51367C83S99c115s 42036$52468D84T100d116t 52137%53569E85U101e117u 62238&54670F86V102f118v 72339'55771G87W103g119w 82440(56872H88X104h120x 92541)57973I89Y105i121y *58:74J90Z106j122z ;75K91[107k123{ ,6078N94^110n126~ /63?79O95_111o Ђ144ђ °192А208Р224а240р 129Ѓ145161Ў177±193Б209С225б241с ў178І194В210Т226в242т 131ѓ147163Ј179і195Г211У227г243у ¤180ґ196Д212Ф228д244ф 133…149165Ґ181µ197Е213Х229е245х –166¦182¶198Ж214Ц230ж246ц §183·199З215Ч231з247ч 168Ё184ё200И216Ш232и248ш ©185201Й217Щ233й249щ 138Љ154љ170Є186є202К218Ъ234к250ъ «187»203Л219Ы235л251ы 140Њ156њ172¬188ј204М220Ь236м252ь 141Ќ157ќ173189Ѕ205Н221Э237н253э 142Ћ158ћ174®190ѕ206О222Ю238о254ю 143Џ159џ175Ї191ї207П223Я239п255я ASCII
ASCII ( ) CP1251 ( ) Вставка символа в Microsoft Word Unicode
Фрагменты символов Unicode
// объявление и инициализация char a, b; a = '7'; printf("%c", a); b = (char)55; // то же самое printf("%c", b); // объявление и инициализация char a, b; a = '7'; printf("%c", a); b = (char)55; // то же самое printf("%c", b); Символы в C++ // посмотреть кодировку for (int i = 0; i < 256; i++) printf("%c", i ); // посмотреть кодировку for (int i = 0; i < 256; i++) printf("%c", i ); printf("Code page #866:\n"); setlocale(LC_ALL, ".866"); // по умолчанию, можно не указывать for (int i = 128; i < 256; i++) printf("%c", i ); printf("\n\nCode page #1251:\n"); setlocale(LC_ALL, ".1251"); // или setlocale(LC_ALL, "Russian") for (int i = 128; i < 256; i++) printf("%c", i ); printf("Code page #866:\n"); setlocale(LC_ALL, ".866"); // по умолчанию, можно не указывать for (int i = 128; i < 256; i++) printf("%c", i ); printf("\n\nCode page #1251:\n"); setlocale(LC_ALL, ".1251"); // или setlocale(LC_ALL, "Russian") for (int i = 128; i < 256; i++) printf("%c", i );
Строки в C++ char s[6]; s[0] = 72; s[1] = 101; s[2] = 108; s[3] = 108; s[4] = 111; s[5] = 0; char s[6]; s[0] = 72; s[1] = 101; s[2] = 108; s[3] = 108; s[4] = 111; s[5] = 0; char s[] = "Hello"; char s[6]; s[0] = 'H'; s[1] = 'e'; s[2] = 'l'; s[3] = 'l'; s[4] = 'o'; s[5] = 0; char s[6]; s[0] = 'H'; s[1] = 'e'; s[2] = 'l'; s[3] = 'l'; s[4] = 'o'; s[5] = 0; for (int i = 0; i < 5; i++) printf("%d", s[i] ); for (int i = 0; i < 5; i++) printf("%d", s[i] ); for (int i = 0; i < 5; i++) printf("%c", s[i] ); for (int i = 0; i < 5; i++) printf("%c", s[i] ); printf("%s", s ); printf("What's your name? "); char x[20]; scanf("%s", x); printf("Hi, %s!", x); printf("What's your name? "); char x[20]; scanf("%s", x); printf("Hi, %s!", x);
Строки в C++ – нуль-терминированные // эксперимент! char s[] = "Hello, World!"; printf("Вариант 1: %s\n", s); s[5] = 0; printf("Вариант 2: %s\n", s); s[5] = '!'; printf("Вариант 3: %s\n", s); // эксперимент! char s[] = "Hello, World!"; printf("Вариант 1: %s\n", s); s[5] = 0; printf("Вариант 2: %s\n", s); s[5] = '!'; printf("Вариант 3: %s\n", s); // строка из двух символов char a[3]; a[0]='H'; a[1]='i'; a[2]=0; // строка из одного символа char b[2]; b[0]='!'; b[1]=0; // пустая строка (без текста) char c[1]; c[0]=0; // строка из двух символов char a[3]; a[0]='H'; a[1]='i'; a[2]=0; // строка из одного символа char b[2]; b[0]='!'; b[1]=0; // пустая строка (без текста) char c[1]; c[0]=0; // строка из двух символов char a[] = "Hi"; // строка из одного символа char b[] = "!"; // пустая строка (без текста) char c[] = ""; // строка из двух символов char a[] = "Hi"; // строка из одного символа char b[] = "!"; // пустая строка (без текста) char c[] = ""; // найти длину строки printf("Введите текст: "); char t[2000]; scanf("%s", t); int i = 0; for(;; i++) if (t[i]==0) break; printf("В тексте %d символов!", i); // найти длину строки printf("Введите текст: "); char t[2000]; scanf("%s", t); int i = 0; for(;; i++) if (t[i]==0) break; printf("В тексте %d символов!", i); // найти длину строки printf("Введите текст: "); char t[2000]; scanf("%[^\n]s", t); int i = 0; for(;; i++) if (t[i]==0) break; printf("В тексте %d символов!", i); // найти длину строки printf("Введите текст: "); char t[2000]; scanf("%[^\n]s", t); int i = 0; for(;; i++) if (t[i]==0) break; printf("В тексте %d символов!", i); // найти длину строки printf("Введите текст: "); char t[2000]; scanf("%[^\n]s", t); printf("В тексте %d символов!", strlen(t)); // найти длину строки printf("Введите текст: "); char t[2000]; scanf("%[^\n]s", t); printf("В тексте %d символов!", strlen(t)); #include // для продвинутых: создание своей функции int mystrlen(char s[]) { int i = 0; for(;; i++) if (s[i]==0) break; return i; } void main() { printf("Введите текст: "); char t[2000]; scanf("%1999[^\n]s", t); printf("В тексте %d символов!", mystrlen(t)); } // для продвинутых: создание своей функции int mystrlen(char s[]) { int i = 0; for(;; i++) if (s[i]==0) break; return i; } void main() { printf("Введите текст: "); char t[2000]; scanf("%1999[^\n]s", t); printf("В тексте %d символов!", mystrlen(t)); }
Перевод в шестнадцатеричную систему счисления printf("Введите положительное целое: "); int n; scanf("%d", &n); printf("Шестнадцатеричная запись:\n"); do { int x = n % 16; n = n / 16; printf("%d\n", x ); } while (n>0); printf("Введите положительное целое: "); int n; scanf("%d", &n); printf("Шестнадцатеричная запись:\n"); do { int x = n % 16; n = n / 16; printf("%d\n", x ); } while (n>0); printf("Введите положительное целое: "); int n; scanf("%d", &n); printf("Шестнадцатеричная запись:\n"); do { int x = n % 16; n = n / 16; char z; if( x0); printf("Введите положительное целое: "); int n; scanf("%d", &n); printf("Шестнадцатеричная запись:\n"); do { int x = n % 16; n = n / 16; char z; if( x0); char s[8]; int i=0; do { int x = n % 16; n = n / 16; char z; if( x0); // после цикла i - количество полученных цифр // переворачиваем содержимое строки for(int j=0; j
Подсчёт слов, начинающихся с заглавной буквы printf("Input text: "); char s[2000]; scanf("%[^\n]s", s); int count = 0; for(int i=0; i='A' && s[i+1]
Использование string.h printf("Guess my name? "); char name[50]; scanf("%s", name); // конвертирование всех букв в нижний регистр // например, "KaTe" -> "kate" strlwr(name); // проверка на равенство if( strcmp(name, "stacy")==0 ) printf("Correct!!!"); else printf("Not exactly..."); printf("Guess my name? "); char name[50]; scanf("%s", name); // конвертирование всех букв в нижний регистр // например, "KaTe" -> "kate" strlwr(name); // проверка на равенство if( strcmp(name, "stacy")==0 ) printf("Correct!!!"); else printf("Not exactly..."); printf("Login: "); char login[200]; scanf("%s", login); // проверка на наличие подстроки if( strstr(login, "putin")!=NULL ) { printf("Unknown error. Terminating..."); return; }... printf("Login: "); char login[200]; scanf("%s", login); // проверка на наличие подстроки if( strstr(login, "putin")!=NULL ) { printf("Unknown error. Terminating..."); return; }... #include
Использование string.h // Задача: в строке, содержащей путь и имя файла, // изменить расширение в имени файла на "txt" printf("Введите имя файла: "); char filename[200]; scanf("%[^\n]s", filename); int n = strlen(filename); printf("Длина строки: %d\n", n ); // отсечение расширения вручную int j=-1; for(int i=n-1; i>=0; i--) if (filename[i]=='.') j = i; if( j>-1 ) filename[j] = 0; printf("Имя файла без расширения: %s\n", filename); strcat(filename, ".txt"); // приклеиваем новое расширение printf("Имя файла с новым расширением: %s\n", filename); // Задача: в строке, содержащей путь и имя файла, // изменить расширение в имени файла на "txt" printf("Введите имя файла: "); char filename[200]; scanf("%[^\n]s", filename); int n = strlen(filename); printf("Длина строки: %d\n", n ); // отсечение расширения вручную int j=-1; for(int i=n-1; i>=0; i--) if (filename[i]=='.') j = i; if( j>-1 ) filename[j] = 0; printf("Имя файла без расширения: %s\n", filename); strcat(filename, ".txt"); // приклеиваем новое расширение printf("Имя файла с новым расширением: %s\n", filename); // отсечение расширения с помощью strrchr char *p; // поиск первой точки при просмотре справа-налево p = strrchr(filename, '.'); if( p!=NULL ) *p = 0; // затираем точку кодом конца строки // отсечение расширения с помощью strrchr char *p; // поиск первой точки при просмотре справа-налево p = strrchr(filename, '.'); if( p!=NULL ) *p = 0; // затираем точку кодом конца строки #include
Домашнее задание Подсчитать количество «слов» в тексте, который введёт пользователь. За «слово» считать любую последовательность символов, не содержащую пробелов. Пример текста: Точка (x1; y1) находится в … квадранте. Ответ: в этом тексте 7 «слов» Очевидная структура алгоритма: общий цикл, пока не кончится текст цикл пропуска пробелов (одного или нескольких идущих подряд) цикл пропуска не-пробелов (составляющих «слово») инкрементирование счётчика слов