
- •220300 - Системы автоматизированного проектирования
- •Тема 2. Технологии программирования
- •Тема 2. Технология разработки крупных приложений
- •Структуры
- •Структуры и функции
- •Массивы структур
- •Поиск в массиве структур
- •Вложенность структур
- •Рекурсия
- •Алгоритм быстрой сортировки
- •Массивы структур и бинарные файлы
- •Динамические структуры данных
- •Линейные списки
- •Очереди
- •Контрольная работа
- •Объектно-ориентированное программирование. Классы
- •Конструкторы
- •Перегруженные конструкторы
- •Определение методов класса вне класса
- •Объекты, возвращаемые функцией (методом)
- •Структуры и классы
- •Классы и память
- •Статические данные класса
- •Константные методы
- •Деструкторы
- •Массивы и классы
- •Массивы объектов
- •Строки Строковый тип или стандартный класс string
- •Тип строк AnsiString
- •Перегрузка операций
- •Перегрузка арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операции приведения типа
- •Преобразования объектов в основные типы и наоборот
- •Преобразование объектов классов в объекты других классов
- •Наследование
- •Конструкторы производного класса
- •Перегрузка функций
- •Иерархия классов
- •Общее и частное наследование. Комбинации доступа
- •Множественное наследование
- •Включение. Классы в классах
- •Виртуальные и дружественные функции
- •Абстрактные классы и чистые виртуальные функции
- •Виртуальные деструкторы
- •Виртуальные базовые классы или устранение неоднозначности при множественном наследовании
- •Дружественные функции
- •Дружественные классы
- •Указатель this
- •Многофайловые программы
- •Распознавание нажатых клавиш
Поиск в массиве структур
Рассмотрим пример программы, позволяющей осуществлять поиск по наименованию товара в базе товаров.
… то же самое
void poisk_po_name(Tovar *tb, int& R) {
char namet[N];
cout << "\nVvedite naimenovanie tovara: "; cin >> namet;
int l = strlen(namet);
cout << "\n Naideny sovpadeniya: " << endl;
for(int i=0; i<R; i++) {
if(strncmp(namet, tb[i].name, l)==NULL) { //сравнивает первую строку и
//l-символов второй строки
cout << tb[i].name << " " << tb[i].number << " " << tb[i].cena;
cout << endl;
}
}
}
Данная функция позволяет по нескольким первым буквам, указанным пользователем, определить наличие совпадений в базе и вывести их.
Вложенность структур
Структуры допускают вложенность, т.е. использование структурной переменной в качестве поля какой-либо другой структуры. Рассмотрим практический пример применения структур для решения следующей задачи.
Составим программу для расчёта площади комнаты, учитывая что придётся работать в английской системе мер, основными единицами измерения которой служат фут и дюйм, причём 1 фут равен 12 дюймам.
struct Distance { // Расстояния в английской системе
int feet; // футы
float inch; // дюймы
};
struct Ploshad { // Размеры для определения площади комнаты
Distance length;
Distance width;
};
int main() {
Ploshad komnata1;
komnata1.length.feet = 13; komnata1.length.inch = 6.5;
komnata1.width.feet = 10; komnata1.width.inch = 0.0;
float l1 = komnata1.length.feet + komnata1.length.inch / 12;
float w1 = komnata1.width.feet + komnata1.width.inch / 12;
cout << "Ploshad komnaty1 = " << l1*w1 << " (kv. futov).\n";
Ploshad komnata2 = {{13, 6.5},{10, 1.10}}; // инициализация размеров по длине и ширине
float l2 = komnata2.length.feet + komnata2.length.inch / 12;
float w2 = komnata2.width.feet + komnata2.width.inch / 12;
cout << "Ploshad komnaty2 = " << l2*w2 << " (kv. futov).\n";
return 0;
}
Преобразование целого типа поля feet к типу float происходит автоматически. При вычислении площади комнаты на самом деле осуществляется преобразование переменной типа Ploshad, хранящей два значения типа Distance, к одному вещественному значению. Возможность преобразования значений одного типа в значения другого типа является важным аспектом для программ, которые используют типы данных, определяемые пользователем.
Д/З |
Измените рассмотренную программу, создав вместо структуры Ploshad, структуру Volume для хранения трёх измерений помещения. Программа должна вычислять объём двух комнат и выводить результат на экран. Для одной комнаты размеры фиксированные, а для другой должны вводится пользователем. |
Ответ |
struct Distance { // Расстояния в английской системе int feet; // футы float inch; // дюймы }; struct Volume { // Размеры для определения объёма комнаты Distance length; Distance width; Distance height; };
int main() { Volume komnata1 = {{13, 6.5},{10, 1.10}, {24.3, 2}}; float l1 = komnata1.length.feet + komnata1.length.inch / 12; float w1 = komnata1.width.feet + komnata1.width.inch / 12; float h1 = komnata1.height.feet + komnata1.height.inch / 12; cout << " Ob'em komnaty1 = " << l1*w1*h1 << " (kub. futov).\n";
Volume komnata2; cout << "\nVvedite dlinu komnaty2 v futax: "; cin >> komnata2.length.feet; cout << "Vvedite ostav. dlinu v inches: "; cin >> komnata2.length.inch; float l2 = komnata2.length.feet + komnata2.length.inch / 12; … cout << "\n Ob'em komnaty2 = " << l2*w2*h2 << " (kub. futov).\n"; return 0; }
|