Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Лафоре Р. -> "Объектно-ориентированное программирование в С++" -> 106

Объектно-ориентированное программирование в С++ - Лафоре Р.

Лафоре Р. Объектно-ориентированное программирование в С++ — М.: Питер, 2004. — 992 c.
Скачать (прямая ссылка): obektnoorentprogramm2004.djvu
Предыдущая << 1 .. 100 101 102 103 104 105 < 106 > 107 108 109 110 111 112 .. 341 >> Следующая


ein » ans;

}

while ( ans != 'н' ); // продолжать, пока не будет введено 'н'

// показываем все введенное

for ( int j = 0; j < n: j++ ) {

cout « "\пДлина номер " « j + 1 « " : ": dist [ j ].showdist ( );

}

cout « endl: return 0:

}

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

Введите длину номер 1 Введите футы: 5 Введите дюймы: 4 Продолжить ввод (д/н)?: д Введите длину номер 2 Введите футы: 6 Введите дюймы: 2.5 Продолжить ввод (д/н)?: д Введите длину номер 3 Введите футы: 5 Введите дюймы: 10.75 Продолжить ввод (д/н)?: н

Длина номер 1 : 5'-4" Длина номер 2 : 6'-2.5" Длина номер 3 : 5'-10.75" 280

Глава 7. Массивы и строки

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

Границы массива

В этой программе ввод данных пользователем организован в виде цикла. Здесь пользователь может ввести сколько угодно структур типа part, даже больше значения МАХ (равного здесь 100), представляющего собой размер массива.

Что случится, если пользователь введет более 100 интервалов? Что-то непредвиденное, но почти определенно плохое. В С++ нет проверки границ массива. Если программа поместит что-то за пределами массива, то компилятор и исполняемая программа протестовать не будут. Однако эти данные могут быть записаны поверх других данных или поверх самой программы. Это может послужить причиной странных эффектов или даже полного краха системы.

Мораль всего этого такова, что программисту следует применять проверку границ массива. Если возникает возможность переполнения массива данными, то он должен иметь большие размеры или у него должна быть возможность предупредить пользователя о возможном переполнении. Например, вы можете вставить этот код в начало цикла программы ENGLARAY:

if ( п >= МАХ ) {

cout « "\пМассив полон!!!"; break;

}

Таким образом вы сможете прервать цикл и предотвратить переполнение массива.

Доступ к объектам в массиве

Объявление класса Distance в этой программе похоже на то, которое использовалось в предыдущей программе. Однако в функции main() мы определили массив объектов класса Distance:

Distance dist [ MAX ]:

Здесь типом данных массива dist является класс Distance. Число элементов массива определяется значением переменной MAX. На рис. 7.7 показано, как это выглядит.

Доступ к методам объектов элементов массива похож на доступ к членам структуры, являющейся элементом массива, как в примере PARTARAY. Здесь показано, как вызвать метод showdist() элемента массива dist под номером j:

dist [ j ].showdist ( ):

Как вы можете видеть, доступ к методу объекта, являющегося элементом массива, осуществляется с помощью операции точки. За именем массива следу- Массивы объектов 281

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

Заметим, что при вызове метода getdist() для помещения интервала в массив мы воспользуемся случаем и увеличим индекс массива п: dist [ n++ ].getdist ( ):

feet

inches

feet

inches

feet

inches

dist [О]-

dist [ 1 ]«

) di st [ 2 }<

- Эти объекты также содержат методы класса

Рис. 7.7. Массив объектов

Таким образом, следующая группа данных, полученная от пользователя, будет помещена в структуру следующего элемента массива dist. Переменная п должна быть увеличена вручную, как здесь, потому что мы используем цикл do вместо цикла for. В цикле for переменная цикла, которая увеличивается автоматически, может служить индексом массива.

Массивы карт

Вот другой, довольно длинный, пример массива объектов. Вы, конечно, помните пример CARD0BJ из главы 6. Мы воспользуемся классом card из этого примера и определим массив из 52 объектов этого класса, создав таким образом колоду карт. Вот листинг программы CARDARAY:

// cardaray.cpp // класс игральных карт #include <iostream> !include <cstdlib> 282

Глава 7. Массивы и строки

!include <ctime> using namespace std:

enum Suit { clubs, diamonds, hearts, spades }: // от 2 до 10 обычные числа const int jack = 11: const int queen = 12; const int king = 13: const int ace = 14: /////////////////////////////////////////////////////////////

class card {

private: int number: Suit suit: public:

card ( ) // конструктор { }

void set ( int n. Suit s ) // установка значения

{ suit = s: number = n: } void display (): // показ карты

}:

/////////////////////////////////////////////////////////////

void card::display ( ) {

if ( number >= 2 && number <= 10 ) cout « number;
Предыдущая << 1 .. 100 101 102 103 104 105 < 106 > 107 108 109 110 111 112 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100