![]() |
|
Программирование >> Структурное программирование
temp = array[j]; array[j] = array[j+l]; array[j+1] = temp; она достигает точно такого же эффекта операторами (рис. 5.15): temp = *elementlPtr; *elementlPtr = *element2Ptr; *element2Ptr = temp; Необходимо отметить несколько свойств функции bubbleSort. Заголовок функции объявляет array как int *array, а не как int array[ ], чтобы указать, что bubblleSort принимает одномерный массив как аргумент (эти записи взаимозаменяемы). Параметр size объявлен как const, чтобы задействовать принцип наименьших привилегий. Функция bubbleSort не нуждается в изменении size для выполнения своей задачи; поэтому для параметра size создается копия его значения в main и модификация этой копии не может изменить значение в main. Размер массива остается неизменным во время выполнения bubbleSort. Поэтому для гарантии того, что size не будет модифицирован, он объявлен как const. Если бы во время сортировки массива его размер изменился, это привело бы к неправильной работе алгоритма. Замечание по технике программирования 5.4 Включение прототипов функции в определения других функций реализует принцип наименьших привилегий путем ограничения вызовов соответствующих функций только теми функциями, в которых появляются соответствующие прототипы. Эта программа записывает значения в массив, сортирует значения в порядке возрастания и печатает результирующий массив. *1& tinclude <iostream.h> tinclude <iomanip.h> - void bubbleSort (int *, const int); main () { const int arraySize = 10; int a[arraySize] = (2, 6, 4, 8, 10, 12, 89, 68, 45, 37}; cout Элементы данных в исходном порядке endl; for (int i = 0; i < arraySize; i++) cout setw(4) a[i]; bubbleSort (a, arraySize); сортировка массива cout endl Элементы данных в возрастающем порядке endl; for (i =0; i < arraySize; i++) cout setw(4) a[i]; cout << endl; return 0; Рис. 5.15. Пузырьковая сортировка вызовом по ссылке (чааь1 из 2) void bubbleSort(int *array, const int size) { void swap(int *, int *); for (int pass = 1; pass < size; pass++) for (int j = 0; j < size - 1; j++) if (array[j] > array[j + 1]) swap(&array[j], &array[j +1]); void swap(int *elementlPtr, int *element2Ptr) { int temp = *elementlPtr; *elementlPtr = *element2Ptr; *element2Ptr = temp; Элементы данных в исходном порядке 2 6 4 8 10 12 89 68 45 37 Элементы данных а аоэрастахяцем порядке 2 4 6 8 10 12 37 45 68 89 Рис. 5.15. Пузырьковая сортировка вызовом по ссылке (часть 2 из 2) Прототип функции swap включен в тело функции bubbleSort, потому что bubbleSort является единственной функцией, которая вызывает swap. Включение прототипа в bubbleSort ограничивает соответствующим образом вызовы swap только теми, которые сделаны из bubbleSort. Другие функции, если бы они пытались вызвать swap, потерпели бы неудачу, поскольку они не имеют доступа к соответствующему прототипу функции. Это привело бы к ошибке компиляции, потому что С++ требует прототипов функции. Заметим, что функция bubbleSort получает в качестве параметра размер массива. Чтобы сортировать массив, функция должна знать его размер. Когда массив передается функции, функция принимает адрес первого элемента массива. Размер массива должен передаваться функции отдельно. Описывая функцию bubbleSort таким образом, что она получает в качестве параметра размер массива, мы получаем возможность использовать эту функцию в любой программе, которая сортирует целые одномерные массивы, причем массивы могут иметь любые размеры. Замечание по технике программирования 5.5 При передаче массива в функции передавайте также и размер массива (это предпочтительнее, чем вараивание в функцию знаний о размере массива). Такой подход позволяет создавать функции более общего вида. Функции общего вида часто могут повторно использоваться во многих программах. Размер массива может быть запрограммирован заранее непосредственно внутри функции. Это ограничивает применимость функции только массивом данного размера и уменьшает возможность ее повторного использования. Такую функцию можно использовать только в программах, работающих с одномерными массивами лишь одного размера, закодированного внутри этой функции. Ь.; -i Операция sizeof, примененная к имени массива, возвращает количество байтов в массиве. #include <iostream.h> main{) float array[20]; ![]() cout << Количество байтов в массиве: sizeof (array) endl; return 0; Количество байтов в массиве: 80 Рис. 5.16. Операция sizeof, примененная к имени массива, возвращает количеаво байтов в массиве Количество элементов в массиве также может быть определено использованием результатов двух операций sizeof. Например, рассмотрим следующее объявление массива: double realArray[22]; Переменные типа double обычно хранятся в 8 байтах памяти. Таким образом, массив realArray содержит в целом 176 байт. Для определения количества элементов в массиве можно использовать следующее выражение: sizeof(realArray) / sizeof(double) Выражение определяет количество байтов в массиве realArray и делит это значение на количество байтов, используемое для хранения значения double. Программа на рис. 5.17 использует операцию sizeof для вычисления количества байтов, используемых для хранения каждого из стандартных типов данных в используемом персональном компьютере. Замечание по мобильности 5.2 Количество байтов, используемое для хранения отдельных типов данных, может быть различным для разных сиаем. При написании программ, которые зависят от размеров типа данных и которые будут выполняться на различных компьютерных системах, используйте sizeof для определения количества байтов, применяемых для хранения различных типов данных. C-I-+ снабжен унарной операцией sizeof, определяющей в байтах размер массива (или любого другого типа данных) во время компиляции программы. Будучи приложена к имени массива, как в программе на рис. 5.16, операция sizeof возвращает общее количество байтов в массиве как значение типа size t, которое обычно соответствует unsigned int. Заметим, что переменная типа float обычно занимает в памяти 4 байта, а объявленный массив array содержит 20 элементов. Поэтому array занимает в памяти 80 байтов.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |