В двумерном массиве найти наибольший элемент тех строк, где все элементы различны - 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
будет содержать наибольшее значение во всем массиве.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д