Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Алгоритмические основы информатики. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
774 Кб
Скачать

Пример 11. Не нарушая упорядоченности элементов заданного целочисленного массива A(n), вставить заданное число.

/* Не нарушая упорядоченности элементов заданного целочисленного массива A(n), вставить заданное число */

#include <iostream> using namespace std; const int n_max=30;

void input_v(int a[n_max],int &n); void output_v(int a[n_max],int n);

void insert_number(int a[n_max],int &n,int z);

int main(){ int a[n_max]; int n,z; input_v(a,n); output_v(a,n); cout<<endl; cout<<"z="; cin>>z;

insert_number(a,n,z); cout<<endl; output_v(a,n); return 0;

}

void input_v(int a[n_max],int &n){ cout<<"n=";cin>>n;

for (int i=0;i<n;i++){ cout<<"a["<<i+1<<"]= "; cin>>a[i];

}

}

void output_v(int a[n_max],int n){ for (int i=0;i<n;i++) cout<<a[i]<<"\t";

}

void insert_number(int a[n_max],int &n,int z){

int i=n-1;

61

while ((i>=0) && (a[i]>z)){ a[i+1]=a[i];

i--;

}

a[i+1]=z;

n++;

}

Пример 12. Верно ли, что заданный массив A(n) упорядочен по возрастанию?

//Верно ли, что заданный массив A(n) упорядочен по возрастанию?

#include <iostream> using namespace std; const int n_max=30;

void input_v(int a[n_max],int &n); void output_v(int a[n_max],int n); bool prov(int a[n_max],int n);

int main(){ int a[n_max]; int n; input_v(a,n); output_v(a,n);

cout<<"Sequence elements - "; if (prov(a,n))

cout<<" ascending"; // упорядочены gj djphfcnfyb.

else

cout<<" out of ascending order"<<endl; // не упорядочены по возрастанию

return 0;

}

void input_v(int a[n_max],int &n){ cout<<"n=";cin>>n;

for (int i=0;i<n;i++){ cout<<"a["<<i+1<<"]= "; cin>>a[i];

}

}

62

void output_v(int a[n_max],int n){ for (int i=0;i<n;i++) cout<<a[i]<<"\t";

cout<<endl;

}

bool prov(int a[n_max],int n)

{

bool flag=true; int i=0;

while((i<n-1) && (a[i]<a[i+1])) i++;

if (i<n-1) flag=false; return flag;

}

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

/* Из заданного на плоскости множества точек выбрать такие три точки, не лежащие на одной прямой, которые составляют треугольник наименьшей площади*/

#include <iostream> #include <cmath>

using namespace std; struct point

{

double x,y; };

void input_output(point *&a, int &n);

bool reshen(point *a, int n, int &i1, int &j1, int& g1);

int main()

{

point *a;

int i, j, g, n, s, smin, p; input_output(a, n);

63

if (reshen(a, n, i, j, g))

{

cout << "find reshenie\n";

cout << "Point c number: " << i+1 << ", " << j+1 <<", " <<

g+1;

}

else

{

cout << "No reshenie";

}

return 0;

}

void input_output(point *&a, int &n)

{

cout << "n="; cin >> n; a=new point[n];

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

{

cout << "x[" << i + 1 << "]=" << " "; cin >> a[i].x;

cout << "y[" << i + 1 << "]=" << " "; cin >> a[i].y;

}

}

bool reshen(point *a, int n, int &i1, int &j1, int& g1)

{

int k = 0; double smin;

for (int i = 0; i < n - 2; i++) for (int j = i + 1; j < n - 1; j++) for (int g = j+ 1; g < n ; g++)

{

double a1 = sqrt(pow(a[i].x - a[g].x, 2) + pow(a[i].y - a[g].y, 2));

double b = sqrt(pow(a[j].x - a[g].x, 2) + pow(a[j].y - a[g].y, 2));

double c = sqrt(pow(a[j].x - a[i].x, 2) + pow(a[j].y - a[i].y, 2));

if (a1 + b > c && a1 + c > b && c + b > a1);

{

64

float p = (a1 + b + c) / 2; k = k + 1;

float s = sqrt(p * (p - a1) * (p - b) * (p - c)); if (k == 1)

{

smin = s; i1 = i; j1 = j; g1 = g;

}

else

if (s < smin)

{

smin = s; i1 = i; j1 = j; g1 = g;

}

}

}

return k > 0;

}

Контрольные вопросы

1.Какие структуры данных известны?

2.Какую информацию должен включать оператор объявления мас-

сива?

3.Что такое массив?

4.Верно ли, что все элементы массива должны быть одного типа?

5.Вчемпреимуществообъединенияотдельных элементоввмассив?

6.Что такое индекс массива?

7.Что такое размер массива и размерность массива?

8.Совпадаетлиразмерностьмассивасколичествомэлементоввнем?

9.Может ли массив содержать один элемент?

10.Может ли массив вообще не содержать элементов?

11.Что произойдет, если индекс массива выйдет за допустимые

пределы?

12.Каким образом различаются два элемента массива, имеющие одинаковые значения?

13.В каком случае можно сказать, что два массива равны?

14.Какимобразомможнопоменятьместамизначениядвухмассивов?

15.Может ли одномерный массив иметь больше одного индекса?

65

16.Можно ли в качестве индекса одномерного массива использовать выражение?

17.Какими способами инициализируется массив?

18.Что такое статический массив?

19.Что такое динамический массив?

20.Как изменить размер массива, сохранив имеющиеся в нём зна-

чения?

21.Как определить элемент, выбранный пользователем?

22.Какие базовые алгоритмы обработки одномерных массивов известны?

23.Какие методы сортировки массивов известны?

24.В чем суть метода сортировки элементов массива выбором?

25.В чем суть метода сортировки элементов массива пузырьком?

Упражнения

1.Составить систему тестов для программ, приведенных выше (При-

меры1–14).

2.Выполнить тестирование программ, приведенных выше (Приме-

ры 1–14).

3.Выполните на алгоритмах задач для самостоятельной работы

процедуру обоснования алгоритма.

4. Показать на произвольном алгоритме применение различных средств повышения надежности алгоритма.

Задачи Уровень сложности 1

1.Заменить в одномерном массиве, заполненном целыми числами, все элементы, кратные 3, нулями.

2.Одномерный массив заполнен целыми числами. Вычислить сумму его элементов, кратных 5.

3.Одномерный массив заполнен любыми числами. Заменить отрицательные элементы их модулями.

4.Одномерный массив заполнен целыми числами. Возвести в квадрат элементы, стоящие на четных местах.

5.Заполнить одномерный массив из 100 элементов случайными числами от 1 до 10. Сколько получилось пятерок?

6.Вычислить произведение всех отрицательных элементов одномерного массива.

7.Одномерный массив заполнен целыми числами. Удвоить чётные

иутроить нечётные элементы.

66

8.Заполнить одномерный массив из 50 элементов случайными числами от –20 до 20. Сколько получилось отрицательных чисел?

9.Заполнить одномерный массив из 10 элементов случайными числами от 1 до 100. Вычислить максимальный и минимальный элементы массива.

10.Одномерный массив заполнен целыми числами. Поменять местами первый и максимальный элементы.

11.В массиве из 12 вещественных чисел найти наименьший элемент и поменять его с последним элементом.

12.В массиве из 15 целых чисел найти элемент с индексом наиболее близким к среднеарифметическому значению и поменять его местами с первым элементом.

Уровень сложности 2

1. Дан массив размера N и целые числа K и L (1 < K≤ L ≤ N). Найти среднее арифметическое всех элементов массива, кроме элементов

сномерами от K до L включительно.

2.Дан целочисленный массив размера N. Проверить, чередуются ли в нем четные и нечетные числа. Если чередуются, то вывести 0, если нет, то вывести порядковый номер первого элемента, нарушающего закономерность.

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

4.Дан массив A размера N. Найти минимальный элемент из его элементов с четными номерами: A2, A4, A6, ... .

5.Дан массив A размера N. Найти максимальный элемент из его элементов с нечетными номерами: A1, A3, A5, ... .

6.Дан массив размера N. Найти номера тех элементов массива, ко-

торые больше своего левого соседа, и количество таких элементов. Найденные номера выводить в порядке их убывания.

7.Дан массив размера N. Найти номер его первого локального минимума (локальный минимум — это элемент, который меньше любого из своих соседей).

8.Дан массив размера N. Найти номер его последнего локального максимума (локальный максимум – это элемент, который больше любого из своих соседей).

9.Дан массив размера N. Найти количество участков, на которых его элементы возрастают.

67

10.Дан массив размера N. Найти количество участков, на которых его элементы убывают.

11.Дан массив размера N. Найти количество его промежутков монотонности (т. e. участков, на которых его элементы возрастают или убывают).

12.Дано число R и массив A размера N. Найти элемент массива,

который наиболее близок к числу R (то есть такой элемент AK, для которого величина |AK – R| является минимальной).

13.Дан массив размера N. Найти минимальное произведение двух рядом стоящих чисел.

14.Дан массив размера N. Вычислить наибольшее значение модуля разности между соседними элементами.

15.Дан массив размера N. Удалить из массива наименьший и наибольший элементы, сдвинув все оставшиеся элементы к началу массива.

Уровень сложности 3

1.Дан массив из N чисел. Найти число, наиболее часто встречающееся в этом массиве.

2.Дан массив размера N (N – чётное число). Поменять местами его первый элемент со вторым, третий – с четвертым и т. д.

3.Дан массив размера N (N – чётное число). Поменять местами первую и вторую половины массива.

4.Дан массив размера N. Поменять порядок его элементов на обратный.

5.Дан массив A размера N и целые числа K и L (1 < K < L <N). Переставить в обратном порядке элементы массива, расположенные между элементами AK и AL, включая эти элементы.

6.Дан массив A размера N и целые числа K и L (1 < K < L < N). Переставить в обратном порядке элементы массива, расположенные между элементами AK и AL, не включая эти элементы.

7.Дан массив размера N. Обнулить элементы массива, расположенные между его минимальным и максимальным элементами (не включая минимальный и максимальный элементы).

8.Дан массив размера N. Переставить в обратном порядке элементы массива, расположенные между его минимальным и максимальным элементами, включая минимальный и максимальный элементы.

9.Дан массив размера N. Заменить каждый элемент массива на среднее арифметическое этого элемента и его соседей.

68

10. Дан массив размера N, все элементы которого, кроме первого, упорядочены по возрастанию. Сделать массив упорядоченным, переместив первый элемент на новую позицию.

11. Дан массив размера N, все элементы которого, кроме последнего, упорядочены по возрастанию. Сделать массив упорядоченным, переместив последний элемент на новую позицию.

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

13. Дан массив целых чисел, содержащий 20 элементов. Записать в тот же массив сначала все отрицательные числа и нули, а затем все положительные числа, сохраняя порядок их следования.

14. Дан массив целых чисел, содержащий 12 элементов. Записать в этот же массив сначала все нечетные числа, а затем все четные числа, сохраняя порядок их следования.

15. Дан массив вещественных чисел, содержащий 20 элементов. Записать в этот же массив сначала все положительные числа, а затем все отрицательные числа и нули, сохраняя порядок их следования.

16. Написать программу слияния двух упорядоченных массивов, то есть итоговый массив должен быть упорядоченным.

17. Реализовать сортировку слиянием для массива целых чисел

18. Реализовать алгоритм быстрой сортировки для массива целых чисел.

19. Реализоватьпирамидальнуюсортировкуцелочисленного массива. 20. Написать программу бинарного поиска по ключу в массиве це-

лых чисел.

21. На плоскости задано 40 точек. Найти расстояние до самой удаленной от начала координат точки.

22. Из заданного вектора A(3N) получить вектор B(N), очередная компонента которого равна среднему геометрическому очередной тройки компонент вектора А.

23. Вычислить значения функции z = (a + b + ci ) / i, если a изменяется от 0 с шагом 1, b изменяется от 5 с шагом 1, ci является элементом массива C(N). При этом a и b изменяются одновременно с i.

24. Дан массив A(N). Получить массив B(N), i-й элемент которого равен среднему арифметическому первых i элементов массива А: bi =

(a1 + a2 + ... + ai) / i.

25. Вычислить значения многочленов:

P = anxn + an-1 xn-1 + ... + a1 x + a0;

69

Q = a0 xn + a1 xn-1 + ...+ an-1 x + an,

используя формулу Горнера. Коэффициенты многочленов заданы в виде вектора A = (a0 , a1 , ... , an).

26. Дан массив размера N, все элементы которого, кроме первого, упорядочены по возрастанию. Сделать массив упорядоченным, переместив первый элемент на новую позицию.

2.7. Алгоритмы обработки элементов двумерногомассива

Пояснения. В дальнейшем будем считать, что для двумерного массива A(N,М) в обозначении элемента А(i, j) первое значение i соответствует номеру строки и изменяется от 1 до N, а j – номеру столбца и изменяется от 1 до М. В отличие от одномерного массива, в котором использовался только один номер для определения местоположения элемента и требовался только один цикл для ввода элементов, в двумерном массиве для обработки элементов необходимы два вложенных друг в друга цикла. Если значениями параметра внешнего цикла будут номера строк матрицы, то значениями параметра внутреннего цикла – столбцы (или наоборот). Внешний цикл предназначен для изменения номера строки i, а второй, внутренний, – для изменения номера столбца j в текущей строке i. Обработка двумерного массива (матрицы) заключается в том, что вначале поочередно рассматриваются элементы первой строки (столбца), затем второй и т. д. до последней.

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

/* В заданном целочисленном одномерном массиве A(n,m) найти наибольший по величине элемент, последний если их несколько, и его индексы */

#include <iostream> #include <conio.h> using namespace std; int main()

{ int i,j,m,n,kol; int a[20][20]; int max, imax, jmax;

cout<<" n ="; cin>>n; cout<<" m ="; cin>>m; cout<<"input massiv:"<<endl;

70

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