Программирование на языке высокого уровня
«Ходовые» типы данных
Символы
Кодировка Windows CP1251
Вставка символа в Microsoft Word
Фрагменты символов Unicode
Символы в C++
Строки в C++
Строки в C++ – нуль-терминированные
Перевод в шестнадцатеричную систему счисления
Подсчёт слов, начинающихся с заглавной буквы
Использование string.h
Использование string.h
Домашнее задание
1.48M
Categories: programmingprogramming informaticsinformatics

Программирование на языке высокого уровня. Символы. Кодировки. Строки

1. Программирование на языке высокого уровня

Богатов Р.Н.
Программирование
на языке высокого уровня
C++ ► Лекция 5 ► Символы. Кодировки. Строки
Кафедра АСОИУ ОмГТУ, 2012

2. «Ходовые» типы данных

Тип
Размер
int
4
-2 млрд … 2 млрд
float
4
±10±38, точность – 7 разрядов
double
8
±10±308, точность – 15 разрядов
bool
1
true или false
char
1
-128 … 127 (код символа)
(байт)
Диапазон значений

3. Символы

• Скольки-значный код потребуется для представления одного
символа текста?
• A…Z a…z 0…9 "!?.,:;№_-+*/%\=<>(){}[]@#$^&~|’
– это 27+27+10+32+… ≥ 96 символов
• 6 бит = 64 значения
7 бит = 128 значений
8 бит = 256 значений
• Изначальная идея: один символ – один байт. Коды 0…127 –
основной набор символов, коды 128…255 – для национального алфавита.
• ASCII – базовая 7-битовая кодировка для латинского алфавита и
основных символов. Кириллические кодировки (CP866, Windows CP1251,
KOI8-R и другие) отличаются только размещением русских букв в диапазоне кодов
128…255.

4. Кодировка Windows CP1251

0
16
32
48
0
64
@
80
P
96
`
112
p
1
17
33
!
49
1
65
A
81
Q
97
a
113
q
2
18
34
"
50
2
66
B
82
R
98
b
114
r
3
19
35
#
51
3
67
C
83
S
99
c
115
s
4
20
36
$
52
4
68
D
84
T
100
d
116
t
5
21
37
%
53
5
69
E
85
U
101
e
117
u
6
22
38
&
54
6
70
F
86
V
102
f
118
v
39
160
161
162
40
163
164
41
165
166
42
167
168
43
169
170
44
171
172
45
173
174
46
175
'
Ў
ў(
Ј
¤)
Ґ
¦*
§
Ё
+
©
Є
«,
¬
®
Ї.
55
176
177
178
56
179
180
57
181
182
58
183
184
59
185
186
60
187
188
61
189
190
62
191

±

і

µ
¶:
·
ё
;

є
<
»
ј

ѕ

71
192
193
194
72
195
196
73
197
198
74
199
200
75
201
202
76
203
204
77
205
206
78
207
G
А
Б
В
H
Г
ДI
Е
Ж
J
З
И
K
Й
К
L
Л
М
M
Н
О
N
П
87
208
209
210
88
211
212
89
213
214
90
215
216
91
217
218
92
219
220
93
221
222
94
223
W
Р
С

У
Ф
Y
Х
Ц
Z
Ч
Ш
[
Щ
Ъ
\
Ы
Ь
Э]
Ю
^
Я
103
224
225
226
104
227
228
105
229
230
106
231
232
107
233
234
108
235
236
109
237
238
110
239
аg
б
в
h
г
дi
е
жj
з
и
k
й
к
лl
м
m
н
о
n
п
119
240
241
242
120
243
244
121
245
246
122
247
248
123
249
250
124
251
252
125
253
254
126
255
w
р
с

у
ф
y
х
цz
ч
ш
{
щ
ъ
|
ы
ь
э}
ю

7
128
129
130
8
131
132
9
133
134
10
135
136
11
137
138
12
139
140
13
141
142
14
143
Ђ
Ѓ

ѓ






Љ

Њ
Ќ
Ћ
Џ
23
144
145
146
24
147
148
25
149
150
26
151
152
27
153
154
28
155
156
29
157
158
30
159
ђ






˜

љ

њ
ќ
ћ
џ
ASCII

5. Вставка символа в Microsoft Word

Unicode 128..65535
ASCII (128..255)
CP1251 (128..255)

6. Фрагменты символов Unicode

7. Символы в C++

//
// объявление
объявление ии инициализация
инициализация
char
a,
b;
char a, b;
//
// посмотреть
посмотреть кодировку
кодировку
for
for (int
(int ii == 0;
0; ii << 256;
256; i++)
i++)
printf("%c",
printf("%c", ii );
);
aa == '7';
'7';
printf("%c",
a);
printf("%c",
a);
printf("Code
printf("Code page
page #866:\n");
#866:\n");
setlocale(LC_ALL,
setlocale(LC_ALL, ".866");
".866"); //
// по
по умолчанию,
умолчанию, можно
можно не
не указывать
указывать
bb == (char)55;
(char)55; //
// то
то же
же самое
самое
printf("%c",
b);
printf("%c",
b);
for
for (int
(int ii == 128;
128; ii << 256;
256; i++)
i++)
printf("%c",
printf("%c", ii );
);
printf("\n\nCode
printf("\n\nCode page
page #1251:\n");
#1251:\n");
setlocale(LC_ALL,
setlocale(LC_ALL, ".1251");
".1251"); //
// или
или setlocale(LC_ALL,
setlocale(LC_ALL, "Russian")
"Russian")
for
for (int
(int ii == 128;
128; ii << 256;
256; i++)
i++)
printf("%c",
printf("%c", ii );
);

8. Строки в C++

char
char
s[0]
s[0]
s[1]
s[1]
s[2]
s[2]
s[3]
s[3]
s[4]
s[4]
s[5]
s[5]
s[6];
s[6];
== 72;
72;
== 101;
101;
== 108;
108;
== 108;
108;
== 111;
111;
== 0;
0;
char
char
s[0]
s[0]
s[1]
s[1]
s[2]
s[2]
s[3]
s[3]
s[4]
s[4]
s[5]
s[5]
s[6];
s[6];
== 'H';
'H';
== 'e';
'e';
== 'l';
'l';
== 'l';
'l';
== 'o';
'o';
== 0;
0;
char
char s[]
s[] == "Hello";
"Hello";
for
(int
for
(int ii == 0;
0; ii << 5;
5; i++)
i++)
printf("What's
printf("What's your
your name?
name? ");
");
printf("%d",
s[i]
);
printf("%d",
s[i]
);
char
char x[20];
x[20];
scanf("%s",
scanf("%s", x);
x);
printf("Hi,
%s!",
printf("Hi, %s!", x);
x);
for
for (int
(int ii == 0;
0; ii << 5;
5; i++)
i++)
printf("%c",
s[i]
);
printf("%c", s[i] );
printf("%s",
printf("%s", ss );
);

9. Строки в C++ – нуль-терминированные

//
эксперимент!
//
эксперимент!
//
строка
из
символов
//
из
//
строка
из двух
двух
символов
// строка
строка
из двух
двух символов
символов
//
найти
длину
строки
//
строки
//
найти
длину
строки
// найти
найти длину
длину
строки
char
s[]
== "Hello,
World!";
char
s[]
"Hello,
World!";
//
для
продвинутых:
создание
своей
функции
//
для
продвинутых:
создание
своей
функции
char
a[1]='i';
a[2]=0;
char
== "Hi";
char a[3];
a[3]; a[0]='H';
a[0]='H';
a[1]='i';
a[2]=0;
char a[]
a[]
"Hi";
printf("Введите
текст:
");
printf("Введите
текст:
");
printf("Введите
текст:
");
printf("Введите
текст:
");
int
mystrlen(char
s[])
int mystrlen(char s[])
>
char
t[2000];
char
char
t[2000];
char t[2000];
t[2000];
printf("Вариант
1:
%s\n",
printf("Вариант
1: символа
%s\n", s);
s);
{
{
g.h
//
строка
из
одного
//
строка
из
одного
символа
n
//
строка
из
одного
символа
//
строка
из
одного
символа
i
scanf("%s",
scanf("%[^\n]s",
t);
scanf("%[^\n]s",
scanf("%s",
scanf("%[^\n]s",
t);
scanf("%[^\n]s", t);
t);
str
ii ==t);
0;
int
0; t); b[1]=0;
char
b[2];
b[0]='!';
char
charint
b[2];
b[0]='!';
b[1]=0;
char b[]
b[] == "!";
"!";ude <
s[5]
== 0;
s[5]
0; i++)
for(;;
for(;;
i++)
ncl
i
#
int
ii == 0;
intprintf("Вариант
0;
2:
s);
printf("Вариант
2: %s\n",
%s\n",
s);
if
(s[i]==0)
break;
ifстрока
(s[i]==0)
break;
//
пустая
(без
текста)
//
//
пустая
строка
(без
текста)
// пустая
пустая строка
строка (без
(без текста)
текста)
for(;;
i++)
for(;;
i++)
return
i;
return
i;
char
c[1];
c[0]=0;
char
c[]
=
"";
char
c[0]=0;
char c[] = "";
if
(t[i]==0)
break;
ifc[1];
(t[i]==0)
break;
== '!';
s[5]
'!';
}} s[5]
printf("Вариант
printf("Вариант 3:
3: %s\n",
%s\n", s);
s);
printf("В
тексте
%d
символов!",
printf("В
тексте %d символов!", i);
i); printf("В
printf("В тексте
тексте %d
%d символов!",
символов!", strlen(t));
strlen(t));
void
void main()
main()
{{
printf("Введите
printf("Введите текст:
текст: ");
");
char
t[2000];
char t[2000];
scanf("%1999[^\n]s",
scanf("%1999[^\n]s", t);
t);
printf("В
printf("В тексте
тексте %d
%d символов!",
символов!", mystrlen(t));
mystrlen(t));
}}

10. Перевод в шестнадцатеричную систему счисления

char
char s[8];
s[8];
printf("Введите
printf("Введите положительное
положительное целое:
целое: ");
");
int
i=0;
intprintf("Введите
i=0;
положительное
");
printf("Введите
положительное целое:
целое:
");
int
int n;
n;
int
int n;
n;
scanf("%d",
scanf("%d", &n);
&n);
do
{{
do scanf("%d",
&n);
scanf("%d",
&n);
printf("Шестнадцатеричная
printf("Шестнадцатеричная запись:\n");
запись:\n");
int
int xx == nn %% 16;
16;
printf("Шестнадцатеричная
запись:\n");
printf("Шестнадцатеричная
запись:\n");
do
nn == nn // 16;
do {{
16;
do
{{
do
int
char
int xx == nn %% 16;
16;
char z;
z;
int
x
=
n
%
16;
int
x
=
n
%
16;
if(
nn == nn // 16;
if( x<10
x<10 ))
16;
nnz === nn'0'
// 16;
16;
z = '0' ++ x;
x;
char
z;
char z;
printf("%d\n",
printf("%d\n", xx );
);
else
else
if(
if( x<10
x<10 ))
zz == 'A'
+
x
10;
'A' + x - 10;
zz == '0'
'0' ++ x;
x;
}} s[i]
while
(n>0);
while
(n>0);
s[i] == z;
z;
else
else
i++;
i++;
zz == 'A'
'A' ++ xx -- 10;
10;
}} while
while (n>0);
(n>0);
printf("%c\n",
z
);
printf("%c\n", z );
//
// после
после цикла
цикла ii -- количество
количество полученных
полученных цифр
цифр
}} while
while (n>0);
(n>0);
//
// переворачиваем
переворачиваем содержимое
содержимое строки
строки
for(int
for(int j=0;
j=0; j<i/2;
j<i/2; j++)
j++)
{{
char
char cc == s[j];
s[j];
s[j]=
s[j]= s[i-j-1];
s[i-j-1];
s[i-j-1]
s[i-j-1] == c;
c;
}}
s[i]=0;
s[i]=0; //
// терминируем
терминируем строку
строку ии выводим
выводим
printf("%s",
printf("%s", s);
s);

11. Подсчёт слов, начинающихся с заглавной буквы

printf("Input
text:
");
printf("Input
text:
");
printf("Input
text:
");
printf("Input
text:
");
//
оптимальное
решение:
//
оптимальное
решение:
char
s[2000];
char
s[2000];
char
s[2000];
char
s[2000];
//
добавить
перед
// заранее
заранее
добавить
перед текстом
текстом лишний
лишний пробел
пробел
scanf("%[^\n]s",
s);
scanf("%[^\n]s",
s);
scanf("%[^\n]s",
s);
scanf("%[^\n]s",
s);
printf("Input
printf("Input text:
text: ");
");
char
s[2000]
= " ";
char
s[2000]
int
count
== 0;
int
count
0; = " ";
int
count;
int
count;
scanf("%[^\n]s",
s+1);
scanf("%[^\n]s",
s+1);
for(int
i=0;
i<strlen(s)-1;
i++)
for(int
i=0; буквой
i<strlen(s)-1;
i++)отдельно
//
разбираемся
// сс первой
первой
буквой
разбираемся
отдельно
if
(
s[i]=='
'
&&
s[i+1]>='A'
&&
if
(
s[i]=='
'
&&
s[i+1]>='A'
&& s[i+1]<='Z'
s[i+1]<='Z' ))
if
(( count
s[0]>='A'
&&
if
s[0]>='A'
&& s[0]<='Z'
s[0]<='Z' ))
int
=
0;
int
count
=
0;
count++;
count++;
count
== 1;
count
1;i<strlen(s)-1;
for(int
i=0;
for(int
i=0;
i<strlen(s)-1; i++)
i++)
else
else if
' &&
&&bys[i+1]<='Z'
))
if (( s[i]=='
s[i]=='
&& s[i+1]>='A'
s[i+1]>='A'
printf("There're
%d
that
aa capital
count);
printf("There're
%d' words
words
that start
start&&
bys[i+1]<='Z'
capital letter\n",
letter\n",
count);
count
== 0;
countcount++;
0;
count++;
for(int
i=0;
i++)
for(int
i=0; i<strlen(s)-1;
i<strlen(s)-1;
i++)start
printf("There're
%d
printf("There're
%d words
words that
that
start by
by aa capital
capital letter\n",
letter\n", count);
count);
if
(
s[i]=='
'
&&
s[i+1]>='A'
&&
s[i+1]<='Z'
)
if ( s[i]==' ' && s[i+1]>='A' && s[i+1]<='Z' )
count++;
count++;
printf("There're
printf("There're %d
%d words
words that
that start
start by
by aa capital
capital letter\n",
letter\n", count);
count);

12. Использование string.h

printf("Guess
printf("Guess my
my name?
name? ");
");
printf("Login:
char
name[50];
printf("Login:
");
char
name[50]; ");
char
scanf("%s",
name);
char login[200];
login[200];
scanf("%s",
name);
scanf("%s",
scanf("%s", login);
login);
//
конвертирование
// конвертирование всех
всех букв
букв вв нижний
нижний регистр
регистр
//
проверка
наличие
подстроки
//
"KaTe"
->
//например,
проверка на
на
наличие
подстроки
//
например,
"KaTe"
-> "kate"
"kate"
if(
strlwr(name);
if( strstr(login,
strstr(login, "putin")!=NULL
"putin")!=NULL ))
strlwr(name);
{{
printf("Unknown
error.
//
на
printf("Unknown
error. Terminating...");
Terminating...");
// проверка
проверка
на равенство
равенство
return;
if(
strcmp(name,
"stacy")==0
return;
if( strcmp(name,
"stacy")==0 ))
}} printf("Correct!!!");
printf("Correct!!!");
else
else
...
...printf("Not
printf("Not exactly...");
exactly...");
#incl
ude
<stri
ng.h
>

13. Использование string.h

#incl
ude
//
// Задача:
Задача: вв строке,
строке, содержащей
содержащей путь
путь ии имя
имя файла,
файла,
//
// изменить
изменить расширение
расширение вв имени
имени файла
файла на
на "txt"
"txt"
printf("Введите
printf("Введите имя
имя файла:
файла: ");
");
char
char filename[200];
filename[200];
scanf("%[^\n]s",
scanf("%[^\n]s", filename);
filename);
int
n
=
strlen(filename);
int n = strlen(filename);
printf("Длина
printf("Длина строки:
строки: %d\n",
%d\n", nn );
);
<stri
ng.h
//
// отсечение
отсечение расширения
расширения вручную
вручную
int
j=-1;
int
j=-1;
//
расширения
// отсечение
отсечение
расширения сс помощью
помощью strrchr
strrchr
for(int
i=n-1;
i>=0;
i--)
for(int
i=n-1;
i>=0;
i--)
char
char *p;
*p;
if
(filename[i]=='.')
if
(filename[i]=='.')
//
первой
// поиск
поиск
первой точки
точки при
при просмотре
просмотре справа-налево
справа-налево
j
=
i;
j
=
i;
pp == strrchr(filename,
strrchr(filename, '.');
'.');
if(
p!=NULL
)
if( p!=NULL )
if(
if( j>-1
j>-1
*p
*p ==))0;
0; //
// затираем
затираем точку
точку кодом
кодом конца
конца строки
строки
filename[j]
=
0;
filename[j] = 0;
printf("Имя
printf("Имя файла
файла без
без расширения:
расширения: %s\n",
%s\n", filename);
filename);
strcat(filename,
strcat(filename, ".txt");
".txt");
printf("Имя
файла
printf("Имя файла сс новым
новым
//
// приклеиваем
приклеиваем новое
новое расширение
расширение
расширением:
%s\n",
filename);
расширением: %s\n", filename);
>

14. Домашнее задание

Подсчитать количество «слов» в тексте, который введёт
пользователь. За «слово» считать любую последовательность
символов, не содержащую пробелов.
Пример текста: Точка (x1; y1) находится в … квадранте.
Ответ: в этом тексте 7 «слов»
Очевидная структура алгоритма:
• общий цикл, пока не кончится текст
• цикл пропуска пробелов (одного или нескольких идущих подряд)
• цикл пропуска не-пробелов (составляющих «слово»)
• инкрементирование счётчика слов
English     Русский Rules