char* strchr(char *str, char ch)
{
for (;*str != '\0'; ++str)
{
if(*str == ch)
{
return str;
}
}
return NULL;
}
Задача №3: Напишите код для поиска второго вхождения символа в строку. Этот код должен использовать функцию strchr и не должен содержать циклов.char *first;
char *second = NULL;
first = strchr(str, ch);
if (first != NULL) < - если first указывает на NULL - это значит, что символ ch не был найден и искать его второе вхождение не нужно
{
second = strchr(first+1, ch); < - здесь мы передаем в качестве параметра указатель на элемент строки, следующий за первым вхождением символа ch
}
Задача №4: В языке C++, в отличие от C, невозможно скомпилировать вызов функции, объявление (или определение) которой недоступно в момент компиляции.foo(int a); - объявление функции foo
foo('a'); - вызов
В этом случае компилятор сделает предположение о типе аргумента,приняв его за char.
int **M = new int*[N];
int *tmp = new int[N*N];
for (int i = 0; i < N; ++i)
{
M[i] = tmp + i*N;
}
Задача №6: Напишите код, который освобождает память, выделенную в предыдущей задаче.
delete[] tmp;
delete[] M;
в случае если переменная tmp не видна в момент удаления,то освобождать память нужно следующим образом:
delete[] M[0];
delete[] M;
В этой ситуации порядок вызовов функции delete должен быть именно такой, т.к после удаления массива M мы не можем обратиться к его нулевому элементу M[0].
int *array = new int[size];
array[i] = ...
...
delete[] array;
Array a(10);
Шаг 1:
В файле array.h заведем класс Array c 2 полями:class Array { int mySize; < - размер массива int *myData; < - массив };Note: Хорошим стилем считается в своих классах имена всех переменных начинать с "my", чтобы не возникало путаницы своих и чужих классов
Array a; ... = a.mySize; a.myData = ...Таким образом мы решили задачу №3: не перепутать размер массива.
Шаг 2:
Теперь добавим в наш класс специальные методы: конструктор и деструктор.Array( int size); < - конструктор ~Array(); < - деструкторКонструктор будет корректно отводить место в памяти под объект и инициализировать переменные класса. Деструктор будет вызываться автоматически при удалении объекта, например, при закрытии фигурных скобок, в которых был инициализирован объект, и правильно освобождать память.
Array :: Array(int size) { mySize = size; myData = new int[mySize]; } Array :: ~Array() { delete[] myData; }С спомощью конструктора и деструктора мы решили проблемы 1 и 4.
Шаг 3:
Для решения проблемы корректного обращения к элементам массива напишем методы get и set, которые будут проверять, что действия "положить элемент в массив" и "получить элемент из массива" обращаются к индексам в пределах массива.int Array :: getValue(int index) { if((index < 0) || (index >= mySize)) { return -1; } return myData[index]; } void Array :: setValue(int index, int value) { if ((index < 0) || (index >= mySize)) { return ; } myData[index] = value; }Comments: внутри if в методах get и set подразумевается любое адекватное действие для случая некорректного обращения к массиву.
Шаг 4: Права доступа.
У всех членов класса (члены класса - поля и методы) есть права доступа.По умолчанию все они private, т.е. доступны только внутри своего класса.class Array { private: int mySize; int *myData; public: Array(); ~Array(); int getValue(int index); void setValue(int index ,int ch); };Note: Хороший стиль программирования подобных классов подразумевает объявление всех полей как private, а всех методов как public.
int Array :: getSize() { return mySize; }Comments:единственный минус в выделении функции getSize() вместо прямого обращения - это быстродействие. Мы позже обсудим, что с этим делать.
class Array { private: int mySize; int *myData; public: Array(); ~Array(); int getValue(int index); void setValue(int index ,int ch); int getSize(); };
Array :: Array(int size) { mySize = size; myData = new int[mySize]; } Array :: ~Array() { delete[] myData; } int Array :: getValue(int index) { if((index < 0) || (index >= mySize)) { return -1; } return myData[index]; } void Array :: setValue(int index, int value) { if ((index < 0) || (index >= mySize)) { return ; } myData[index] = value; } int Array :: getSize() { return mySize; }