- •Оглавление
- •1.2. Свойства языков программирования
- •1.3. Основные парадигмы программирования Процедурное программирование
- •Модульное программирование
- •Абстракция данных
- •Объектно-ориентированное программирование
- •Непечатные символы
- •Тема 2 Типы данных
- •2.1. Понятие переменной и объявление переменных
- •Объявление переменных
- •Встроенные типы данных
- •Размер памяти, выделяемой под встроенные типы данных
- •2.2. Константы и перечисления Константные переменные
- •Перечисления
- •2.3. Операции и выражения
- •Мультипликативные операции
- •Операции сравнения
- •Побитовые логические операции
- •Побитовые операции
- •Комментарии
- •Оператор while(пока)
- •Оператор do/while(выполнять/пока)
- •Оператор for(цикл)
- •Оператор множественного выбора switch
- •Операторы breakиcontinue
- •Тема 4 Массивы
- •4.1.Определение, объявление и инициализация массивов
- •Объявления и инициализация массивов в программе
- •4.2. Сортировка массивов Пузырьковая сортировка
- •Сортировка вставками
- •4.3. Поиск в массивах Линейный поиск
- •Двоичный поиск
- •4.4. Многомерные массивы
- •Тема 5 Указатели Объявления и инициализация переменных указателей
- •5.1. Операции над указателями
- •5.2. Выражения и арифметические действия с указателями
- •5.3. Взаимосвязи между указателями и массивами
- •5.4. Массивы указателей
- •5.5. Динамическое выделение памяти под массивы
- •Тема 6 Функции
- •6.2. Определения функций
- •Генерация случайных чисел
- •6.3. Классы памяти и область действия Классы памяти
- •Область действия
- •6.4. Рекурсия
- •6.5. Ссылки и ссылочные параметры
- •Вызов функций по ссылке с аргументами указателями
- •6.6. Использование спецификатораconstс указателями
- •6.7. Перегрузка функций
- •Аргументы по умолчанию
- •6.8. Передача массивов в функции
- •6.9. Указатель на функцию
- •6.10. Командная строка аргументов
- •6.11 Неопределенное количество аргументов
- •Тема 7 Введение в обработку строк
- •7.1. Работа со строками в с
- •Понятие символов и строк в с
- •Функции для работы со строками
- •Определение длины строки
- •Сложение двух строк (конкатенация)
- •Добавление к исходной строке указанного количества символов.
- •Копирование строки в другую строку
- •Сравнение строк
- •Получение строки от пользователя
- •Тема 8 Работа с файлами
- •Открытие файла
- •Чтение из файла символа или строки символов
- •Запись символа или строки символов в файл
- •Смещение внутри файла
- •Значения параметра fromwhereфункцииfseek
- •Закрытие файла
- •Тема 9 Компоновка программ и препроцессор
- •9.1. Компоновка программ
- •Проблема использования общих функций и имен
- •Использование включаемых файлов
- •9.2. Препроцессор
- •Определение макросов
- •Условная компиляция
- •Дополнительные директивы препроцессора
- •Тема 10 Структуры
- •10.1. Определение структур и доступ к элементам
- •Доступ к элементам структур
- •Использование структур
- •10.2. Битовые поля
- •10.3. Объединения
- •10.4. Построение связных списков на основе структур с самоадресацией
- •Создание простого связного списка
- •Очереди
- •Деревья
- •Список рекомендуемой литературы
Доступ к элементам структур
Для доступа к элементам структуры или класса используются операции селектора члена структуры или класса – операция точка(.) и операция стрелка(->). Операция точка обращается к элементу структуры (или класса) по имени переменной объекта или по ссылке на объект. Например, чтобы напечатать элемент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преобразует время в миллисекундах в привычный для нас формат, сохраняя его в своем аргументе.
Существуют препятствия созданию новых типов данных указанным способом с помощью структур. Поскольку инициализация структур специально не требуется, можно иметь данные без начальных значений и вытекающие из этого проблемы. Даже если данные получили начальные значения, возможно, это было сделано неверно. Неправильные значения могут быть присвоены элементам структуры, потому что программа имеет прямой доступ к данным. Не существует никакого интерфейса, гарантирующего, что программист правильно использует тип данных и что данные являются непротиворечивыми.
Существуют и другие проблемы, связанные со структурами. Структуры не могут быть напечатаны как единое целое, только по одному элементу с соответствующим форматированием каждого. В С структуры нельзя сравнивать в целом, их нужно сравнивать элемент за элементом.