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

char *s — альтернативное обозначение char s[]

Упражнения

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

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

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

Ввод Вывод
A
65

B: Символ с данным ASCII-кодом

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

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

Ввод Вывод
65
A

C: Таблица ASCII

Выведите все символы ASCII с кодами от 33 до 126 и их коды в следующем виде:

Вывод
! 33
" 34
# 35
...
} 125
~ 126

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

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

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

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

E: is_digit

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

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

Ввод Вывод
0
YES
A
NO

F: to_upper

Напишите функцию char to_upper(char c), которая переводит символ в верхний регистр, то есть для строчной буквы латинского алфавита возвращает сооветствующую заглавную букву латинского алфавита, а для остальных символов возвращает тот же символ.

Считайте один символ со стандартного ввода и переведите его в верхний регистр. В решении нельзя использовать циклы. В решении нельзя использовать константы с неочевидным значением.

Ввод Вывод
f
F
F
F
4
4

G: Сменить регистр символа

Напишите функцию char case_change(char c), меняющую регистр символа, то есть переводящую заглавные буквы в строчные, а строчные — в заглавные, остальные символы не меняющие.

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

Ввод Вывод
f
F
F
f
4
4

H: Нижний регистр

Дана строка, возможно, содержащая пробелы. Считайте эту строку и переведите все символы этой строки в нижний регистр. Решение оформите в виде функции void to_lower (char* S), получающей в качестве параметра строку по ссылке и изменяющая символы этой строки.

Для перевода одного символа в нижний регистр напишите отдельную функцию.

Ввод Вывод
Hello, world!
hello, world!

I: Проверить строки на равенство

Даны две строки (возможно, с пробелами). Проверьте, равны ли они. Если строки равны, выведите слово YES, если строки не равны, выведите слово NO.

Решение оформите в виде функции bool is_equal(const char* S1, const char* S2).

Ввод Вывод
Hi
HI
NO
Bye
Bye
YES

J: Конкатенация

Даны две строки, не содержащие пробелов. Выведите конкатенацию этих строк.

Решение оформите в виде функции void concat(const char* s1, const char* s2, char* s3), получающей в качестве параметров две строки и сохраняющую результат в третью строку — их конкатенацию.

Ввод Вывод
abcd
xyz
abcdxyz

K: Substr

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

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

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

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

Ввод Вывод
abcdefghijk
2 4
cdef
abcdefghijk
6 10000
ghijk

L: Erase

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

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

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

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

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

Ввод Вывод
abcdefghijk
2 4
abghijk
abcdefghijk
6 10000
abcdef

M: Insert

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

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

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

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

Ввод Вывод
abcde
2
xyz
abxyzcde

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

Даны две строки. Если первая строка меньше второй в лексикографическом порядке, выведите слово less. Если первая строка больше — выведите слово greater. Если строки равны — выведите слово equal.

Решение оформите в виде функции... Операциями сравнения для строк в этой задаче пользоваться нельзя.

Ввод Вывод
banan
baobab
less

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

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

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

Ввод Вывод
2+2=4
224
[<0;65;19M

P: Палиндром

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

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

Ввод Вывод
Radar
YES
YES
NO

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

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

Решение оформите в виде функции int evaluate(const char* S).

Ввод Вывод
1+2-3
0

R: StrToInt

Дана строка, содержащее запись в виде символов целого числа от 0 до 109-1. Определите значение этого числа в виде переменной int. Решение задачи оформите в виде функции int str_to_int(const char* S).

Функция main должна быть такой:

int main()
{
  char* S;
  cin >> S;
  cout << StrToInt(S) << endl;
  return 0;
}

Ввод Вывод
179
179

S: IntToStr

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

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

Функция main должна быть такой:

int main()
{
  int n;
  cin >> n;
  cout << IntToStr(n) << endl;
  return 0;
}

Ввод Вывод
-179
-179

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

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

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

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

Ввод Вывод
In a hole in the ground there lived a hobbit.
Lq d kroh lq wkh jurxqg wkhuh olyhg d kreelw.