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;
}