- •Зачем нужны структуры?
- •Как определить новую структуру и объявить переменные-структуры?
- •Как инициализировать структуру?
- •Как объявить массив структур?
- •Что такое поле структуры и как к ним обращаться?
- •Что такое вложенные структуры?
- •Как вывести содержимое массива структур в виде таблицы?
- •Можно ли передавать структуры в качестве аргументов функций и возвращать структуры в качестве значений функций?
Как вывести содержимое массива структур в виде таблицы?
Массив структур удобно выводить в виде таблицы, например, как в телефонной книге, экзаменационной ведомости и т.д. Данная задача, несмотря на свою простоту, имеет некоторые тонкости. Очевидный способ вывода таблицы заключается в том, чтобы выводить содержимое каждой структуры на одной строке, разделяя поля пробелами:
for (int i=0; i<SIZE; i++) {
printf("%s ", workers[i].name);
printf("%d ", workers[i].age);
printf("%g\n", workers[i].salary);
}
Такой способ отображает весь массив, но колонки оказываются неровными:
Для ровного вывода следует воспользоваться табуляцией – «\t»
for (int i=0; i<SIZE; i++) {
printf("%s\t", workers[i].name);
printf("%d\t", workers[i].age);
printf("%g\n", workers[i].salary);
}Однако и в данном случае могут возникнуть проблемы. Например, если одно из имен слишком длинное:
Хорошим способом решения этой проблемы является использование модификатора количества позиций под переменную:
for (int i=0; i<SIZE; i++) {
printf("%10s\t", workers[i].name);
printf("%d\t", workers[i].age);
printf("%g\n", workers[i].salary);
}
И, наконец, для выравнивания по левому краю существует модификатор «-».
for (int i=0; i<SIZE; i++) {
printf("%-10s\t", workers[i].name);
printf("%d\t", workers[i].age);
printf("%g\n", workers[i].salary);
}
Можно ли передавать структуры в качестве аргументов функций и возвращать структуры в качестве значений функций?
Передача структуры в качестве аргумента функции
Рассмотрим следующую задачу. Объявить структуру Point (Точка) с вещественными полями x, y и z, которые задают координаты этой точки в трехмерном пространстве. Написать функцию, которая принимает два аргумента типа Point и возвращает расстояние между ними.
#include "stdafx.h"
#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;
}
Возврат структур в качестве значения функции
Создадим функцию, которая принимает две точки и возвращают ту из них, которая отстоит дальше от начала координат.
#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;
}