Лабораторная работа №5. Работа с указателями

Максимальная оценка за это задание: 3 балла, по одному за каждые две задачи.

Часть 1. Указатели и C-строки

Решения задач оформлять в виде отдельных функций в файле cPointers.cpp . В файле main.cpp необходимо продемонстрировать работу полученных функций:

  • сначала должна следовать порция assert для всех полученных функций;
  • далее реализовать сценарий: запрос у пользователя, задание с каким номером он хочет проверить, в зависимости от его ответа  оператор switch  выполняет запуск нужной функции, 0 для выхода.

Проверки assert нужно писать непосредственно после завершения реализации каждой функции.

Обращаться к элементам строки, используя индекс  запрещено

C-строка - это массив элементов типа char. Объявляется следующим образом:

	char s[20];
s - имя переменной, в скобках - размер строки. однако размер массива будет больше на единицу, так как строки в C заканчиваются символом \0 — нуль терминатор (нулевой байт: байт, все биты которого равны 0). Для ввода C-строки с клавиатуры используем следующую запись
std::cin.getline(s, 20);  // 20 — количество вводимых символов

C-строку в качестве параметра функции указываем следующим образом

int countDigits(char * str);

Обращение к функции следующее:

countDigits("какая-то строка");

Обход элемента производим с помощью цикла вида:

	for (; *str != 0; ++str){
                   // Для обращения к символу строки используем разыменование *str
            }
или
	while(*str){
                 /*тело цикла*/
                 str++;//переход на следующий элемент
             }

  1. Дана строка. Подсчитать количество содержащихся в ней цифр.

    int countDigits(char * str);
  2. Дана строка. Определите указатель на ее последний символ. Верните «нулевой указатель» (число 0 или nullptr), если строка пустая.

    char * findLastChar(char * str);

    В печати результата данной функции на консоль удобно использовать тернарную условную операцию: 1) сохранить результат в переменной, 2) выводить значение этой переменной если она не равна 0/nullptr и сообщение типа <пустая строка> в противном случае. Всё это, конечно, делается внутри main.

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

    void reverseString(char * str);

    Указание: при проверке в assert следует использовать стандартную функцию сравнения строк strcmp. Вы должны самостоятельно определить принцип работы данной функции (в том числе, смысл возвращаемого значения) с помощью чтения документации на английском языке — это является частью задачи.

  4. Дана строка, которая содержит представление целого положительного числа, записанного в десятичной системе счисления. Вернуть соответствующее число.

    int strToInt(char * str);

    Указание: чтобы перевести цифровой символ C в соответствующее число от 0 до 9, необходимо вычесть из него код символа нуля: C - '0'.

Часть 2. Указатели и массивы

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

template<class T>
void printArray(T *a, int n) {//T *a - указание параметра-массива; a - указатель на первый элемент; 
	T *begin = a;    // создаём указатель на первый элемент
        T *end = a + n; 
        while(begin!=end) {
              std::cout << *begin++ << " "; // begin++ - переход на следующий элемент массива, * - оператор разыменования
         }
         cout<<endl;
}

Также можно использовать цикл типа for:

for(T *begin = a; begin != a+n; begin++) {}

Решите следующие задачи, не пользуясь операцией индексации массива []:

  1. Дан массив целых чисел. Обнулить каждый второй его элемент.

  2. Дан массив целых чисел. Найти и обнулить максимальный элемент