Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика. Базовый курс. Ч.3. Основы алгоритмизации и про- граммирования в среде Visual C++ 2005.pdf
Скачиваний:
51
Добавлен:
05.02.2023
Размер:
3.81 Mб
Скачать

60

Еще раз обращаем внимание, что хотя мы и используем массивы с размерностью на 3 элемента (берем три точки), но описываем массивы на 4 (чтобы не путаться с нулевыми по номеру элементами). Обратите также внимание, что поскольку координаты заданы в виде целых чисел, а на их основе получаем расстояние, которое является вещественным числом, то для преобразования типа от целого к вещественному (точнее – типу двойной точности) используем (double). Здесь для вычисления квадратного корня sqrt() нужно подключить cmath (в отличие от традиционногоmath.h), поскольку при вычислении корня, вообще говоря, возможны комплексные числа.

8.2.Датчик случайных чисел

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

rand()%RAND_MAX – дает случайное целое число из интервала от 0 до положительного целого RAND_MAX-1 (в качестве RAND_MAX можно указать сразу конкретное число). Кроме того, для запуска этого датчика случайных чисел(чтобы получать новый набор случайных чисел при каждом новом запуске программы), используют функцию srand(time(0)), т.е. для старта генератора случайных чисел будет использоваться системное время компьютера. Причем это время следует преобразовать в беззнаковое целое(unsigned

int). Кроме того, требуется подключить заголовочный файл <stdlib.h>, содержащий эти функции. Для получения системного времени нужно подключить заголовочный файл <time.h>

В примере 8.2 будем впервые использовать так называемые манипуляторы. Они позволяют, например, выводить числа по определенному формату – скажем, отводить на вывод числа три позиции (независимо от того, что число может быть и двузначным). Для использования манипуляторов нужно подключить заголовочный файл

<iomanip>.

Пример 8.2. В двумерном массиве, заданном с помощью датчика случайных чисел, подсчитать количество строк, имеющих элемент, равный первому элементу строки, и указать номера этих строк.

61

#include <iostream>

#include <stdlib.h>

#include <iomanip>

#include <windows.h> #include <time.h> using namespace std; int main()

{ const int n=5; bool nal;

int i, j,k,b, a[n+1][n+1], num[n+1]; char str[256], str1[256];

// запуск генератора случайных чисел srand((unsigned int)time(0));

//формируем массив из случайных чисел (от 0 до 4) for (i=1; i<=n; i++)

for (j=1; j<=n; j++)

{a[i][j]=rand()%5;} // вывод массива for (i=1; i<=n; i++)

{cout<<"\n";

for (j=1; j<=n; j++)

{cout<<setw(3)<< a[i][j];} }

//подсчет числа строк (по условию) k=0;

for (i=1; i<=n; i++)

{b=a[i][1]; nal=false; for (j=2; j<=n; j++)

{if (a[i][j] = = b) nal=true; if nal break;} if (nal) {k=k+1; num[k]=i;};

}

AnsiToOem(" \n количество строк=",str); AnsiToOem(" их номера: ", str1); cout<<str<<k<<str1;

for (i=1; i<=k; i++) cout<<setw(3)<<num[i]; cout<<"\n";

return(0);

}

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

константа const int n=5. Благодаря этому, мы можем легко изменить размерность массива и количество оборотов цикла(при очередном запуске программы изменим значение этой константы в тексте программы). В программе использована также логическая переменная nal, которая примет значение «истина» (true), как толь-

62

ко найдем элемент, равный первому в строке. Это позволит сократить число оборотов цикла(не будет продолжаться поиск до конца строки).

Рис. 8.19. Результат работы программы примера 8.2

Практические задания

8.1. Дана матрица 5´5. Для данного натурального М найти сумму тех элементов матрицы, сумма индексов которых равна М.

8.2. Дана матрица 5´5. Построить одномерный массив В(5), состоящий из сумм элементов строк.

8.3. Дана матрица 5´5. Построить одномерный массив В(5), состоящий из произведений элементов столбцов.

8.4. Дана матрица 5´5. Построить одномерный массив В(5), состоящий из наименьших значений элементов строк.

8.5. Дана матрица 5´5. Построить одномерный массив В(5), состоящий из средних арифметических элементов строк.

8.6. Дана матрица 5´5. Вывести ее в транспонированном виде (поменять местами строки со столбцами).

8.7. Дана матрица 5´5. Вывести ее в верхнем треугольном виде (т.е. напечатать только элементы верхнего треугольника и именно в виде треугольника).

8.8. Дана матрица 5´5. Вывести ее в нижнем треугольном виде. 8.9. Результаты соревнований по прыжкам в длину представле-

ны в виде матрицы5´3 (5 спортсменов по 3 попытки у каждого). Указать, какой спортсмен и в какой попытке показал наилучший результат.

8.10. Результаты соревнований по пятиборью представлены в виде матрицы 5´5 (5 спортсменов и 5 видов соревнований), в которых указаны места, занятые каждым спортсменом в данном виде. Найти лучшего спортсмена (наименьшая сумма мест).

63

В последующих трех задачах использовать следующее:

Таблица футбольного чемпионата задана квадратной матрицей порядка n, в которой все элементы, принадлежащие главной диагонали, равны нулю, а каждый элемент, не принадлежащий главной диагонали, равен 3, 1 или 0 (число очков, набранных в игре: 3 – выигрыш, 1 – ничья, 0 – проигрыш).

8.11. Найти число команд, имеющих больше побед, чем поражений.

8.12. Определить номера команд, прошедших чемпионат без поражений.

8.13. Выяснить, имеется хотя бы одна команда, выигравшая более половины игр.

8.14. Дана действительная матрица размера n x m, в которой не все элементы равны нулю. Получить новую матрицу путём деления всех элементов данной матрицы на её наибольший по модулю элемент.

8.15. Дана действительная квадратная матрица порядка12. Заменить нулями все её элементы, расположенные на на главной диагонали и выше неё.

8.16. Дана действительная матрица размераn´m. Найти сумму наибольших значений элементов её строк.

8.17. В данной действительной квадратной матрице порядкаn найти сумму элементов строки, в которой расположен элемент с наименьшим значением. Предполагается, что такой элемент единственный.

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

8.19. Дана действительная матрица размераn´m, все элементы которой различны. В каждой строке выбирается элемент с -наи меньшим значением, затем среди этих чисел выбирается наибольшее. Указать индексы элемента с найденным значением.

8.20. Дана целочисленная квадратная матрица порядка 8. Найти наименьшее из значений элементов столбца, который обладает наибольшей суммой модулей элементов. Если таких столбцов несколько, то взять первый из них.

8.21. Составить программу формирования двумерного массива n´n по следующему правилу: элементы главной диагонали приравнять 1, ниже главной диагонали – 0, а выше – сумме индексов.