Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
44
Добавлен:
16.02.2016
Размер:
1.2 Mб
Скачать

Int strcmp(const char* strl, const char* str2)

После сравнения строк strl и str2 данная функция возвращает в результате одно из следующих значений:

<0 - если строка strl меньше, тем str2;

=0 - если строки эквивалентны;

>0-если строка strl больше, тем str2.

Эта функция производит сравнение, различая прописные и строчные буквы. Следующий пример иллюстрирует работу функции strcmp ():

char strl[]="Ошибка открытия базы";

char str2[]="Ошибка открытия Базы";

int i;

i = strcmp(strl, str2);

В результате переменной i будет присвоено положительное значение, так как строка из strl меньше, чем строка из str2, по той причине, что прописные буквы имеют код символов меньше, чем те же символы в нижнем регистре (слово "базы " в первом случае начинается со строчной литеры, а во втором - с прописной).

Функция stricmp () имеет синтаксис:

Int stricmp(const char* strl, const char* str2)

Данная функция сравнивает строки strl и str2, не различая регистра символов. Возвращается одно из следующих целочисленных значений:

<0-если строка strl меньше, чем str2;

=0 - если строки эквивалентны;

>0 - если строка strl больше, чем str2.

Следующий фрагмент программы демонстрирует применение функции stricmp ():

char strl[]="Moon";

char str2[]="MOON";

int i ;

i = stricmp(strl, str2);

В данном случае переменной i будет присвоено значение 0 (сигнализируя тем самым совпадение строк), так как strl и str2 отличаются только регистром.

Функция strncmp()проводит сравнение определенного числа первых символов двух строк. Регистр символов при этом учитывается.

Функция имеет следующий прототип:

Int strncmp(const char* strl,

const char* str2, size_t num)

Данная функция сравнивает num первых символов двух строк, на которые указывают strl и str2, и возвращает одно из следующих значений:

<0-если строка strl меньше, чем str2;

=0 - если строки эквивалентны;

>0 - если строка strl больше, чем str2.

Рассмотрим пример использования функции strncmp ().

char strl[]="Ошибка открытия базы";

char str2[]="Ошибка Открытия базы";

int i ;

i = strncmp(strl, str2, 12);

В результате сравнения первых 12-ти символов обеих строк переменная i получит положительное значение, так как подстроки "Ошибка откры" и "Ошибка Откры" отличаются одним символом и в первом случае код символа больше, чем во втором.

Функция strnicmp()производит сравнение определенного числа первых символов двух строк, не обращая внимания на регистр символов. Данная функция описана следующим образом:

Int strnicmp(const char* strl,

const char* str2, size t num)

Функция возвращает целочисленное значение согласно следующему правилу:

<0 — если строка strl меньше, чем str2;

=0 - если строки эквивалентны;

>0 - если строка s trl больше, чем s tr2.

В следующем примере производится сравнение заданного числа символов подстрок:

char strl[]="Opening error";

char str2[]="0pening Error...";

int i;

i = strnicmp(strl, str2, 13);

В результате переменной i будет присвоено значение 0, так как первые 13 символов обеих подстрок отличаются только регистром.

Обращение строк

Функция обращения строки strrev() меняет порядок следования символов на обратный (реверс строки).

Данная функция имеет прототип:

char* strrev(char* str)

Следующий пример демонстрирует работу функции strrev().

char str[]—"Привет";

cout « strrev(str);

В результате на экране будет выведена строка "тевирП". Эта функция также преобразует строку-оригинал.

РЕЗЮМЕ

Язык C++, как и многие другие языки высокого уровня, предоставляет программисту возможность работы с наборами однотипных данных, которые именуют массивами. Отдельная единица таких данных, входящих в массив, называется элементом массива. В качестве элементов массива могут выступать данные любого типа (один тип данных для каждого массива). Так как массивы являются структурами хранения данных в оперативной памяти, то более формальное определение массива будет иметь такой вид: Массив- это последовательная группа ячеек памяти, имеющих одинаковое имя и одинаковый тип.

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

Мерность массива определяется числом индексных выражений, необходимых для ссылки к ячейке отдельного элемента массива в последовательности ячеек памяти, выделенных под массив. В связи с этим элементы массивов часто называют индексированными переменными и обозначают соответственно: а[1], b[i+j] – одномерные массивы,

с[3] [4],d[j][i] – двумерные массивы, f[1][3]….[n], s[k] [d+3]….[n] – n –мерные массивы.

Использованию массива в выражениях предшествует его объявление, резервирующее под массив определенное количество памяти. При этом указывается тип элементов массива, имя массива и его размер. Размер сообщает компилятору, какое количество элементов будет размещено в массиве.Например: описаниеint fl[20]; зарезервирует в памяти место для размещения 20 целочисленных элементов массиваfl, а объявление

float m[100], n[20][30];

зарезервирует память для 100 элементов массива вещественных чисел mи 600 элементов массива вещественных чиселn.

Элементы массива в памяти располагаются непосредственно один за другим.

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

по номеру элемента в массиве или через его индекс;

по указателю.

При обращении через индекс за именем массива в квадратных скобках указывается номер элемента, к которому требуется выполнить доступ. Таким образом, запись типа:

x = Array[13];

y = Array[19];

выполнит присвоение переменной x значения 14-го элемента, а переменной у - значение 20-го элемента массива.

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

int Temp[12] = {2, 4, 7, 11, 12, 12, 13, 12, 10, 8, 5, 1};

проинициализирует массив температур Temp соответствующими значениями. Так, элемент Теmр[0] получит значение 2, элемент Temp [ 1 ] - значение 4 и т.д. до элемента Temp [ 11 ] с присвоением ему значения 1.

Мощным средством разработчика программного обеспечения на C++ является возможность непосредственного доступа к памяти. Для этой цели предусматривается специальный тип переменных - указатели.

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

Объявление указателя имеет следующий синтаксис:

тип объекта* идентификатор;

Здесь тип_объекта определяет тип данных, на которые ссылается указатель с именем идентификатор. Символ 'звездочка' (*) сообщает компилятору, что объявленная переменная является указателем и не зависимо от того, сколько памяти требуется отвести под сам объект, для указателя резервируется два или четыре байта в зависимости от используемой модели памяти.

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

Рассмотрим пример объявления и инициализации указателя.

char Symbol = ' Y' ;

char *pSymbol = &Symbol;//Указатель *pSymbol инициализируется

//адресом переменной Symbol

long Capital = 304L;

long* pLong;

pLong = &Capital;

В приведенном фрагменте объявляется символьная переменпая Symbol и инициализируется значением 'Y', затем определяется указатель на символьный тип данных pSymbol, значение которого назначается равным адресу переменной Symbol. Вслед за этим объявляется переменная capital типа long и указатель на этот же тип pLong, после чего производится инициализация указателя адресом переменной Capital.

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

long double Num = 10;

long double Flag;

long double *ptr = &Num;

Flag = *ptr;

cout « Flag;

Имя объявляемого массива ассоциируется компилятором с адресом его самого первого элемента (с индексом 0). Таким образом, можно присвоить указателю адрес нулевого элемента, используя имя массива:

char ArrayOfChar[] = {'W,'О','R','L','D'};

char* pArr = ArrayOfChar;

Разыменовывая указатель pArr, можно получить доступ к содержимому ArrayOfChar[0]:

char Letter = *pArr;

Поскольку в C++ указатели и массивы тесно взаимосвязаны, увеличивая или уменьшая значение указателя на массив, программист получает возможность доступа ко всем элементам массива путем соответствующей модификации указателя:

// pArr указывает на ArrayOfChar[0] ('W')

pArr += 3;

// pArr указывает на ArrayOfChar[3] ('L')

pArr++;

// pArr указывает на ArrayOfChar[4] ('D')

char Letter = *pArr; // Letter = 'D';

Таким образом, после проведенных арифметических операций указатель pArr будет ссылаться на элемент массива с индексом 4.

К этому же элементу можно обратиться иным способом:

Letter = *(ArrayOfChar + 4);

// Эквивалент Letter = ArrayOfChar[4];

Присвоение значений одного массива значениям другого массива вида Array [ ] = Another [ ] или Array = Another недопустимо, так как компилятор не может самостоятельно скопировать все значения одного массива в значения другого. Для этого программисту необходимо предпринимать определенные действия (при доступе к элементам по индексу чаще всего используется циклическое присвоение).

Имя объявляемого массива ассоциируется компилятором с адресом его самого первого элемента (с индексом 0). Таким образом, можно присвоить указателю адрес нулевого элемента, используя имя массива:

char ArrayOfChar[] = {'W,'О','R','L','D'};

char* pArr = ArrayOfChar;

Разыменовывая указатель pArr, можно получить доступ к содержимому ArrayOfChar[0]:

char Letter = *pArr;

Многомерный массив можно представить себе как массив массивов, т.е. массив, элементами которого являются массивы. В связи с этим многомерный массив размерности N можно представить как одномерный массив из массивов размерности (N-1). Таким образом, например трехмерный массив - это массив, каждый элемент которого представляет двумерную матрицу.

Определение многомерного массива должно содержать сведения о типе,размерности и количествах элементов каждой размерности:

Тип имя_массива [k][k2]...[kn];

Примеры объявления многомерных массивов:

//Двумерный массив 6x9элементов: char Matrix2D[6][9];

// Трехмерный:

unsigned long Arr3D[4][2][8];

// Массив 7-й степени мерности:

my__type Heaven[22][16][7][47][345][91][3];

Как видим из этих примеров размер многомерного массива определяется компилятором как произведение предельных значений индексов(количество элементов данной размерности), указанных в описании массива. Например, из описания трехмерного массива unsigned long Arr3D[4][2][8]; следует размер этого массива равный 4х2х8= 64 ячейки памяти по 4 байта каждая. Тогда для массива Arr3D компилятор выделит 256 байтов оперативной памяти.

Выражение Array [idx] [idy], представляющее двумерный массив, переводится компилятором в эквивалентное выражение:

*(*(Array+idx)+idy)

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

int Mass[3][2][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24};

В программе каждая переменная может размещаться в одном из трех мест: в области данных программы, в стеке или в свободной памяти (так называемая куча).

Каждой переменной в программе память может отводиться либо статически, то есть в момент загрузки программы, либо динамически - в процессе выполнения программы.

До сих пор все определяемые массивы объявлялись статически, и, следовательно, хранили значения всех своих элементов в стековой памяти или области данных программы. Если количество элементов массива невелико, такое размещение оправдано. Однако довольно часто возникают случаи, когда в стековой памяти, содержащей локальные переменные и вспомогательную информацию (например, точки возврата из вложенных функций), недостаточно места для размещения всех элементов большого массива. Ситуация еще более усугубляется, если массивов большого размера должно быть много. Здесь на помощь приходит возможность использования для хранения данных динамической памяти, доступ к которой реализуется с помощью ряда специальных функций.

ФУНКЦИИ malloc, calloc, free и операторы new и delete

Чтобы в дальнейшем можно было разместить в памяти некоторый динамический объект, для него необходимо предварительно выделить в памяти соответствующее место. По окончании работы с объектом выделенную для его хранения память требуется освободить.

Выделение динамической памяти под объект осуществляется при помощи следующих выражений:

malloc;

calloc;

new;

Освобождение выделенных ресурсов памяти производится выражениями:

free;

delete;

Функция malloc подключается в одном из заголовочных файлов stdlib.h или alloc.h и имеет синтаксис:

Соседние файлы в папке ЛекцииКарасева