Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual_C_console.pdf
Скачиваний:
34
Добавлен:
16.05.2015
Размер:
954.14 Кб
Скачать

144

исключает необходимость уменьшать последнее значение счетчика при выходе из цикла.

Функции для обработки произвольных полей структур

Структуры удобны для описания физических объектов. Если же требуется выполнить одинаковую обработку для разных полей структуры, то возникает затруднение, связанное с передачей в функцию произвольного поля структуры. Например, пусть имеется список автомобилей, в котором каждый автомобиль является объектом типа структуры и требуется сортировать этот список по разным параметрам (по государственному номерному знаку, по марке автомобиля, фамилии владельца и т. д.). Проблема заключается в том, что для сортировки по этим параметрам имя параметра должно передаваться явно. Так в примере ниже для обращения к первому полю следует записать Smpl[i].st1, а для обращения ко второму полю

Smpl[i].st2.

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

Ниже приведен пример сортировки массива структур по разным полям.

// Программа сортировки массива структур по любым полям

#include "stdafx.h" #include <conio.h> #include <iostream> using namespace std; #define SIZE 6

 

145

typedef struct

// Объявление структуры

{

 

char st1[20]; double num; char st2[20];

} MyStruct;

MyStruct Smpl[SIZE]; // Объявление массива структур void sorting (int size, int d);

int _tmain()

{

long d = 0;

// Переменная для разности адресов

int choose = 1;

 

char *pt1, *pt2;

 

//Инициализация 1-го поля структуры strcpy(Smpl[0].st1, "Test"); strcpy(Smpl[1].st1, "Check"); strcpy(Smpl[2].st1, "Zero"); strcpy(Smpl[3].st1, "Short"); strcpy(Smpl[4].st1, "Shoes"); strcpy(Smpl[5].st1, "Accept");

//Инициализация 2-го поля структуры strcpy (Smpl[0].st2, "Float");

strcpy (Smpl[1].st2, "Confirm"); strcpy (Smpl[2].st2, "Assembler"); strcpy (Smpl[3].st2, "Access"); strcpy (Smpl[4].st2, "Bottom"); strcpy (Smpl[5].st2, "Twain");

cout << "Введите 1 для сортировки по 1-му полю \n"

<<“2 для сортировки по 2-му полю”<< endl;

cin >> choose; switch (choose)

{

case 1: d = 0; // Для 1-го поля смещения нет break;

146

case 2: pt1 = Smpl[0].st1;// Настройка указателя на 1-е поле pt2 = Smpl[0].st2;// Настройка указателя на 2-е поле d = pt2 - pt1; // Разность адресов

break;

default: cout << ”Неправильный ввод”;

}

sorting (SIZE, d);

// Вызов программы сортировки

for(int i = 0; i < SIZE; i++)

// Вывод первого поля

cout << Smpl[i].st1 << endl;

cout << "\n\n Next\n\n";

 

for(int i = 0; i < SIZE; i++)

// Вывод второго поля

cout << Smpl[i].st2 << endl; _getch();

return 0;

}

// Программа сортировки void sorting (int size, int d)

{

MyStruct temp; // Временная структура для перестановок char *pt1, *pt2, *ptemp;

ptemp = temp. st1;

// Сортировка по способу «пузырька» for(int k = 0; k < size - 1; k++)

{

for(int i = 0; i < size - k - 1; i++)

{

pt1 = Smpl[i].st1;

pt1 += d; // Адрес поля в текущей структуре pt2 = Smpl[i + 1].st1 ;

pt2 += d; // Адрес поля в следующей структуре if (strcmp(pt1, pt2) > 0)

{

strcpy(ptemp, pt1); // Перестановка strcpy(pt1, pt2);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]