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