Программирование >>  Унарные и бинарные операторы 

1 2 3 4 [ 5 ] 6 7 8 ... 37


тогда, когда функция а. appendC) не только меняет строку а, но и возвращает измененную строку, так что ее можно присвоить другой строке (в нашем случае строке Ь). Собственные функции С++ в зависимости от своего устройства способны возвращать самые разные объекты: целые числа строки и т. д. Бывают функции, не возвращающие ничего.

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

string аСЗдравствуй ):

Такой способ присваивания начальных значений довольно непривычен. Казалось бы, он не имеет отношения ни к оператору =, ни к собственным функциям. На самом деле, здесь используется особая собственная функция, которая есть в каждом объекте. Эта функция отвечает за присваивание начальных значений и называется конструктором. Поскольку она уникальна, создатели С++ решили вызывать ее не так, как другие функции.

Другой важный пример дублирования оператором собственной функции - организация доступа к отдельным символам строки. Делается это либо с помощью оператора [], либо собственной функдаей at(). Программа, показанная в листинге 4.2, сначала выводит на печать два последовательных восклицательных знака, потому что и a.at(4), и а[4] возвращают четвертый символ строки, а если учесть, что нумерация идет с нуля, то это как раз и есть восклицательный знак.

Листинг 4.2

#include <iostream> #include <string> using namespace std: int main(){

Чтобы определить размер строки, используется функция sizeO, возвращающая число символов - в нашем случае это 5. Обратите внимание, функция sizeO не меняет сам объект, а только узнает, сколько в нем хранится символов, и возвращает полученное число во внешний мир.

Завершить этот раздел хочется примером важной функции findO, у которой нет сосугветствующего оператора. По ее названию многие, наверное, догадались, что f i nd() ищет заданный фрагмент строки (листинг 4.3). Листинг 4.3

#include <iostreain> #include <string> using namespace std: int mainO

int p: string

а= сеносеносеноиголкасеносеносеносено :

p-a.findCMronKa );

cout p endl:

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

string а= Мана! ; cout a.at(4) endl: cout a[4] endl: forCint i=0:i < a.size():i++) cout a[i] endl:

В цикле for(), показанном в том же листинге следом за инструкциями вывода, наша строка выводится вертикально:

м а н а



фрагмента. В нашем случае и - первый символ в слове иголка - окажется на 12-й позиции, и функция findO возвратит число 12. Если же фрагмент обнаружить не удастся, функция выдаст - 1 - отрицательное число, которое, естественно, не может быть позицией символа в строке.

Буквы

в предыдущем разделе мы познакомились с оператором [], позволяющим выделить из строки отдельны!! символ, в программе из листинга 4.2 символы один за другим выводились Fia экран. Но бывает, что их нужно где-то запомнить, а подходящих для этого переменных мы пока не знаем. Действительно, каждый символ строки умещается в одном байте, поэтому использовать для его храпения переменные типа int, способные хранить сразу несколько байтов, слишком расточительно. Вот почему в С++ существует специальная переменная char, занимаюпшя в памяти ровно один байт.

Переменные типа char объявляются подобно другим переменным:

char с:

Присвоить им значения можно многими способами. Один нам уже известен: можно записать в переменную типа char любой символ строки:

string 5= Маиа! : charc=s[4]: с=!

А можно просто указать нужный символ в одинарных кавычках: ch с=а:

Кроме того, можно просто записать в переменную char любое число, которое она способна вместить. Объявить переменную ch а 1=65 - все равно, что заслать туда

большую латинскую букву А , потому что кодируется она именно этим числом.

Вообще, переменные типа char, хоть они и предназначены для хранения букв, могут участвовать в арифметических операциях наравне с другими переменными, такими как int. Тут, правда, есть одна тонкость. В стандарте языка ничего не сказано о том, хранит ли переменная типа char числа со знаком или же только положительные числа и ноль. Поэтому при преобразовании перемегшой char к типу int возможны неожиданные превращения в отрицательные числа. Чтобы избежать этого, необходимо явно указывать тип переменной: unsigned char с (переменная без знака хранит числа от О до 255) или Signed char ch (переменная со знаком хранит числа от-128 до 127).

Массивы

Вместе мы - сила и мы победим!

Стандартный гредтяборный лозунг

В разделе Приговор мы познакомились С произвольным доступом к отдельным символам, составляющим строку. С помощью оператора [] оказалось возможным выделить из строки какую угодно букву. Если, например, а - строка, то а[3] - это третий (с учетом того, что перед ним стоят пулевой, первый и второй символы) символ строки, а[5] - пятый и т. д. По всего чудеснее оказалась возможность поставить вместо конкретного номера (3 или 5) целочисленную переменную, например a[i]. Если !1сремснная i равна 5, то получим пятую букву строки, еслп 3 - третью. Казаяось бы, никакой

В языке С++ переменные char, встрсчаюпгиеся в арифметических выражениях, автоматически подтягиваются к типу int.



Массивы 61

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

Представим себе, что запись a[i] невозможна, а необходимо подсчитать частоту встречающихся в строке символов. Тогда пришлось бы вручную указывать все буквы а[0], а[1], а[2], а[3],а[1000] и т. д. Ясно, что смысл программирования как способа в немногих строках задать множество операций здесь теряется. Без возможности объединить в одну удобную оболочку массу однотипных переменных вычисления на компьютере теряют смысл. Вот почему буквы, составляющие такой объект, как строка, можно автоматически перебирать в цикле.

Теперь самое время вспомнить, что, кроме составляющих строку букв, есть еще переменные типа char, int, double, и все они тоже должны быть упакованы так, чтобы можно было автоматически перебирать их, изменяя в цикле одну переменную-индекс. Для такой упаковки в С++ есть множество средств, но самое простое и популярное - это массивы.

В массивы можно собрать переменные и объекты любого типа. Например, массив из пяти переменных типа double задается так:

double tmp [5]:

В массивах, как и в строках, нумерация начинается с нуля, поэтому 5 переменных, составляющих массив tnip[], таковы: tmpCO], tmp[l], tmp[2], tnip[3], tnip[4]. Программа, показанная в листинге 4.4, вычисляет среднее из пяти величин типа double.

Листинг 4.4

#include <iostream> using namespace std:

int mainO {

double tmp[5] = {36.6.36.9.37.3.38.3.38.5}:

double sum:

for(int i=0;i<5;i++)

sum+=tmp[1]: cout среднее sum/5 endl: }

Начальные значения массива, как это видно из листинга 4.4, можно задать внутри фигурных скобок, отделив одно значение от другого запятой. Цифры в фигурных скобках позволяют догадаться, что вычисляется средняя температура тела, возможно, за сутки.

Любопытно, что, задавая начальные значения элементов массива, можно не указывать его размер:

double tmp[] = {36.6.36.9.37.3.38.3.38.5}:

При такой записи компилятор, подсчитав числа в фигурных скобках, сам поймет, что задается массив из пяти чисел. Особенно такая запись удобна при создании массива символов. Например, объявление:

char Ье11о[]= Мана! : создает массив из шести переменных типа char: первые пять мест займут буквы, а шестое - специальный завершающий символ, добавляемый компилятором, чтобы обозначить конец последовательности букв. Этот символ обозначается как ЛО и действительно равен нулю (все биты у него нулевые).

Как мы уже говорили, в массив можно поместить любые объекты С++. Программа, показанная в листинге 4.5, пользуется массивом из двух строк, чтобы вывести на экран фразу Здравствуй, Мама! . Листинг 4.5

#include <iostream> #include <string> using namespace std:

int main(){ прололжение



1 2 3 4 [ 5 ] 6 7 8 ... 37

© 2006 - 2022 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика