Как заполнить матрицу случайными числами c
Перейти к содержимому

Как заполнить матрицу случайными числами c

Как заполнить матрицу случайными числами c

Completing the CAPTCHA proves you are a human and gives you temporary access to the web property.

What can I do to prevent this in the future?

If you are on a personal connection, like at home, you can run an anti-virus scan on your device to make sure it is not infected with malware.

If you are at an office or shared network, you can ask the network administrator to run a scan across the network looking for misconfigured or infected devices.

Another way to prevent getting this page in the future is to use Privacy Pass. You may need to download version 2.0 now from the Chrome Web Store.

Cloudflare Ray ID: 71ad7c052d116910 • Your IP : 82.102.23.104 • Performance & security by Cloudflare

Типовые задачи по С++ для новичков (часть 3, двумерные массивы)

И снова здравствуйте! В прошлой части мы рассмотрели что такое одномерный массив в C++, узнали для чего он необходим, а так же порешали некоторые типовые академические задачи. В этот раз примеры программ будут написаны в среде Visual Studio 2017, но вы можете использовать любой другой инструмент, например Code::Blocks или онлайн компиляторы. Сегодня мы рассмотрим двумерный массив. Это также простейшая структура данных как и одномерный массив, к данным все также возможно обращаться по индексу, но есть некоторая особенность. Давайте рассмотрим ее так же на примере контейнера с яблоками:

Получается, что у нас теперь многоэтажный контейнер, в каждой ячейке которой находятся яблоки (ячейка так же может быть пустой, для ссылочных типов это значение null и ноль для значимых типов). Для того что бы взять или положить яблоки из определенной ячейки необходимо сначала выбрать строку, а затем столбец, после чего мы возьмем необходимые нам яблоки, или наоборот положим. Обратите внимание, что нумерация ячеек строк и столбцов начинается с 0! Это важно, так как индексация массива начинается всегда с 0 а не 1. Т.е что бы обратиться к первой ячейке контейнера, нам необходимо достать яблоки из нулевой ячейки на пересечении двух координат (вспомнили игру Морской бой? =) ). Идем на нулевую строку и ищем нулевой столбец где находится нужная нам ячейка.

Здесь у нас лежат два яблока. Так же не забываем, что С++ строго типизированный язык программирования, поэтому мы не можем в целочисленный массив записать вещественное число (float или double) или символ (char) и наоборот. Но существуют языки в которых такое возможно, например PHP и Java Script. Итак для работы с нашим контейнером и ячейками, нам предварительно нужно его создать и заполнить ячейки яблоками. Кладем в ячейку с координатами [0][0] два яблока, [0][1] — три яблока, [0][2] — одно яблоко и так далее до координат ячейки с индексом [4][4]. Что мы сделали? Правильно, инициализировали массив! В коде это будет выглядеть следующим образом:

Вот так мы реализовали программу заполнения массивы и вывода его на пользовательский экран в консоли. Результат на картинке:

1

Как и в одномерные массивы по ходу написания программы и ее исполнения мы можем изменять количество яблок в секциях контейнера нашего двумерного массива, например в ячейку с индексом[0][2] поместить восемь яблок, а в [2][4] сто яблок (размер каждой секции зависит от типа контейнера, он у нас int, а в C++ размер этого типа равен от -2 147 483 648 до 2 147 483 648). А вот размер самого контейнера и количества ячеек ( строки и колонки) мы пока изменять не можем. Для этой цели служит отдельный вид массивов, именуемый — динамическим.

В массив мы можем записать вещественные числа, символы и строки:

Попробуем теперь решить несколько типовых академических задач. Для начала заполним двумерный массив вручную. Для этого мы объявляем необходимый тип массива, его размерность (количество строк и столбцов) и во вложенном цикле вводим с клавиатуры значения до тех пор, пока не заполним весь массив согласно его размерности:

Давайте теперь попробуем заполнить массив случайными числами от 0 до 10. Для этого мы будем использовать знакомую из предыдущей статьи технику. Подключим header time.h или ctime:

И получаем результат (у вас результат может отличаться, функция rand(); может сгенерировать другие значения).:

3

Заполнить случайными числами наш двумерный массив позволила функция rand() % 11; Но в этом примере существует такая же проблема как и в случае с примером, когда мы заполняли одномерный массив случайными числами. Данный код генерирует случайные числа только один раз. При следующих запусках программы, в наш двумерный массив будут записаны те же случайные числа, что и в самый первый раз. Что бы уййти от этой проблемы, необходимо применить специальную функцию srand();.

Она на позволяет устанавливать начало последовательности, генерируемой функцией rand() (функция rand() возвращает псевдослучайные числа). Функция srand() позволяет запускать программу несколько раз с различными последователь­ностями псевдослучайных чисел.

Добавим необходимую функцию в наш код:

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

Давайте мы теперь попробуем заполнить контейнер случайным количеством яблок и найдем, сколько ячеек, в которых находится четное количество яблок (наш двумерный массив заполним случайными числами и посчитаем все четные элементы). Для этого необходимо завести отдельную переменную и в отдельном вложенном цикле for проделать операцию с остатком от деления на 2 и проверить также на ноль.

Screenshot_1

Запустим и увидим результат (у вас результат может отличаться, так как если вы помните, мы используем функцию srand();):

Исходный текст программы:

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

Получаем результат (у вас результат может отличаться, так как если вы помните, мы используем функцию srand();).

Screenshot_1

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

И вот что получаем на выходе программы (у вас результат может отличаться, так как если вы помните, мы используем функцию srand();).:

Screenshot_1

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

После компиляции программы посмотрим результат (как вы уже понимаете, результаты в вашем случае могут быть другими):

Screenshot_1

Ффух, идем дальше. И я приведу пример очередной задачки, которая часто может встречаться на тернистом пути программиста. Среднее арифметическое мы уже находили, правда во всем нашем двумерном массиве. Давайте теперь попробуем найти среднее арифметическое каждой строки, после чего все эти числа поместить в одномерный массив.

Соответственно, после запуска приложения, проверим результат:

Screenshot_1

А давайте теперь попробуем поработать с диагоналями матрицы! В матрице существует главная и побочная диагональ. На рисунке ниже, в контейнере с права зеленым показана линия главной диагонали. Соответственно справа — побочная диагональ.

Article

Очень часто встречаются задачи, где необходимо перебирать элементы диагоналей, ниже или выше этих диагоналей и тд. Рассмотрим такой вариант задачи: «Создайте двумерный массив 5*5. Метод заполнения произвольный.
Выведите его. Все элементы главной диагонали занесите в одномерный массив и выведите его».

Запустим нашу программу и посмотрим результат:

Screenshot_1

Все верно, в одномерный массив записались элементы главной диагонали нашего двумерного массива с «яблоками».

А теперь найдем все элементы побочной диагонали.

Screenshot_1

Запускаем программу и проверяем получившийся результат:

Вообще удобно запомнить или держать шпаргалку с методикой обработки двумерных массивов, я приведу некоторую из них:

  • В первом цикле мы бегаем по строкам двумерного массива;
  • Во втором (вложенном цикле for) мы бегаем по столбцам;
  • Элементы на главной диагонали — row = col;
  • Элементы ниже главной диагонали — col > row;
  • Элементы выше главной диагонали — col < row;
  • Элементы на побочной диагонали — col = Rows — row;
  • Элементы ниже побочной диагонали — col > Rows — row;
  • Элементы выше побочной диагонали — col < Rows — row;

На этой ноте завершаю эту статью. Мы еще вернемся к массивам и матрицам. Но только после того, как научимся оперировать непосредственно с памятью и пощупаем указатели. Так что следующий этап у нас, да да — указатели =) До встречи!

Заполнение матрицы случайными числами

Выполняется также в двойном цикле аналогично одномерным массивам. В примере показано заполнение целой матрицы случайными числами в интервале [a,b](для вещественных чисел формула изменится – см. одномерные массивы). В этой и последующих программах будем считать, что объявлена целая матрица Mна N, где Mи N— целые константы (объявленные через const), а также целые переменные i и j.

for ( i = 0; i < M; i ++ )

for ( j = 0; j < N; j ++ )

A[i][j] = random(b-a+1) + a;

Вывод элементов матрицы

Двумерные массивы необходимо выводить в привычном виде (по строкам), начиная вывод новой строки массива в новую строку экрана.

for ( i = 0; i < M; i ++ )

Суммирование элементов матрицы

Суммирование диагональных элементов матрицы (вычисление следа матрицы)

Суммирование элементов заданной строки матрицы

Для двумерного массива b размером Mна N необходимо вычислить сумму элементов строки с номером k.

Суммирование элементов строк матрицы

Необходимо вычислить сумму элементов каждой строки двумерного массива b размером Mна Nс выводомрезультатов на экран.

printf (“Сумма элементов строки %d=%d \n “, i, S); >

Транспонирование матрицы

Необходимо заменить строки матрицы ее столбцами, а столбцы – строками.

int b[m][n], a[n][m], i, j;

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

Умножение матрицы на вектор

int a[m][n], i, j, s, b[n], c[m];

Удаление строки из матрицы

Требуется удалить строку с заданным номером k. Решение задачи аналогично удалению элемента из одномерного массива. Все строки, начиная с (k+1)-й, нужно переместить вверх. Число строк уменьшается на 1.

Удаление столбца осуществляется аналогично.

Перестановка строк матрицы

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

С использованием вспомогательного массива, в который целиком пересылается одна из строк для временного хранения.

Примеры решения

1. Вычисление и вывод на экран таблицы умножения в форме матрицы Пифагора.

По данной программе в двумерном массиве не будут заполнены нулевая строка и нулевой столбец.

2. Заполнение матрицы случайными числами в диапазоне от 0 до 99 и поиск в ней максимального значения.

int a[n][n], i, j, imax, jmax;

imax=jmax=0; // начало поиска

printf (“max=a[%d][%d]=%d\n”, imax, jmax, a[imax][jmax]);

3. Дан двумерный массив различных вещественных чисел, содержащий 5 строк и 4 столбца. Строку, содержащую максимальный элемент массива, поменять местами со строкой, содержащей минимальный элемент:

int maxi, mini, i, j;

puts("Введите исходный массив: \n");

puts("Массив после перестановки строк:\n");

Порядок выполнения работы

1. Изучить теоретические сведения.

2. Ответить на контрольные вопросы.

3. Выполнить задание.

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

1. Что такое двумерный массив?

2. Сколько индексов требуется для обращения к элементу двумерного массива и что определяет каждый из индексов?

3.Как хранятся в памяти ЭВМ двумерные массивы?

4.Какими способами может быть описан двумерный массив?

5.Как производится ввод элементов двумерного массива?

6.Как производится вывод элементов двумерного массива?

Задания для выполнения

1. Ввести двумерный массив размером m на n. Вычислить среднее арифметическое значение элементов массива, имеющих четные отрицательные значения,или вывести сообщение об отсутствии в массиве таких значений.

2. Ввести двумерный массив размером m на n. Вычислить произведение и количество элементов, находящихся в интервале от AдоB,или вывести сообщение об отсутствии в массиве таких значений.

3. Ввести двумерный массив размером m на n. Вычислить среднее арифметическое значение элементов, являющихся нечётными числами, или вывести сообщение «Таких значений нет».

4. Ввести двумерный массив размером m на n. Вычислить произведение и количество элементов, кратных 3 и некратных 5, или вывести сообщение «Таких значений нет».

5. Ввести двумерный массив размером m на n. Найти и вывести те элементы, которые при делении на 7 дают остаток 2 или 5, или вывести сообщение «Таких значений нет».

6. Ввести двумерный массив размером m на n. Найти количество и сумму тех элементов, которые делятся на 5 и не делятся на 7, или вывести сообщение «Таких значений нет».

7. Ввести двумерный массив размером m на n. Вычислить произведение элементов, кратных заданному числу k(ввести с клавиатуры), или вывести сообщение «Таких значений нет».

8. Ввести двумерный массив размером m на n. Получить сумму и количество элементов, принадлежащих отрезку [3,17], или вывести сообщение «Таких значений нет».

9. Ввести двумерный массив размером m на n. Найти и вывести минимальное из А0, А2, А4, … и максимальное из А1, А3, А5, …

10. Ввести двумерный массив размером m на n. Получить сумму тех членов массива, которые нечётны и положительны, или вывести сообщение «Таких значений нет».

11. Ввести двумерный массив размером m на n. Вычислить среднее арифметическое значение элементов, кратных сумме их индексов (i+j), или вывести сообщение «Таких значений нет».

12. Ввести двумерный массив размером m на n. Вывести те значения, которые заканчиваются заданной цифрой (ввести с клавиатуры), или вывести сообщение «Таких значений нет».

13. Ввести двумерный массив размером m на n. Найти сумму тех из них, которые являются квадратами некоторого заданного числа k, или вывести сообщение «Таких значений нет».

14. Ввести двумерный массив размером m на n и некоторое число P. Вывести номера тех элементов, модуль значений которых больше этого числа, или вывести сообщение «Таких значений нет».

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

Написать программу по обработке двумерного массива.

1. Определить количество строк, не содержащих ни одного нулевого элемента.

2. Определить количество столбцов, не содержащих ни одного нулевого элемента.

3. Определить количество столбцов, содержащих хотя бы один нулевой элемент.

4. Определить произведение элементов в тех строках, которые не содержат отрицательных элементов.

5. Определить сумму элементов в тех столбцах, которые не содержат отрицательных элементов.

6. Определить сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент.

7. Найти сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент.

8. Найти сумму элементов в тех столбцах, которые содержат хотя бы один отрицательный элемент.

9. Найти сумму модулей элементов, расположенных ниже главной диагонали.

10. Найти сумму модулей элементов, расположенных выше главной диагонали.

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

12. Найти номер первой из строк, содержащих хотя бы один положительный элемент.

13. Определить номер первого из столбцов, содержащих хотя бы один нулевой элемент.

14. Найти номер первого из столбцов, не содержащих ни одного отрицательного элемента.

15. Найти номер первой из строк, не содержащих ни одного положительного элемента.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *