Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Электронный конспект по программированию часть 1.doc
Скачиваний:
131
Добавлен:
13.02.2016
Размер:
33.92 Mб
Скачать

Void Year2009( Book &b )

{

b.year = 2009;

}

В этом случае фактически в процедуру передается адрес структуры и процедура работает с темже экземпляром, что и вызывающая программа. При этом все изменения, сделанные в процедуре, остаются в силе. Работа со структурой-параметром внутри процедуры и вызов этой процедуры из основной программы никак не отличаются от предыдущего варианта.

Передача по адресу

Передача по ссылке возможна только при использовании языка Си++ (она не входит в

стандарт языка Си). Тем не менее, в классическом Си можно передать в качестве параметраадрес структуры. При этом обращаться к полям структуры внутри процедуры надо через оператор ->.

Void Year2009( Book *b ) // параметр – адрес структуры

{

b->year = 2009; // обращение по адресу (через указатель)

}

main()

{

Book b;

Year2009 ( &b ); // передается адрес структуры

}

Сортировка по ключу

Поскольку в структуры входит много полей, возникает вопрос: а как их сортировать? Это

зависит от конкретной задачи, но существуют общие принципы, о которых мы и будем говорить.Для сортировки выбирается одно из полей структуры, оно называется ключевым полемили просто ключом. Структуры расставляются в определенном порядке по значению ключевогополя, содержимое всех остальных полей игнорируется.И еще одна проблема – при сортировке элементы массива меняются местами. Структурымогут быть достаточно больших размеров, и копирование этих структур будет занимать оченьмного времени. ПоэтомуСортировку массива структур обычно выполняют по указателям.

Мы уже использовали этот прием для сортировки массива символьных строк. В памяти формируется массив указателей p, и сначала они указывают на структуры в порядке расположенияих в массиве, то есть указатель p[i] указывает на структуру с номером i. Затем остается только расставить указатели так, чтобы ключевые поля соответствующих структур были отсортированы в заданном порядке. Для решения задачи удобно объявить новый тип данных PBook

указатель на структуру Book.

typedef Book *PBook;

Пример ниже показывает сортировку массива структур по году выпуска книг. Основной алгоритм сортировки массива указателей заложен в процедуру SortYear, которая имеет два параметра – массив указателей и число структур. Здесь используется «метод пузырька».

Void SortYear ( pBook p[], int n )

{

int i, j;

PBook temp; // вспомогательный указатель

for ( i = 0; i < n-1; i ++ ) // сортировка

for ( j = n-2; j >= i; j -- )

if ( p[j+1]->year < p[j]->year ) // еслиуказателистоят

{ // неправильно, то...

temp = p[j]; // переставить их

p[j] = p[j+1];

p[j+1] = temp;

}

}

Основная программа, которая выводит на экран информацию о книгах в порядке их выхода,выглядит примерно так:

#include <stdio.h>

const int N = 20;

struct Book { // новый тип данных - структура

char author[40];

char title[80];

Int year;

Int pages;

};

typedef Book *PBook; // новый тип данных – указатель на структуру

// здесь надо расположить процедуру SortYear

main()

{

Book B[N]; // массив структур

PBook p[N]; // массив указателей

// здесь нужно заполнить структуры

for ( i = 0; i < N; i ++ ) // начальная расстановка указателей

p[i] = &B[i];

SortYear ( p, N ); // сортировка по указателям

for ( i = 0; i < N; i ++ ) // цикл по всем структурам

printf("%d: %s\n", // вывод через указатели

p[i]->year, p[i]->title);

}