0 / 0 / 0 Регистрация: 10.02.2019 Сообщений: 22 |
|
1 |
|
Найти минимальный элемент двумерного массива10.02.2019, 12:24. Показов 17547. Ответов 5
6. Найти минимальный элемент двумерного массива. Использовать только стандартные и простые команды c++
0 |
632 / 437 / 219 Регистрация: 10.06.2016 Сообщений: 2,020 |
|
10.02.2019, 14:56 |
2 |
Числа целые? задаются как случайные?
0 |
0 / 0 / 0 Регистрация: 10.02.2019 Сообщений: 22 |
|
10.02.2019, 15:08 [ТС] |
3 |
Да, целые числа вводим с клавиатуры
0 |
JohnBlack123 215 / 162 / 52 Регистрация: 09.12.2017 Сообщений: 520 |
||||
10.02.2019, 16:26 |
4 |
|||
Сообщение было отмечено DChibukov как решение РешениеDChibukov, так?
1 |
0 / 0 / 0 Регистрация: 10.02.2019 Сообщений: 22 |
|
10.02.2019, 16:51 [ТС] |
5 |
JohnBlack123, Да, спасибо
0 |
witalya 0 / 0 / 0 Регистрация: 18.11.2020 Сообщений: 3 |
||||
18.11.2020, 09:25 |
6 |
|||
DChibukov, так?
Добавлено через 5 минут
0 |
У вас проверка выделения памяти не на месте — вы проверяете if (!a)
уже после того, как с этим a
работали. Только это все равно неважно, потому что раз вы используете new
, а не new(std::nothrow)
, то если не хватит памяти, он не вернет нулевой указатель, а сгенерирует исключение. Так что эта проверка лишняя.
Номер элемента в друмерном массиве определяется двумя индексами, а не одним, так что я бы делал так:
int i_min = 0, j_min = 0, no = 0;
int low = a[0][0];
int no_min = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++, no++) {
if (low > a[i][j]) {
low = a[i_min = i][j_min = j];
no_min = no;
}
}
}
cout << "Min[" << i_min << "][" << j_min
<< "] #" << no_min << " = " low << endl;
Некий номер no
добавил по совету из ответа avp, но, по-моему, говорить об одном номере нельзя — все равно ведь у вас не настоящий двухмерный массив, и в памяти числа располагаются не подряд.
I am trying to find min (by row) and max (by column) element in two-dimensional (4,4) array and then store them in new array (5,5).
That is how it should look for new array (5,5):
1 2 3 4 min
5 6 7 8 min
4 4 4 5 min
3 5 5 6 min
m m m m 0
*m — max
Here it is the entire code:
#include <iostream>
using namespace std;
int main() {
int A[4][4];/*First array*/
int i, j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++) {
cout << "n A[" << i + 1 << "][" << j + 1 << "]=";
cin >> A[i][j];
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++)
cout << A[i][j] << "t";
cout << "n";
}
{
int min[4];/* find min on each row*/
for (i = 0; i < 4; i++) {
min[i] = A[0][i];
for (j = 1; j < 4; j++) {
if (min[i] > A[i][j])
min[i] = A[i][j];
}
}
int newarr[5][5];/* here i create the new array 5,5)*/
int max[5] = { 1,2,3,4,5 };
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
newarr[i][j] = A[i][j];
newarr[i][5] = max[i];
}
}
for (j = 0; j < 4; j++)
newarr[5][j] = min[j];
cout << newarr[5][j] << "t";
cout << "n";
}
}
I put random elements to max. Because so far I only test. But once I started my program it show correct only the first array. And where should be the new array it shows zero. Here it is the outcome of the debugging:
5 4 3 1
5 6 7 9
4 2 3 9
4 8 4 6
0
How to fix it?
And how to put zero in the last element (as you can see in the first table for the new array).
Встречаю часто вопросы у студентов по поиску минимального значения в массиве, решил привести различные вариации поиска в разных массивах.
Поиск минимального значения в одномерном массиве с помощью Linq.
static void Main(string[] args) { int[] num = { 2, 5, 6, 3, 7, 9, 1 }; //Одномерный Console.WriteLine(num.Min()); Console.ReadKey(); } |
Поиск максимального значения в одномерном массиве с помощью Linq.
static void Main(string[] args) { int[] num = { 2, 5, 6, 3, 7, 9, 1 }; //Одномерный Console.WriteLine(num.Max()); Console.ReadKey(); } |
Поиск минимального значения в одномерном массиве с помощью цикла методом перебора.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
static void Main(string[] args) { int[] num = { 2, 5, 6, 3, 7, 9, 1 }; //Одномерный int tmpMin = int.MaxValue; for (int i = 0; i < num.Length; i++) { if (tmpMin > num[i]) { tmpMin = num[i]; } } Console.WriteLine(tmpMin); Console.ReadKey(); } |
Поиск максимального значения в одномерном массиве с помощью цикла методом перебора.
static void Main(string[] args) { int[] num = { 2, 5, 6, 3, 7, 9, 1 }; //Одномерный int tmpMax = int.MinValue; for (int i = 0; i < num.Length; i++) { if (tmpMax < num[i]) { tmpMax = num[i]; } } Console.WriteLine(tmpMax); Console.ReadKey(); } |
Поиск минимального значения в многомерном массиве, с помощью Linq
Многомерный массив, в отличие от одномерного массива, не позволяет нам напрямую обратиться к методу Min. Но, это можно легко исправить, если воспользоваться методом Cast<T>, с помощью которого можно преобразовать многомерный массив в обобщенную коллекцию типа IEnumerable<T>. После чего нам станет доступен метод Min, и мы сможем найти минимальное значение массива, например:
static void Main(string[] args) { int[,] numbers = { { 100, 20, 63, 39, 428, 118 }, { 22, 34, 63, 59, 68, 26 } }; IEnumerable<int> colNumbs = numbers.Cast<int>(); int minValue = colNumbs.Min(); Console.WriteLine(minValue); Console.ReadKey(); } |
Поиск максимального значения в многомерном массиве, с помощью Linq
Поиск минимального значения в массив массивов, или зубчатом массиве.
static void Main(string[] args) { int[,] numbers = { { 100, 20, 63, 39, 428, 118 }, { 22, 34, 63, 59, 68, 26 } }; IEnumerable<int> colNumbs = numbers.Cast<int>(); int maxValue = colNumbs.Max(); Console.WriteLine(maxValue); Console.ReadKey(); } |
Чтобы найти минимальное значение в Jagged массиве, необходимо преобразовать содержимое массива в объект типа IEnumerable<T>. , но только выполнить эту операцию нужно не с помощью метода Cast, а например, с помощью метода SelectMany:
static void Main(string[] args) { int[][] numbers = { new int [] {12,123,35,75,33}, new int [] {44,42,64,96}, new int [] {121,42,733,45}}; int minValue = numbers.SelectMany(x => x).Min(); Console.WriteLine(minValue); Console.ReadKey(); } |
Поиск максимального значения в массив массивов, или зубчатом массиве.
static void Main(string[] args) { int[][] numbers = { new int[] { 12, 123, 35, 75, 33 }, new int[] { 44, 42, 64, 96 }, new int[] { 121, 42, 733, 45 } }; int maxValue = numbers.SelectMany(x => x).Max(); Console.WriteLine(maxValue); Console.ReadKey(); } |
Перейти к содержанию
Индексы минимальных элементов матрицы
Просмотров 3.8к. Обновлено 15 октября 2021
Вывести на экран индексы всех минимальных элементов матрицы.
Эта задача отличается от поиска минимума тем, что нужно найти и вывести на экран не само минимальное значение, а его индексы (позицию, положение в матрице). Кроме того, минимальных (но равных между собой) значений в массиве может быть несколько. Следовательно, разумно вывести индексы всех минимальных элементов.
Задача складывается из двух подзадач, которые должны быть решены последовательно:
- Поиск минимума в массиве (в данном случае двумерном).
- Поиск элементов, равных ранее найденному минимуму.
Найденное минимальное значение должно быть сохранено в переменной (например, minimum). Однако можно было бы сохранять не само значение, а индекс элемента массива. Но поскольку мы имеем дело с матрицей, то пришлось бы сохранять два числа (номер строки и номер столбца).
Алгоритм поиска минимального значения:
- Присвоить minimum максимально возможное (или больше) значение для исследуемого массива.
- Перебрать элементы матрицы (используя конструкцию вложенного цикла). Каждый элемент сравнивать со значением minimum. Если очередной элемент меньше значения minimuma, то следует присвоить значение текущего элемента переменной minimum.
Алгоритм определения позиций всех минимальных элементов матрицы:
- Снова перебираем элементы матрицы.
- Сравниваем каждый элемент со значением minimum.
- Если они равны между собой, то выводим индексы текущего элемента на экран. (Индексы текущего элемента — это значения счетчиков первого и второго циклов.)
Примечания:
- Ниже в решениях задачи поиска индексов минимальных элементов на языках программирования поиск минимального значения выполняется в том же цикле, что и заполнение матрицы.
- Если индексация массива начинается с нуля, то лучше при выводе индексов увеличивать их на единицу. Так будет более ясно, где находится элемент.
Pascal
const N = 5; M = 7;
var
mx: array[1..N,1..M] of integer;
min: integer;
i, j: byte;
begin
min := MAXINT;
randomize;
for i:=1 to N do begin
for j:=1 to M do begin
mx[i,j] := random(50) - 25;
write(mx[i,j]:4);
if mx[i,j] < min then min:=mx[i,j];
end;
writeln;
end;
writeln('Минимальное значение: ', min);
for i:=1 to N do
for j:=1 to M do
if mx[i,j] = min then
writeln('строка: ', i, '; столбец: ', j);
end.
-19 6 3 18 -12 -3 24
-4 15 -6 19 -15 -1 4
6 -9 -12 23 -3 3 -11
5 0 -11 -4 -19 -6 1
17 20 -1 6 17 -1 15
Минимальное значение: -19
строка: 1; столбец: 1
строка: 4; столбец: 5
Язык Си
#include < stdio.h>
#define M 7
#define N 5
main() {
int a[N][M];
int min, i, j;
srand(time(NULL));
min = 25;
for (i=0; i< N; i++) {
for (j=0; j< M; j++) {
a[i][j] = rand() % 50 - 25;
printf("%5d", a[i][j]);
if (min > a[i][j]) min = a[i][j];
}
printf("n");
}
printf("%dn", min);
for (i=0; i< N; i++) {
for (j=0; j< M; j++) {
if (min == a[i][j])
printf("row: %d, col: %dn", i+1, j+1);
}
}
}
Python
индекс минимального элемента массива python
from random import random
M = 7
N = 5
a = []
for i in range(N):
b = []
for j in range(M):
b.append(int(random()*50) - 25)
print("%4d" % b[j], end='')
a.append(b)
print()
min_mx = 25
for i in range(N):
min_i = min(a[i])
if min_i < min_mx:
min_mx = min_i
print(min_mx)
for i in range(N):
for j in range(M):
if min_mx == a[i][j]:
print('Row: %d, col: %d' % (i+1,j+1))
Пример выполнения:-18 -23 -8 17 12 4 -22
16 -10 -18 6 -9 19 23
8 -1 -7 0 -9 24 -12
-5 16 14 -2 1 7 -16
-7 5 1 -23 -4 -4 17
-23
Row: 1, col: 2
Row: 5, col: 4
В языке Python есть встроенная функция min, которая возвращает минимальный элемент одномерного списка. Если же ее применить к двумерному списку, то она возвращает вложенный список, первый элемент которого оказывается минимальным.
Поэтому в коде поиска минимального элемента матрицы эта функция используется к каждой строке (вложенному списку) отдельно.
Использование функции min позволяет не перебирать отдельные элементы каждой строки, а ограничиться только перебором самих строк.
Классический вариант поиска минимального значения матрицы выглядел бы так:
… min_mx = 25 for i in range(N): for j in range(M): if a[i][j] < min_mx: min_mx = a[i][j] …
КуМир
алг индексы минимумов
нач
цел M = 7, N = 5
цел таб a[1:N,1:M]
цел i, j, minimum
minimum := 25
нц для i от 1 до N
нц для j от 1 до M
a[i,j] := int(rand(0,50)) - 25
вывод a[i,j]:4, " "
если minimum > a[i,j] то
minimum := a[i,j]
все
кц
вывод нс
кц
вывод minimum, нс
нц для i от 1 до N
нц для j от 1 до M
если minimum = a[i,j] то
вывод "строка: ",i, ", столбец: ",j, нс
все
кц
кц
кон
Basic-256
M = 7
N = 5
dim a(N,M)
min = 25
for i = 0 to N-1
for j=0 to M-1
a[i,j] = int(rand*50)-25
print a[i,j] + " ";
if min > a[i,j] then min = a[i,j]
next j
next i
print min
for i = 0 to N-1
for j=0 to M-1
if min = a[i,j] then print (i+1) + " " + ( j+1)
next j
next i