Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие С++- не книжкой_новое.doc
Скачиваний:
4
Добавлен:
04.11.2018
Размер:
765.44 Кб
Скачать

Void main ()

{

int a[100],n,b;

bool f;

cout<<"Enter n<100 ";

cin >>n;

cout<<"\nArray:\n";

randomize();

for (int i=0;i<n;i++) //Генерируем массив случайных чисел в

//диапазоне [0..50] и выводим на экран

{

a[i]= random(51);

cout <<a[i]<<" ";

}

cout<<"\nSotr:\n";

do

{

f=false;

for(int i=0;i<n-1;i++)// Просматриваем весь массив

if (a[i]>a[i+1])

{

b=a[i];

a[i]=a[i+1];

a[i+1]=b;

f=true; //Был обмен

}

}

while (f); // Проверяем, был ли хоть один обмен

for (int i=0;i<n;i++) // Выводим на экран отсортированный

//массив

cout<<a[i]<<" ";

}

Отсортировать случайным образом генерируемый массив, используя следующие алгоритмы.

  1. Усовершенствованная пузырьковая сортировка. Используется принцип пузырьковой сортировки, но массив просматривается не от начала до конца, а от начала до последнего перемещенного элемента (после которого все элементы уже упорядочены). Вначале этим «последним» элементом выбирается последний элемент массива.

  2. Простой выбор. Выбрать наибольший элемент массива и поменять его местами с последним (n-ным) элементом массива. Затем из n-1 первых элементов опять выбрать наибольший и опять поменять его местами с (n-1)-м. И так далее, пока весь массив не будет упорядочен.

  3. Простые вставки. Так обычно сортируют карты: из веера карт берут одну, стоящую не по старшинству и помещают между двумя уже упорядоченными картами. Массив просматривают с начала до конца. Рассматривается i-тый элемент массива и вставляется на нужную позицию в ряду первых (i-1) уже упорядоченных элементов. (Первоначально “упорядочен” только первый элемент массива). Если i-тый элемент перемещается в j-тую позицию, то все элементы с j-того по (i-1)-ый элемент должны быть сдвинуты на одну позицию вправо.

  4. Метод подсчета. Если для какого-то элемента массива известно, что если он больше, чем i других элементов этого массива, то он должен стоять на (i+1)-ом месте после упорядочивания. Для каждого i-го элемента массива считают, сколько чисел меньше его, и результат заносят в массив индексов с[i]. Это делается следующим образом. Сравнивают попарно все элементы массива: i-тый и j-тый. (Одна пара чисел может сравниваться только один раз.) Если i-тый больше, то с[i] увеличивают на единицу, иначе c[j] увеличивают на единицу. После формирования массива индексов с, формируют результирующий массив.

  5. Метод распределяющего подсчета. Используется, если в массиве много одинаковых элементов. Создается массив индексов d[i]. Размерность массива – число различных между собой элементов исходного массива. Затем в элемент массива d[i] заносят количество элементов массива, равных i, и в результирующий массив записывают по d[i] элементов i-того типа. Например, исходный массив 0010101031; d[0]=5, d[1]=4, d[2]=0, d[3]=1. Результирующий массив 0000011113.

1.6.Функции

Функция - это именованная часть программы, к которой можно обращаться из других частей программы столько раз, сколько потребуется. Программа на языке С++ - это совокупность функций, каждая из которых должна быть описана до ее использования. Определение функции имеет следующий формат:

тип_функции имя_функции (спецификация_формальных_параметров)

тело_функции

Здесь тип_функции – тип возвращаемого функцией значения, в том числе void, если функция не возвращает никакого значения. Тип функции может быть любым кроме массива и функции. Имя_функции – идентификатор. Спецификация_формальных_параметров может отсутствовать (но скобки обязательны) или представлять собой список спецификаций для каждого параметра, имеющий вид:

тип имя_параметра

или

тип имя_параметра= умалчиваемое значение.

Тело_функции - это блок или составной оператор, заключенный в скобки {}. Очень важным оператором тела функции является оператор возврата в точку вызова

return выражение;

или

return;.

Выражение в операторе return определяет возвращаемое функцией значение, именно то значение, которое будет результатом обращения к функции. Если функция имеет тип void, то этот оператор можно опустить.

Обращение к функции (вызов функции ) – это выражение вида

имя_функции (список_фактических_параметров)

При обращении к функции формальные параметры заменяются фактическими, причем соблюдается строгое соответствие параметров по типам. Именно поэтому необходимо определить или хотя бы объявить функцию до ее вызова. Объявление функции (прототип) совпадает с заголовком определения функции после которого ставится ;. В списке формальных параметров в этом случае могут отсутствовать имена параметров.

Приведем несколько примеров.

Пример 1. Составить функции для нахождения максимума двух целых чисел, куба целого числа. Найти куб максимального из двух чисел и вывести на экран, используя данные функции.

# include <iostream.h>

int max (int n, int m ) // определение функции нахождения максимума

{return n<m?m:n;}

int cube(int); //прототип функции вычисления куба целого числа

void main (void)

{

int i,j,m;

cin >>i>>j;

m=cube(max(i,j));// вложенные вызовы функций – m – куб

// максимального из двух чисел

cout<<“\nmax=”<<m);

}

int cube(int x)// Определение функции вычисления

//куба целого числа

{return x*x*x;}

Пример 2. Определить функцию, подсчитывающую количество нулей в троичной записи натурального числа. Найти все пары натуральных чисел в диапазоне [n1,n2], разность между которыми равна 4 и в троичной записи которых равное число нулей. Например, такой парой является пара 6(203) и 10(1013) (в троичной записи по одному нулю).

# include <iostream.h>