Ввод и вывод содержимого структуры 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Ввод и вывод содержимого структуры



Вывод значений полей структуры осуществляется аналогично переменным с учетом их типа:

 

printf("Имя: %s\n", manager.name);

printf("Возраст: %d\n", manager.age);

printf("Зарплата: %g\n", manager.salary);

 

При вводе необходимо ставить амперсанд:

 

scanf("%d", & manager.age);

 

Оператор точка имеет более высокий приоритет, поэтому ставить скобки, т.е. писать &(manager.age) не нужно. К строке manager.name применимы функции gets() и puts():

 

gets(manager.name);

puts(manager.name);

 

Можно также обратиться к отдельным буквам этой строки:

 

printf("Имя начинается с буквы %c\n",

manager.name[0]);

 

Вложенные структуры

Пусть для каждого сотрудника требуется хранить его адрес, который состоит из нескольких полей: улица (street), номер дома (house) и номер квартиры (flat). В таком случае адрес разумно также представить в виде структуры

 

struct Address {

char street[50];

int house;

int flat;

};

 

и одним из полей структуры Worker сделать структуру Address

 

struct Worker {

char name[20];

int age;

float salary;

Address address;

};

 

Обращение к полям вложенной структуры Address происходит через поля структуры Worker; например, задать адрес сотрудника и вывести его на экран можно так:

 

strcpy(manager.address.street, "Ленина");

manager.address.house = 10;

manager.address.flat = 7;

 

printf("Улица: %s\n", manager.address.street);

printf("Дом: %d\n", manager.addrress.house);

printf("Квартира: %d\n",manager.address.flat);

 

Массив структур

Как мы отмечали в самом начале, важной причиной введения структур является желание работать со списком записей. Такой список представляется в виде массива структур. Аналогично обычному массиву, где элементами являются числа или символы, в массиве структур элементами являются структуры. Рассмотрим, как объявляется массив структур, в котором будет храниться информация о сотрудниках.

 

#define SIZE 5

Worker workers[SIZE];

 

Значения полям элементов массива структур можно задать при его объявлении, перечислив поля в том порядке, который указан при объявлении структуры:

 

Worker workers[SIZE] = {

{"Андрей", 30, 5000},

{"Светлана", 51, 2000},

{"Дмитрий", 45, 3000},

{"Анна", 28, 4000},

{"Василий", 37, 1000}

};

 

а можно и после объявления:

 

strcpy(workers[0].name, "Игорь");

workers[0].age = 53;

workers[0].salary = 2500;

 

strcpy(workers[1].name, "Демьян");

workers[1].age = 57;

workers[1].salary = 1500;

 

Причем грамотная группировка элементов выглядит именно так, как показано выше, а не так:

 

//Неправильная группировка!

strcpy(workers[0].name, "Игорь");

strcpy(workers[1].name, "Демьян");

 

workers[0].age = 53;

workers[1].age = 57;

 

workers[0].salary = 2500;

workers[1].salary = 1500;

 

поскольку структура предполагает группировку разнотипных данных, относящихся к одному объекту, а не группировку данных согласно их типу.

 

Вывод массива структур в виде таблицы

Массив структур удобно выводить в виде таблицы, например, как в телефонной книге, экзаменационной ведомости и т.д. Данная задача, несмотря на свою простоту, имеет некоторые тонкости. Очевидный способ вывода таблицы заключается в том, чтобы выводить содержимое каждой структуры на одной строке, разделяя поля пробелами:

 

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);

}

 

 

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

Алгоритмы сортировки применимы к любым объектам, в том числе и к структурам. Рассмотрим особенности, которые нужно учитывать при сортировке массива структур.

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

 

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;

}

}

}

 

Результат сортировки по возрасту:

 

 



Поделиться:


Последнее изменение этой страницы: 2016-04-23; просмотров: 676; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.66.55 (0.019 с.)