В двумерном массиве найти наибольший элемент тех строк, где все элементы различны - C (СИ)
Формулировка задачи:
Дан двумерный массив. Найти наибольший элемент тех строк, в которых все элементы различны.
все дело происходит в функции ras (41-80)
Все нормально считает, но вот что брать за max???
Если брать просто первый элемент всего массива, то если в первой строке есть повторы, то он все равно останется самым большим элементов, что неверно по условию.
Если брать 0 - то если массив будет состоять только из отрицательных элементов, то опять же, 0 будет останется максимальным, если даже его не было в массиве.
Как поступить в данном случае???
#include <stdio.h> #include <conio.h> //int a[10][10]; //int n, m; void vvod(int a[10][10], int *, int *); int ras(int a[10][10], int *, int *); void vivod(int); int main(void) { int k, n, m, a[10][10]; vvod(a, &n, &m); k = ras(a, &n, &m); vivod(k); getch(); return 0; } void vvod (int a[10][10], int *n, int *m) { int i,j; *n = 0; *m = 0; printf ("Vvedite razmernost massiva (n,m):\n"); scanf ("%d %d", n, m); /* pochemy esli vishe postavit & - &n , &m to ne budet rabotat???? */ printf ("Vvedite elementi massiva:\n"); for (i=0; i<*n; i++) { for (j=0; j<*m; j++) { scanf("%d", &a[i][j]); } } } int ras(int a[10][10], int *n, int *m) { int i, j, jj, p, max, max_prom, p2; max = 0; for (i=0; i<*n; i++) { p = 0; // schetchik povtor. chisel p2 = 0; //metka, esli v stoke est povtori max_prom = a[i][0]; for (j=0; j<*m; j++) { for (jj = 0; jj<*m; jj++) { if (a[i][j] == a[i][jj]) p++; if (a[i][j] > max_prom) max_prom = a[i][j]; } if (p == 1) //esli vstretilsya tolko etot element napr a[1][1] == a[1][1] p = 0; if (p > 1) { p2 = 1; break; //esli vstretilos bolshe, napr. : a[1][1] = a[1][3] } } if (p2 != 1) { if (max_prom > max) max = max_prom; } } return max; } void vivod (int a) { printf("Max = %d", a); }
пока решил данную проблему тем, что за переменной max (44 строка) присвоил самое маленькое значение для int = -2147483648
тогда все работает верно. Но как обойтись без этого?
Решение задачи: «В двумерном массиве найти наибольший элемент тех строк, где все элементы различны»
textual
Листинг программы
int max_line, max_total, flagFirstLine = 0, flag = 0; for(i = 0; i < N; i++){ for(j = 0; j < M; j++){ if(not_repeat(A[i])){//not_repeat-функция возвращающая 1 если нет повторов в строке flag = 1; if(!j) max_line = A[i][j]; if(A[i][j] > max_line) max_line = A[i][j]; } } if(!flagFirstLine && flag){ max_total = max_line; flagFirstLine = 1; } if(max_line > max_total) max_total = max_line; }
Объяснение кода листинга программы
- В коде используется два вложенных цикла
for
для перебора всех элементов двумерного массиваA
. - Переменная
flag
инициализируется как 0. Она будет использоваться для отслеживания первой строки, в которой все элементы различны. - Переменная
flagFirstLine
инициализируется как 0. Она будет использоваться для отслеживания первой строки, в которой все элементы различны. - Переменная
max_line
инициализируется как 0. Она будет использоваться для отслеживания максимального элемента в текущей строке. - Переменная
max_total
инициализируется как 0. Она будет использоваться для отслеживания наибольшего элемента во всем массиве. - Если функция
not_repeat
возвращает 1, это означает, что текущий элемент не повторяется в строке. - Если текущий элемент больше
max_line
, то он становится новымmax_line
. - Если
flag
равно 1 и это первая итерация (т.е.flagFirstLine
равно 0), тоmax_total
присваивается значениеmax_line
. - Если
max_line
большеmax_total
, тоmax_total
присваивается значениеmax_line
. - По завершении циклов,
max_total
будет содержать наибольшее значение во всем массиве.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д