Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Языки программирования (пособие).doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
964.61 Кб
Скачать

4.4.8Сортировка массива структур

Алгоритмы сортировки применимы к любым объектам, в том числе и к структурам. Рассмотрим особенности, которые нужно учитывать при сортировке массива структур. Во-первых, структуры сортируются по какому-то полю, поэтому сравнение нужно указывать это поле:

if (workers[j].age < workers[j+1].age) {

}

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

Worker temp = workers[j];

workers[j] = workers[j+1];

workers[j+1] = temp;

Алгоритм пузырьковой сортировки массива структур выглядит так:

for (int i=1; i<SIZE; i++) {

for (int j=SIZE-2; j>=0; j--) {

if (workers[j].age < workers[j+1].age) {

worker temp = workers[j];

workers[j]=workers[j+1];

workers[j+1]=temp;

}

}

}

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

Рисунок 40. Сортировка по возрасту

4.4.9Передача структур в качестве аргументов функций

Переменные-структуры можно передавать в качестве аргументов функций. Следующий фрагмент кода демонстрирует определение функции printWorker(), которая принимает структуру Worker в качестве аргумента и выводит ее на экран:

void printWorker(Worker worker) {

printf("%s\n", worker.name);

printf("%d\n", worker.age);

printf("%g\n", worker.salary);

}

Вызвать эту функцию можно, передав в нее структуру типа Worker, например, элемент массива workers:

printWorker(workers[1]);

Рассмотрим следующую задачу. Объявить структуру Point (Точка) с вещественными полями x, y и z, которые задают координаты этой точки в трехмерном пространстве. Написать функцию, которая принимает два аргумента типа Point и возвращает расстояние между ними.

#include <iostream>

using namespace std;

struct Point {

float x; float y; float z;

};

float sqr(float number) {

return number*number;

}

float getDistance(Point p, Point q) {

return sqrt(sqr(p.x-q.x) + sqr(p.y-q.y) +

sqr(p.z-q.z));

}

int main() {

Point p = {1,2,3};

Point q = {2,3,4};

cout << getDistance(p,q)) << endl;

}

4.4.10Возврат структуры в качестве значения функции

Переменные-структуры можно возвращать в качестве значения функции. Следующая функция принимает две структуры типа Worker и возвращает сотрудника с большей зарплатой:

Worker getWellPaid(Worker w1, Worker w2) {

return w1.salary > w2.salary ? w1 : w2;

}

Обратите внимание на то, что здесь используется сокращенная запись оператора if-else, эквивалентная такой конструкции:

Worker getWellPaid(Worker w1, Worker w2) {

if (w1.salary > w2.salary) {

return w1;

} else {

return w2;

}

}

При вызове функции getWellPaid() совместно с функцией printWorker()

Worker director = {"Андрей", 30, 5000};

Worker manager = {"Сергей", 35, 3000};

printf("Сотрудник\n\n");

printWorker(getWellPaid(director, manager));

printf("\nЗарабатывает больше\n");

Создадим теперь функцию, которая принимает две точки и возвращают ту из них, которая отстоит дальше от начала координат.

#include <iostream>

using namespace std;

struct Point {

float x;

float y;

float z;

};

float sqr(float number) {

return number*number;

}

float getDistance(Point p, Point q) {

return sqrt(sqr(p.x-q.x)+sqr(p.y-q.y)+sqr(p.z-q.z));

}

Point farPoint(Point p1, Point p2) {

Point zero = {0,0,0};

float d1 = getDistance(zero, p1);

float d2 = getDistance(zero, p2);

return d1>d2 ? p1 : p2;

}

int main() {

Point p = {1,2,3};

Point q = {2,3,4};

Point far = farPoint(p,q);

cout << far.x << " " << far.y << endl;

}