Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР10-С++-26-апреля-2012.doc
Скачиваний:
24
Добавлен:
15.09.2019
Размер:
2.35 Mб
Скачать

Нахождения минимума для примера 10.8

4. Изменить значения элементов с индексами k и l так, чтобы пер­вый принял значение второго, а второй - первого, т.е. фактически про­извести перестановку минимального элемента с первым элементом в не­упорядоченной части массива (блок 14). Поясняя действия выполняемые в блоке 14 и назначение вспомогательной переменной b, на первый взгляд, достаточно записать ak = аl; аl = ak , что в соответствии с ранее принятыми соглашениями означало бы:

принять значение ak равным аl

принять значение аl равным ak.

Однако обмен значений а этом случае не произойдет. После первого действия прежнее значение ak окажется утраченным и при выполнении второго действия аl не получит этого значения. В результате ak и аl будут иметь одно и то же значение, которое имел до этого элемент аl. Если порядок действия изменить, записать аl = ak; ak = аl, то в итоге оба элемента будут иметь значение аl. Поэтому необходи­мо использовать вспомогательную величину b и выполнять действия в та­ком же порядке, как на блок-схеме. Значение ak сперва запоминается в виде значения b, и только после этого элемент ak принимает значе­ние аl. В результате выполнения последнего действия элемент аl принимает то значение, которое прежде имел элемент ak и которое было зафиксировано с помощью b.

5. Увеличить длину упорядоченной части на единицу (блок 15).

6. Проверить, не превышает ли m-1 количество элементов упорядоченной части, если превышает, то перейти к блоку 17, если не превышает, то перейти к блоку 8.

7. Вывести (сохранить) значения элементов последовательности, теперь уже полностью упорядоченной (блоки 17 - 20).

Программа на языке С++ может иметь следующий вид:

/*Сортировка методом нахождения минимума */

#include <stdio.h>

#include <conio.h>

#include <math.h>

#include <iostream.h>

#define m 19

int main()

{

int k, i, j, l;

float a[m],b, c;

// Ввод массива a

for (k=0; k<=m; k++)

{

cout <<"Введите " << k << "-ый элемент массива a: ";

cin >> a[k];

}

// Сортировка массива a по возрастанию

for (l=0; l<=m; l++)

{

k=l;

for (j=l+1; j<=m; j++)

{if (a[j] < a[k]) k = j;}

b = a[k]; a[k]=a[l]; a[l] = b;

}

// Вывод отсортированного массива a

for (k=0; k<=m; k++)

{

cout <<"k = " << k << " a[k] = " << a[k] << endl;

}

cout << "Нажмите любую клавишу..." ;

getch();

return 0;

}

1.4.10. Перестановка двух элементов массива

Для перестановки двух элементов массива x[] с индексами k и m, необходимо использование дополнительной переменной (tmp), для хранения копии одного из элементов (рис. 10.6а, но можно обойтись и без использования дополнительной переменной tmp. В этом случаи алгоритм перестановки имеет следующий вид (рис. 10.6б).

а)

б)

Рис. 10.6 Алгоритм и фрагмент программы перестановки двух элементов массива c использованием дополнительной переменной а) и без нее б)

В большинстве случаев предпочтительнее использовать первый способ, поскольку он не содержит дополнительных вычислений, что особенно важно при перестановке вещественных чисел.

Пример 10.11

Переставить первый и последний элемент массива x[] местами. Количество элементов массива n.

Решение

В С++ нумерация элементов массива начинается с нуля, поэтому номер последнего элемента массива (n–1) .

1 способ: tmp=x[0]; x[0]=x[n-1]; x[n-1]=tmp;

2 способ: x[0]=x[0]+x[n-1]; x[n-1]=x[0]-x[n-1]; x[0]=x[0]-x[n-1];

Пример 10.12

Поменять местами заданный элемент массива x[k] с последующим.

Решение

При решении этой задачи необходимо учитывать, что если заданный элемент массива x[k] является последним, то обмен выполнить не возможно, поскольку последующий элемент отсутствует.

if(k == n-1)

puts("Обмен не возможен.");

else

{

tmp=x[k];

x[k]=x[k+1];

x[k+1]=tmp;

}

Рисунок 10.7 Алгоритм и фрагмент программы перестановки

заданного элемент массива x[k] с последующим

При перестановке с предыдущим элементом, обмен невозможен если заданный элемент является первым (k=0).