Заняття 7 і 8

Висновок міг би бути приблизно таким:

Справедливо тотожність: вираз a == * (a). де a будь-якого типу - завжди істинно.

З урахуванням того, що в масиві всі елементи розташовуються в пам'яті послідовно, почавши з покажчика, спрямованого на початковий елемент, ми зможемо обійти всі елементи масиву, зміщуючи покажчик на кожному кроці вправо на мінімально можливу дистанцію (тобто, на сусідній праворуч елемент відповідного типу ). Зсув покажчика може проводитися за допомогою операторів інкремента і декремента.

У наступному прикладі всі елементи масиву будуть виведені на екран без використання індексів (зверніть увагу, що при цьому параметри циклу можуть бути будь-якими, аби цикл виконався потрібну кількість разів, тобто саме значення лічильника i не використовується в ролі індексу масиву всередині циклу ):

Над безліччю покажчиків в C ++ визначено ряд операцій:

  • p + n. де p - покажчик, n - ціле позитивне число. Результат - деякий покажчик, отриманий зміщенням p на n позицій вправо.
  • p-n. де p - покажчик, n - ціле позитивне число. Результат - деякий покажчик, отриманий зміщенням p на n позицій вліво.
  • p-q. де p і q - покажчики на один і той же тип. Результат - ціле число, що дорівнює кількості кроків, на яке потрібно змістити q вправо, щоб він досяг покажчика p, також цей результат можна називати "відстанню" між покажчиками, воно може бути і негативним, якщо елемент, на який спрямований покажчик q розташований правіше ( тобто, далі), ніж елемент, на який спрямований покажчик p.
  • p ++ (інкремент), p-- (декремент), де p - покажчик. Операції еквівалентні діям p = p + 1 і p = p-1, відповідно.

Справедливо тотожність: вираз a [i] == * (a + i) завжди істинно (тобто зліва і справа записані еквівалентні вирази), де a покажчик на масив будь-якого типу і i допустимий індекс цього масиву. Користуючись цим тотожністю легко переходити від індексів до покажчиків і назад при роботі з масивом.

Константні покажчики і покажчики на константи

У C ++ існують спеціальні види покажчиків:

Приклад, в якому зустрічаються всі види покажчиків:

Символьні масиви (рядки)

Саме це дозволяє нам відправляти на висновок символьний масив, не передаючи методу cout його розміру.

Ознакою закінчення виведення є символ нуля-термінатора ( '\ 0').

Метод cin в якості свого аргументу також може приймати покажчик на символьний масив, куди буде записаний рядок введена з клавіатури, при цьому, за останнім елементом рядка метод cin автоматично розмістить нуль-термінатор. Більш того, при завданні строкової константи (коли рядок явно задається в подвійних лапках в коді програми), слідом за останнім символом у рядку також автоматично розміщується нуль-термінатор. Відповідно, довжина рядка буде на один символ більше, ніж ми явно вкажемо.

Обійти рядок, звернувшись окремо до кожного її символу, можна приблизно так (в даному випадку ми виведемо на окремому рядку кожен символ і його код по символьної таблиці):

Цього ж результату можна було досягти більш витончено (але менш зрозуміло), поєднавши ряд операцій (розіменування, інкремент, автопріведеніе до bool) в одному рядку:

Висновок буде таким:

Приклад програми, яка підрахує і виведе на екран кількість символів в рядку, введеної користувачем з клавіатури:

Написати програму, яка створює масив з 10 випадкових цілих чисел з відрізка [-50; 50]. Вивести на екран весь масив і на окремому рядку - значення мінімального елемента масиву.

Для обходу масиву використовувати покажчики (заборонено звертатися до елементів масиву за індексами).

Написати програму, підраховують і виводить на екран кількість прогалин, що містяться в введеної користувачем з клавіатури рядку, довжиною не більше 80 символів.

Написати програму, підраховують і виводить на екран кількість цифр, що містяться в введеної користувачем з клавіатури рядку, довжиною не більше 80 символів.

Написати програму, яка змінює в рядку не довше 80 символів, введеної користувачем з клавіатури, усі великі латинські літери на малі.

Написати програму, яка (без використання бібліотечних функцій для обробки рядків), копіювала б рядок введену користувачем з клавіатури в нову (максимальна довжина рядка - 80 символів). При цьому в процесі копіювання повинні відкидатися все незначні прогалини на початку і кінці рядка, а також кілька поспіль прогалин повинні замінюватися на один. Вивести вихідну і нову рядки на екран.

Для обходу рядків використовувати покажчики.

Написати програму, яка для введеної з клавіатури рядка (максимальна довжина рядка - 80 символів) повідомляє, яка цифра в ній зустрічається найчастіше, або повідомляє, що цифри в рядку зовсім відсутні.

Якщо з однаковою частотою в рядку зустрілося кілька цифр, то в якості лідера вивести будь-яку з відповідних цифр. Для обходу рядків використовувати покажчики.

  • Для введеної користувачем з клавіатури рядка (максимальна довжина рядка - 80 символів) програма повинна визначити, чи коректно розставлені круглі дужки чи ні. Тобто в рядку не повинна зустрічатися закриває кругла дужка раніше, ніж відповідна їй закриває. Приклади коректних рядків: (). (A + b + (a-c)). Приклад некоректної рядки: ((a + b).) A + b (. (A + b + (c-a)).
  • Для введеної користувачем з клавіатури рядка (максимальна довжина рядка - 80 символів) програма повинна визначити, чи коректно розставлені круглі, фігурні і квадратні дужки чи ні. Перемішування дужок (приклад: «]») вважається некоректним варіантом.