Статья Автор: Лебедев Дмитрий

Конспект 10. Символы


C++_Символы. Часть 1

Для хранения символов в языке С++ используется тип данных char.

Рассмотрим работу с символами на следующем примере. Дано время в формате hh:mm (12:34). Считаем данную запись средствами языка C++:

char c;
int h, m;
cin >> h >> c >> m;

Каждый символ в языке С++ кодируется числом (кодом). Выведем на экран код символа для переменной c из примера выше:

cout << (int) c;

Пусть у нас есть переменная x целочисленного типа, в которой хранится код символа. Выведем на экран сам символ с данным кодом:

cout << (char) x;

Коды первых 128 символов можно узнать из таблицы ASCII (American standard code for information interchange). Приведём коды всех основных символов, включая все буквы латинского алфавита, цифры и знаки препинания:

32 (пробел) 48 0 64 @ 80 P 96 ` 112 p
33 ! 49 1 65 A 81 Q 97 a 113 q
34 " 50 2 66 B 82 R 98 b 114 r
35 # 51 3 67 C 83 S 99 c 115 s
36 $ 52 4 68 D 84 T 100 d 116 t
37 % 53 5 69 E 85 U 101 e 117 u
38 & 54 6 70 F 86 V 102 f 118 v
39 ' 55 7 71 G 87 W 103 g 119 w
40 ( 56 8 72 H 88 X 104 h 120 x
41 ) 57 9 73 I 89 Y 105 i 121 y
42 * 58 : 74 J 90 Z 106 j 122 z
43 + 59 ; 75 K 91 [ 107 k 123 {
44 , 60 < 76 L 92 \ 108 l 124 |
45 - 61 = 77 M 93 ] 109 m 125 }
46 . 62 > 78 N 94 ^ 110 n 126 ~
47 / 63 ? 79 O 95 _ 111 o 127 (del)

 

Символы с кодами от 0 до 31 являются специальными символами, и большинство из них в настоящее время не используется, поэтому эту часть таблицы мы не стали иллюстрировать.

Символ с кодом 32 — это пробел. После него идут знаки препинания и знаки арифметических операций.

Символы с кодами 48–57 — это цифры от 0 до 9.

Прописные буквы латинского алфавита пронумерованы подряд кодами 65–90.

Строчные буквы латинского алфавита пронумерованы подряд кодами 97–122.

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

char c;
cin >> c;
cout << c - 'a' << endl;

Преобразуем строчную букву в прописную:

cout << (char)(c - 'a' + 'A') << endl;

C++_Символы. Часть 2

Строки (последовательности символов) в языке С++ хранятся с помощью типа данных string. Считаем из консоли два слова (например, Hello World!):

string S1, S2;
cin >> S1 >> S2;

В таком случае в строке S1 окажется слово Hello, а в S2 — World!.

Напоминаем, что для использования типа данных string необходимо подключить соответствующую библиотеку:

#include <string>

Часто удобнее считывать строки не по словам (до первого пробела), а до перевода строки (строку целиком). Для этого используют функцию getline:

string S;
getline(cin, S);

При применении такого способа ввода в S окажется вся фраза Hello World!.

Лексикографический порядок строк

На множестве строк определён лексикографический порядок. Именно в таком порядке перечисляются слова в словарях или фамилии в телефонных справочниках.

Для того чтобы сравнить две строки лексикографически, необходимо идти с начала этих строк и найти первый отличающийся символ. Меньшей окажется та строка, у которой ASCII-код этого символа наименьший. Если же оказалось, что одна строка является началом другой строки, то она также является наименьшей из двух.

Например:

  • digit << dinosaur, так как символ g идёт раньше, чем n по алфавиту;
  • dig << digit, так как dig является началом строки digit.

C++_Символы. Часть 3

Задача о надёжности пароля

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

Решение

#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    string s;
    cin >> s;
    bool hasdigit = false, hasupper = false, haslower = false;
    for (int i = 0; i < s.length(); ++i){
       if (s[i] >= '0' && s[i] <= '9'){
           hasdigit = true;
       }
       if (s[i] >= 'a' && s[i] <= 'z'){
           haslower = true;
       }
       if (s[i] >= 'A' && s[i] <= 'Z'){
           hasupper = true;
       }
    }
    if (hasdigit && haslower && hasupper){
        cout << "YES";
    } else {
        cout << "NO";
    }
    return 0;
}
 

Решим эту задачу с помощью встроенных в C++ функций, помогающих определить тип символа. Данные функции находятся в библиотеке cctype.

#include <iostream>
#include <string>
#include <cctype>
using namespace std;
 
int main()
{
    string s;
    cin >> s;
    bool hasdigit = false, hasupper = false, haslower = false;
    for (char c: s){
       if (isdigit(c)){
           hasdigit = true;
       }
       if (islower(c)){
           haslower = true;
       }
       if (isupper(c)){
           hasupper = true;
       }
    }
    if (hasdigit && haslower && hasupper){
        cout << "YES";
    } else {
        cout << "NO";
    }
    return 0;
}

C++_Символы. Часть 4

Сравнение строк

Средствами C++ можно сравнивать строки лексикографически. Напишем программу, которая выводит на экран наименьшую из двух строк.

#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    string a, b;
    getline(cin, a);
    getline(cin, b);
    if (a < b){
       cout << a;
    } else {
       cout << b;
    }
    return 0;
}
 

Извлечение цифр из строки

Дана строка. Необходимо выделить все цифры из строки. Например, для строки 123aba23 45 необходимо вывести строку 1232345.

Решение

#include <iostream>
#include <string>
#include <cctype>
 
using namespace std;
 
int main()
{
    string s, d = "";
    getline(cin, s);
    for (auto c: s){
        if (isdigit(c)){
            d.push_back(c);
        }
    }
    cout << d;
    return 0;
}

Задачи для тренировки

1) ASCII-код символа

 
2) Символ с данным ASCII-кодом  
3) Сменить регистр символа  
4) Палиндром  
5) Максимальная из трёх  
6) Вставка символов  
7) Шифр Цезаря  


Печать