Для подключения русского языка в консоли С++ :
мы будем использовать функцию setlocale() внутри функции main()
#include
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
cout endl;
return 0;
}
Также, можно опустить последний аргумент функции — setlocale(LC_ALL, "Russian"); можно заменить на setlocale(0, ""); — работоспособность программы от этого не изменится.
Функция setlocale() работает только на вывод.
Тут очень важно понимать одну вещь - в языке С++ НЕТ проблем с русским языком (кирилицей), проблема есть в винде, которая до сих пор использует CP886 (по дефолту) в консоли.
#include
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
...
}
Или же setlocale (LC_ALL, "Russian_Russia.866"); (проблемы с выводом символов)
Символы
В языке C++ для хранения однобайтового символа используется тип данных char. Переменную типа char можно рассматривать двояко: как целое число, занимающее 1 байт и способное принимать значения от -128 до 127 (тип signed char, есть также беззнаковая модификация unsigned char, принимающая значения от 0 до 255) и как один символ текста.
В языке Pascal тип данных char рассматривается только как один символ текста. В зависимости от компилятора тип данных char может содержать как 256 символов (FreePascal) так и 65536 (PascalABC.NET кодировка Unicode).
В таблице ASCII представлены символы и их целочисленные значения (0 – 255). Базовая часть 0 – 127 одинаковая для всех кодировок, содержит цифры, знаки пунктуации, символы английского алфавита. Расширенная (128 – 255) – отличается, содержит символы национальных алфавитов (для русского языка – кириллица).
Символ в памяти занимает один байт (или же 2 байта для Unicode).
Объявление символьной переменной
Pascal | С++ |
ch: char;
где char – тип данных для хранения символов, ch – имя переменной типа char | char ch;
где char – тип данных для хранения символов, ch – имя переменной типа char |
Получение кода символа из таблицы ASCII и символа по коду
Pascal | С++ |
Ord(‘A’); Функция возвращает число(код символа в таблице). Примечание: в PascalABC.NET символы представлены в кодировки Unicode. Коды символов совпадают только в базовой части (0 – 127). Коды русских символов отличаются.
Chr(65); Функция возвращает символ по его коду в таблице ASCII.
Пример: Var ch: char; n: integer; Begin n := ord(‘A’); ch := chr(65); write(ch, ‘ ‘,N) End. В результате, на экране мы получим символ и его код: А 65
| int x = char (); Происходит преобразование типов char в int. В целочисленную переменную х записывается код символа. Базовая часть таблицы ASCII одинаковая для всех кодировок. В С++ расширенная часть отличается от аналогичной кодировки в Pascal.
char ch = char(); Происходит преобразование типов int в char. В символьную переменную ch записывается символ по его коду.
Пример: #include using namespace std; int main(){ char ch = char(65); int x = char ('A'); cout return 0; } Работа с русскими символами в С++ несколько отличается: cout результат получим -64, хотя код заглавной русской буквы ‘А’ – 192. Для правильного получения кода необходимо воспользоваться: unsigned char x = 'А';
Пример: #include using namespace std; int main(){ setlocale (0, ""); char ch = char(192); unsigned char x = 'А'; cout return 0; } В результате, на экране мы получим символ и его код: А 192 Переменным типа char можно и явно присваивать числовые значения. Например, можно сделать так: #include using namespace std; int main() { unsigned char c = 'A'; cout c = 126; cout return 0; } Эта программа выведет две строки: “A 65” и “~ 126”, то есть символы с ASCII-кодами 65 (A) и 126 (~) и сами ASCII-коды.
|
Функции изменения регистра символов
Pascal | C++ |
UPCASE(символ) Функция преобразовывает любой символ из строчного в прописной. Пример: ch := 'б'; ch := upcase(ch); В переменную ch будет записана большая буква «Б». | Необходимо подключение библиотеки #include
int toupper( int character ); Функция возвращает символ в верхнем регистре. В параметр функции можно записать как символ, так и число (код таблицы ASCII) Пример: ch = toupper('a'); ch = toupper(97); В обоих случаях в результате в переменную ch будет записана большая английская буква «А». Не работает с кириллицей.
int tolower ( int c ); Функция возвращает символ в нижнем регистре. В параметр функции можно записать как символ, так и число (код таблицы ASCII.
Остальные преобразования можно выполнить также с помощью функций библиотеки cctype. |
Пример 1.
С клавиатуры вводится символ. Получить символ, стоящий в таблице ASCII следующим по порядку
Pascal | C++ |
var ch: char; begin read(ch); ch := chr(ord(ch) + 1); write(ch) end. | #include using namespace std; int main(){ char ch; cin ch; ch = ch + 1; cout return 0; } |
Пример 2.
С клавиатуры вводится символ. Выяснить является ли этот символ строчной английской буквой.
Pascal | C++ |
var ch: char; begin read(ch); if (ch = 'a') and (ch 'z') then write('YES') else write('NO'); end. | Вариант 1. Воспользоваться функцией из библиотеки cctype. #include #include using namespace std; int main(){ char ch; cin ch; cout return 0; } Вариант 2. Сравнить символы. #include using namespace std; int main(){ char ch; cin ch; if (ch = 'a' && ch else cout return 0; } |
Строки
Текстовая строка - это последовательность символов. Символы в строке пронумерованы.
Pascal | С++ |
Нумерация начинается с 1. В случае попытки обратиться к номеру, превосходящему длину строки, выдается ошибка. Строка, так же как и символ, заключается в одинарные кавычки. | Нумерация начинается с 0. При обращении к несуществующему элементу строки ошибки не выдается.
Строка заключается в двойные кавычки. Признаком конца строки является нулевой символ \0. В C++ строки можно описать с помощью массива символов (массив элементов типа char), в котором следует предусмотреть место для хранения признака конца строки. |
В языке C - строкой считался массив символов, а для обозначения конца строки использовался символ с ASCII-кодом 0, что позволяло хранить строки переменной длины (то есть в массиве char[n] можно было хранить строки любой длины, не превосходящей n-1. Такой способ хранения строк порождал ряд неудобств: любая строка была ограничена по длине размером массива, а чтобы вычислить длину строки необходимо было пройти по всей строке до появления нулевого символа, то есть определение длины строки требует количество операций, пропорциональное этой длине.
В языке C++ для представления строк существует более совершенный тип данных string, в основе которого лежит такой же массив символов, завершающийся нулевым символом, но содержащий еще ряд дополнительных возможностей. Для работы со строками языка C++ необходимо в начале программы подключить описание типа string, которое находится в одноименном файле:
#include cstring
Объявление строки
Pascal | C++ |
st: string; Объявляется строка без указания длины. st1: string[10]; Максимально возможная длина строки 10 символов. Если вводимая строка имеет большую длину – остальные символы отбрасываются. Строке можно присвоить значение: St := ‘qwerty’; | string st; Строке можно присвоить значение: St = “qwerty”; |
Обращение к отдельному символу строки. К символу стоки можно обратиться так же как и к элементу массива – имя_строки[индекс символа]. Вывод символа w из строки “qwerty”.
Pascal | C++ |
st := ‘qwerty’; write(st[2]); | St = “qwerty”; Cout |
Ввод и вывод строки
Pascal | C++ |
Если вводится одна строка, возможно использовать оператор read(); Однако рекомендуется использовать оператор readln(). Пример: Readln(st);
Для вывода строк используется стандартный оператор вывода write(): write(st); | В С++ существует несколько операторов ввода строк. Cin st; Ввод осуществляется до первого пробела. Остальной ввод игнорируется. getline(cin, st); Ввод строки целиком вместе с пробелами.
Для вывода строк используется стандартный оператор вывода cout: cout |
Получение длины строки
Pascal | C++ |
Функция length() возвращает длину строки st := ‘qwerty’; write(length(st)); В результате получим число 6 | Методы size и length класса string возвращают длину строки: St = “qwerty”; cout cout st.size(); Результат в обоих случаях будет 6. Оба метода работают анаогично. |
Пример.
Дана строка. Выведите символы строки в столбик.
Pascal | C++ |
var st: string; i: integer; begin readln(st); for i := 1 to length(st) do writeln(st[i]); end. | #include #include using namespace std; int main(){ string st; getline(cin, st); for (int i = 0; i cout return 0; } |
Объединение (конкатенация) строк.
Например, при сложении строк "Hello, " и "world!" получится строка "Hello, world!".
Pascal | C++ |
var st, st2: string; begin st := 'Hello, '; st2 := 'world!'; st := st + st2; write(st); end. | #include #include using namespace std; int main(){ string st = "Hello, ", st2 = "world!"; st = st + st2; cout return 0; } |
Пример.
Дана строка. Запишите в другую строку только заглавные буквы английского алфавита, встречающиеся в строке.
Строка, в которую будет происходить запись, должна быть инициализирована!
Pascal | C++ |
var st, st_new: string; i: integer; begin st_new := ''; readln(st); for i := 1 to length(st) do if (st[i] = 'A') and (st[i] 'Z') then st_new := st_new + st[i]; write(st_new); end. | #include #include using namespace std; int main(){ string st, st_new = ""; getline(cin, st); for (int i = 0; i if (st[i] = 'A' && st[i] st_new += st[i]; cout return 0; } |
Удаление символа (подстроки) из строки
Pascal | C++ |
Удаление подстроки выполняет функция Delete(st, n, k) st – имя строки из которой удаляем n – индекс символа, с которого удаляет k – сколько символов удаляем
var st: string;
begin readln(st); Delete(st,3,4); write(st); end. | Удаление подстроки выполняет метод st.erase(n,k); удаляет из строки st, начиная с позиции n, фрагмент, состоящий из k символов. Элемент с индексом 0 – стоит на 1 позиции.
#include #include using namespace std; int main(){ string st; getline(cin, st); st.erase(3,4); cout return 0; } |
Вставка подстроки в строку
Pascal | C++ |
Функция INSЕRT (st1,st,k) – позволяет в строку str перед k позицией вставить строку st1. | Метод st.insert(k,str1); – позволяет в строку st, начиная c k позиции, вставить строку st1. |
Преобразование строки в число
Pascal | C++ |
VAL(st, x,er) Процедура преобразует численное выражение X в его строковое представление и помещает результат в st. er – переменная, в которую записывается значение ошибки – 0, если ошибки не было, 1 – если в процедуру вместе с цифрами были поданы другие символы (FreePascal возвращает номер ошибочного символа).
| Функция stoi() n = stoi(str); преобразование строки str в число n;
|
Преобразование числа в строку
Pascal | C++ |
Процедура STR(X, st) Преобразовывает число х в строку st | Функция to_string() str = to_string(n) преобразование числа n в строку str;
|
Нахождение подстроки в строке
Pascal | C++ |
Функция POS (st1,st); поиск определенного фрагмента в строке. Возвращает индекс позиции, с которой этот фрагмент начинается. var st: string; x: integer; begin readln(st); x := pos('a', st); write(st); end. В результате получим номер первого вхождения символа а в строку st. | Метод st.find () n=st.find (st1);– поиск определенного фрагмента st1 в строке st (возвращает индекс символа, с которой этот фрагмент начинается) #include #include using namespace std; int main(){ string st; int n; getline(cin, st); n = st.find('a'); cout return 0; } В результате получим индекс первого вхождения символа а в строку st |
Копирование подстроки в строку
Pascal | C++ |
COPY(st,n,k) Функция позволяет копировать фрагмент некоторой строки из одной переменной в другую. st – имя строки, из которой должен извлекаться копируемый фрагмент; n – позиция в строке, начиная с которого будет копироваться фрагмент; k – число копируемых символов. | Substr(n, k) Метод, возвращающий подстроку с n символа длиной k. Пример: St_new = st.substr(0, 5)
|