Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2009 лекции ПЯВУ часть1.doc
Скачиваний:
22
Добавлен:
27.03.2015
Размер:
823.3 Кб
Скачать

Доступ к элементам структур

Для доступа к элементам структуры или класса используются операции селектора члена структуры или класса – операция точка(.) и операция стрелка(->). Операция точка обращается к элементу структуры (или класса) по имени переменной объекта или по ссылке на объект. Например, чтобы напечатать элементhourструктурыtimeObjectиспользуется оператор

cout << timeObject.hour;

Операция стрелка, состоящая из знака минус (-) и знака больше (>), записанных без пробела, обеспечивает доступ к элементу структуры (или класса) через указатель на объект. Допустим, что указательtimePtrбыл уже объявлен как указывающий на объект типаTimeи что адрес структурыtimeObjectбыл уже присвоенtimePtr. Тогда, чтобы напечатать элементhourструктурыtimeObjectс указателемtimePtr, можно использовать оператор

cout << timePtr->hour;

Выражение timePtr->hourэквивалентно

(*timePtr).hour;

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

Можно определить переменную-структуру без определения отдельного типа (рис. 10.2.)

struct {

double x;

double y;

} coord;

Рис. 10.2. Создание переменной структуры без типа

Обратиться к атрибутам переменной coordможноcoord.xиcoord.y.

Использование структур

Программа на рис. 10.3 создает определенный пользователем тип структуры Timec тремя целыми элементами:hour,minuteиsecond. Программа определяет две структуры типаTime, названныеdTime1 и dTime2, и использует операцию точка для присвоения элементам структур начальных значений. Затем программа печатает введенное время в 24-часовом и 12-часовом формате. Функции печати принимают ссылки на постоянные структуры типаTime. Причина этого в том, что таким образом исключаются накладные расходы на копирование, связанные с передачей структур функциям по значению, а использованиеconstпредотвращает изменение структуры типаTimeфункциями печати

#include <iostream>

#include <time.h>

using namespace std;

struct Time {

int hour;

int minute;

int second;

};

void print24Hours(const Time &t){

cout << (t.hour <10 ? "0" : "") << t.hour << ":" << (t.minute < 10 ? "0" : "") << t.minute << ":" << (t.second <10 ? "0" : "") << t.second;

}

void print12Hours(const Time &t) {

cout << ((t.hour ==0 || t.hour == 12) ? 12 : t.hour %12) << ":" << (t.minute < 10 ? "0" : "") << t.minute << ":" << (t.second <10 ? "0" : "") << t.second << (t.hour < 12 ? " am" : " pm");

}

int main(){

Time dTime1, dTime2;

cout << "Enter the time:" << endl;

cin >> dTime1.hour >> dTime1.minute >> dTime1.second;

cout << "Your time is ";

print24Hours(dTime1);

cout << " that is the same ";

print12Hours(dTime1);

cout << endl;

time_t t;

tm * temp;

time(&t);

temp=localtime(&t);

dTime2.hour = temp->tm_hour;

dTime2.minute = temp->tm_min;

dTime2.second = temp->tm_sec;

cout << "Current time is ";

print24Hours(dTime2);

cout << " that is the same ";

print12Hours(dTime2);

cout << endl;

return 0;

}

Рис. 10.3. Использование структур

В С существует библиотека time.h, в которой собраны функции для работы со временем. Функцияtimeвозвращает текущее время в миллисекундах. Для этого она принимает адрес переменной типа time_t. Этот тип определен в заголовочном файлеtime.h. В том же заголовочном файле определена структураtm. В этой структуре существует множество полей для работы со временем. Функцияlocaltimeпреобразует время в миллисекундах в привычный для нас формат, сохраняя его в своем аргументе.

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

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