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

168 Глава 4

Позднее, когда мы будем говорить о классах, вы узнаете больше об используемом здесь синтаксисе. А пока примем, его как данность и применим в примере.

Типичный вывод этой программы должен выглядеть так:

Введите строку не длиннее 80 символов: Радиация погубит ваши гены

Строка "Радиация погубит ваши гены" содержит 2 6 символов.

Описание полученных результатов

Эта программа объявляет символьный массив buffer и читает символьную строку в этот массив с клавиатуры после вывода приглашения на ввод. Чтение с клавиатуры прекращается, когда пользователь нажимает <Enter>, или после того, как прочитано МАХ-1 символов.

Цикл while используется для подсчета количества прочитанных символов. Цикл продолжается до тех пор, пока текущий символ, находящийся в buffer [count], не равен 1 \ 0 '. Такая проверка текущего символа при проходе по элементам массива ча- сто применяется в "родном" С++. Единственным действием, выполняемым в цикле, является инкремент значения счетчика count для каждого ненулевого символа.

Существует также библиотечная функция strlen (), которая избавляет вас от са- мостоятельного кодирования при подсчете символов строки. Если вы хотите ее ис- пользовать, то должны включить в свою программу заголовочный файл <cstring> с помощью директивы:

Буква "с" в имени заголовочного файла говорит о том, что этот файл содержит определения, относящиеся к библиотеке языка С, которая является частью библио-

Массивы, строки и указатели 169

теки С++. Этот заголовок также содержит функцию wcsnlen (), возвращающей длину строки широких символов.

Используя функцию strlen (), вы можете заменить цикл while следующим опе- ратором:

Аргументом служит имя массива, содержащего строку, а возвращает функция strlen () длину этой строки в виде целочисленного значения типа size_t. Многие функции стандартной библиотеки возвращают значение типа size_t, а сам тип size_t определен в стандартной библиотеке с помощью оператора typedef как эк- вивалент одного из фундаментальных типов, обычно — unsigned int. Причина при- менения size_t вместо непосредственного использования фундаментального типа связана с тем, что это обеспечивает гибкость в том, что действительный тип, скрыва- ющийся за псевдонимом size_t, может определяться конкретной реализацией С++. Стандарт С++ разрешает варьировать диапазоны допустимых значений фундаменталь- ных типов для наилучшего соответствия аппаратной архитектуре, и sizet может быть определено как эквивалент наиболее подходящего типа в текущем аппаратном окружении.

В конце примера введенная строка и количество ее символов отображаются един- ственным оператором вывода. Обратите внимание на применение управляющей по- следовательности * \ " ' для вывода двойной кавычки.

Многомерные массивы

Массивы, которые мы определяли до сих пор, имеют один индекс и называются одномерными массивами. Но массив может иметь и более одного индексного зна- чения — в этом случае он называется многомерным массивом. Предположим, что у вас есть поле, на котором расположена плантация бобов, по 10 растений на грядке, и это поле содержит 12 таких грядок (то есть всего имеется 120 единиц растений). Вы можете объявить массив для записи веса бобов, собранных от каждого растения, ис- пользуя следующий оператор:

Здесь объявляется двумерный массив beans, где первый индекс — номер грядки, а второй — номер растения на грядке. Чтобы обратиться к любому конкретному эле- менту, необходимо указать два индекса. Например, вы можете установить значение элемента, соответствующего пятому растению в третьей грядке, следующим операто- ром:

Напомним, что значения индексов начинаются с нуля, поэтому значение индекса третьей грядки — 2, а индекс пятого растения — 4.

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

Такая запись позволяет организовать учет каждого растения, растущего на всех этих полях, причем самый левый индекс ссылается на определенное поле. Если вы когда-нибудь займетесь выращиванием бобов в международном масштабе, то сможете использовать четырехмерный массив, где дополнительное измерение будет обозна-