Символы и строки

Упражнения

A: ASCII-код символа

Считайте со стандартного ввода символ и выведите его ASCII-код. Решите эту задачу с использованием только одной переменной типа char.

Программа получает на вход один символ с ASCII кодом от 33 до 126.

Ввод Вывод
A
65

B: Символы в заданном интервале

Выведите подряд, без пробелов, все символы, лежащие в таблице ASCII между двумя заданными символами.

Программа получает на вход один символ с ASCII-кодом от 33 до 126, являющийся начальным символом интервала и число от 33 до 126, являющееся ASCII-кодом символа, завершающего интервал.

Ввод Вывод
A 68
ABCD
0 57
0123456789

C: is_digit

Для данного символа, считанного со стандартного ввода, проверьте, является ли он цифрой.

Решение оформите в виде функции bool is_digit(char c). В решении нельзя использовать циклы. В решении нельзя использовать константы с неочевидным значением типа 48 или 57.

Сдайте на проверку только тело функции.

Вызов функции Возвращаемое значение
is_digit('0')
true
is_digit('A')
false

D: to_lower

Дана строка, переведите все символы этой строки в нижний регистр (английские буквы меняются, все остальные символы не меняются).

Решение оформите в виде функции void to_lower(string & s), получающей в качестве параметра строку по ссылке и изменяющая символы этой строки.

Сдайте на проверку только тело функции.

Код Вывод
string s = "Hello, world!";
to_lower(s);
cout << s << endl;
hello, world!

E: substr

Дана строка и параметры \(i\), \(k\). Напишите функцию, которая возвращает подстроку данной строки, начиная с символа с индексом \(i\) и длиной \(k\).

Решение оформите в виде функции string substr(const string & s, int i, int k).

Сдайте на проверку только тело функции.

Если \(i<0\), или \(i\ge s.size()\) или \(k<0\), то функция должна возвращать пустую строку.

Если \(i+k\ge s.size()\), то возвращается строка длиной \(s.size() - i\), то есть до конца строки.

Код Вывод
cout << substr("abcdefghijk", 2, 4) << endl;
cdef
cout << substr("abcdefghijk, 6, 10000) << endl;
ghijk

F: erase

Дана строка и параметры \(i\), \(k\). Напишите функцию, которая удаляет из данной строки подстроку начиная с символа с индексом \(i\) и длиной \(k\).

Решение оформите в виде функции void erase(string & s, int i, int k), которая модифицирует данную строку, не возвращая значения.

Если \(i<0\), или \(i\ge s.size()\) или \(k<0\), то функция не модифицирует исходную строку.

Если \(i+k\ge s.size()\), то удаляются все символы начиная с \(i\)-го до конца строки.

Программа не должна использовать дополнительные вспомогательные строки.

Сдайте на проверку только тело функции.

Код Вывод
string s = "abcdefghijk";
erase(s, 2, 4);
cout << s << endl;
abghijk
string s = "abcdefghijk";
erase(s, 6, 10000);
cout << s << endl;
abcdef

G: insert

Дана строка \(s\), параметр \(i\), другая строка \(t\). Напишите функцию, которая вставляет в данную строку \(s\) начиная с индекса \(i\) строку \(t\).

Решение оформите в виде функции void insert(string & s, int i, const string & t), которая модифицирует данную строку, не возвращая значения.

Если \(i\lt0\) или \(i\gt s.size()\), функция не модифицирует исходную строку.

Программа не должна использовать дополнительные вспомогательные строки.

Сдайте на проверку только тело функции.

Код Вывод
string s = "abcde";
insert(s, 2, "xyz");
cout << s << endl;
abxyzcde

H: Извлечь цифры

Дана строка, возможно, содержащая пробелы. Извлеките из этой строки все символы, являющиеся цифрами и составьте из них новую строку. Решение оформите в виде функции string extract_digits(const string & s), получающей на вход исходную строку s и возвращающую новую строку, содержащую только цифры данной строки.

Указание. Заведите строку Answer, пройдите по всем символам данной строки, при обнаружении цифры добавляйте ее в конец строки Answer, увеличивая ее размер на 1. По завершении цикла верните значение Answer.

Сдайте на проверку только тело функции.

Код Вывод
string s = "2+2=4";
cout << extract_digits(s) << endl;
224

I: Палиндром

Дано слово, состоящее только из заглавных и строчных латинских букв. Проверьте, верно ли что это слово читается одинаково как справа налево, так и слева направо (то есть является палиндромом), если считать заглавные и строчные буквы не различающимися.

Решение оформите в виде функции bool is_palindrome(const string & s). При решении этой задачи нельзя пользоваться вспомогательными массивами или строками.

Сдайте на проверку только тело функции.

Вызов функции Возвращаемое значение
is_palindrome("Radar")
true
is_palindrome("true")
false

J: Значение выражения - 1

Дана строка, состоящая из n цифр, между которыми стоит n-1 знак операции, каждый из которых может быть либо +, либо -. Вычислите значение данного выражения.

Решение оформите в виде функции int eval(const string & s).

Сдайте на проверку только тело функции.

Вызов функции Возвращаемое значение
eval("1+2-3")
0

K: str_to_int

Дана строка, содержащее запись в виде символов целого числа от \(0\) до \(10^9-1\). Определите значение этого числа в виде переменной int. Решение задачи оформите в виде функции int str_to_int(const string & s).

Сдайте на проверку только тело функции.

Вызов функции Возвращаемое значение
str_to_int("179")
179

L: int_to_str

Дана целое число от \(-10^9+1\) до \(10^9-1\). Запишите это число в строку, то есть выполните преобразование, обратное предыдущей задаче (но только допускаются отрицательные числа).

Решение задачи оформите в виде функции string int_to_str(int n).

Сдайте на проверку только тело функции.

Код Вывод
string s = int_to_str(-179);
cout << s << endl;
-179

M: Шифр Цезаря

В шифре Цезаря каждый символ заменяется на другой символ, третий по счету в алфавите после данного, с цикличность. То есть символ A заменяется на D, символ B - на E, символ C - на F, ..., символ Z на C. Аналогично строчные буквы заменяются на строчные буквы. Все остальные символы не меняются.

Дана строка, зашифруйте ее при помощи шифра Цезаря. Решение оформите в виде функции void caesar_cipher(string & s).

Сдайте на проверку только тело функции.

Указание: сделайте функцию char caesar_cipher(char c), шифрующую один данный символ.

Код Вывод
string s = "In a hole in the ground there lived a hobbit.";
caesar_cipher(s);
cout << s << endl;
Lq d kroh lq wkh jurxqg wkhuh olyhg d kreelw.

N: Количество слов

Дана строка, возможно, содержащая пробелы. Определите количество слов в этой строке. Слово — это несколько подряд идущих букв (как заглавных, так и строчных).

Решение оформите в виде функции int count_words(const string & s). При решении этой задачи нельзя пользоваться дополнительными строками и массивами.

Сдайте на проверку только тело функции.

Вызов функции Возвращаемое значение
count_words("Yesterday, all my troubles seemed so far away")
8

O: Самое длинное слово

Дана строка. Найдите в этой строке самое длинное слово и выведите его. Если в строке несколько слов одинаковой максимальной длины, выведите первое из них. Решение оформите в виде функции string longest_word(const string & s).

Сдайте на проверку только тело функции.

Код Вывод
cout << longest_word("In a hole in the ground there lived a hobbit.") << endl;
ground

P: Слова с прописной буквы

Дана строка. Измените регистр символов в этой строке так, чтобы первая буква каждого слова была заглавной, а остальные буквы - строчными.

Решение оформите в виде функции void capitalization(string & s).

Сдайте на проверку только тело функции.

Код Вывод
string s = "In a hole in the ground there lived a hobbit.";
capitalization(s);
cout << s << endl;
In A Hole In The Ground There Lived A Hobbit.

Q: Значение выражения - 2

Дано выражение одно из следующих видов: “A+B”, “A-B” или “A*B”, где A и B - целые числа от 0 до 109. Определите значение этого выражения.

Решение оформите в виде функции long long eval(const string & s).

Сдайте на проверку только тело функции.

Вызов функции Возвращаемое значение
eval("2*2")
4
eval("100-101")
-1

R: Поиск подстроки

Даны две строки, возможно, содержащие пробелы. Выведите слово YES, если первая строка является подстрокой второй строки или слово NO в противном случае.

Решение оформите в виде функции bool is_substring(const string & pattern, const string & source).

Сдайте на проверку только тело функции.

От вас не требуется писать реализацию Кнута–Моррисса–Пратта, Рабина–Карпа или Ахо–Корасик.

Вызов функции Возвращаемое значение
is_substring("hole in the ground", "In a hole in the ground there lived a hobbit.")
true
is_substring("hole on the ground", "In a hole in the ground there lived a hobbit.")
false

S: Значение выражения - 3

Дана строка, содержащая одно или более целых чисел от 0 до 109, разделенных знаками “+” или “-”. Вычислите значение этого выражения.

Решение оформите в виде функции eval(const string & s).

Сдайте на проверку только тело функции.

Вызов функции Возвращаемое значение
eval("21+7-10")
18

T: Значение выражения - 4

Строка состоит из целых чисел, принимающих значения от 0 до 109, разделенных знаками операций “+”, “-” и “*”. Вычислите значение этого выражения выполняя действия по правилам арифметики.

Тесты к этой задаче закрытые.

Ввод Вывод
10-2*3
4