Определить значение максимального из минимальных элементов диагоналей матрицы - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Не судите строго если есть подобна тема, но нужна помощь по матрицам. Дана рандомная квадратная матрица с указанным размером. Нужно определить значение максимального из минимальных элементов диагоналей, параллельных главной диагонали, начиная с единичной диагонали. Потом заменить все элементы диагонали содержащей этот элемент нулевыми значениями. Но замена пока не нужна, нужно разобраться с нахождением минимального и потом из них макс элемента. Создание и проход по диагоналям я сделал, и для примера написал нахождение суммы их элементов по отдельности. Но вот с нахождением минимального элемента проблемки. я думал сразу записывать значения в масив, потом сортировать, но не вышло, так как не проходили динамических массивов и их получается многовато как то. Потом думал испоьзовать стандартную ункцию по нахождению мин и макс элементов, но опять же по проходу по матрице, эти элементы надо где то хранить. Вот и озадачен этим воросом, как найти минимальные элементы каждой диагонали кроме главной, и потом найти максимальный элемент среди минимальных, что бы потом начать думать как все это дело заменить.
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    setlocale(LC_ALL, "RU");
    int n;
    printf("N:\n");
    scanf("%d", &n);
    int i,j,a[n][n],sum;
    int arr;
 
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            a[i][j] = rand()%10; // заполнение матрицы
    
    for(i=0;i<n;i++)
    {
        printf("\n");
        for(j=0;j<n;j++)
            printf("%d ", a[i][j]); // вывод матрицы
    }
 
    printf("\n \n");
    printf("Выше главной диагонали:");
    
    for(i=0;i<n-1;i++) //в матрице n-1 диагоналей выше главной.
    {
        sum=0;
            
        for(j=0;j<i+1;j++)
        {
            sum+=a[j][j+n-1-i]; 
        }
        printf("%d ", sum);
    }
    
    printf("\nНиже главной диагонали:");
        
        for(i=0;i<n-1;i++) //в матрице n-1 диагоналей Ниже главной.
        {
            sum=0;
            for(j=0;j<i+1;j++)
                sum+=a[j+n-1-i][j];//Разница между столбцом и строкой меняется от n-1 до 1
            printf("%d ", sum);
        }
 
    printf("\n");
}
Помогите пожалуйста, хотябы натолкните на мысль, на алгоритм решения.

Решение задачи: «Определить значение максимального из минимальных элементов диагоналей матрицы»

textual
Листинг программы
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
    setlocale(LC_ALL, "RU");
    int n; // число элементов
    int i,j, k, // счетчики
    flag, // флажок для определения первого элемента диагонали минимальным
    min, max;
    printf("N:");
    scanf("%d", &n);
    // выделение памяти под массив
    int **a = (int**)malloc(n*sizeof(int)) ;
    for (i=0; i<n;++i)
        a[i]=(int*)malloc(n*sizeof(int)) ;
    // заполнение
    srand((time(0))); // чтобы ранд давал разные числа
    for(i=0; i<n; i++)
        for(j=0; j<n; j++)
            a[i][j] = rand()%10;
    // вывод
    for(i=0; i<n; i++) {
        printf("\n");
        for(j=0; j<n; j++)
            printf("%d ", a[i][j]);
    }
    /*
    0,0 0,1 0,2 0,3
    1,0 1,1 1,2 1,3
    2,0 2,1 2,2 2,3
    3,0 3,1 3,2 3,3
    */
    /* исходя из рисунка побочные диагонали будут
     * 1. 3,0
     * 2. 2,0, 3,1
     * 3. 1,0, 2,1 3,2
     * под диагональю разность между индексами одинаковая и положительная
     * 4. 0,1 1,2 2,3
     * 5. 0,2 1,3
     * 6. 0,3/
     * над - разность между индексами одинаковая и отрицательная
     */
    printf ("\n\n\n");
    int sum=n;
    int m[(n-1)*2]; //
    int ind=0;
    while(--sum!=-n) { // пока сумма не равна -n, внашем примере -3, сначала декремент суммы потом сравнение
        flag=0;
        for ( j=0; j<n; ++j) {
            for ( i=0; i<n; ++i) {
                if(i-j!=0 && j-i==sum) { // элемент очередной диагоналиб исклчая главную
                    if (!flag) {
                        min=a[i][j]; //printf (" _min_0 %d ",min);
                        flag=1;
                    } else if (min>a[i][j])
                        min=a[i][j];
                    printf ("%4d", a[i][j]);
                }
            }
        }
        if (flag) {
            m[ind]=min;
            ++ind;
            printf ("    : min %d \n", min);
        }
    }
    printf("min in diag:");
    for (i=0; i<(n-1)*2;    ++i)
        printf ("%4d, ", m[i]);
    printf("\n");
    max=m[0];
    ind=0;
    for (i=1; i<(n-1)*2; ++i)
        if (max<m[i]) {
            max=m[i];
            ind=i;
        }
    printf ("max in min =%d in diag# %d", max, ind);
    // замена
    sum=n;
    k=0;
    while(--sum!=-n) { // пока сумма не равна -n, внашем примере -3
        for ( j=0; j<n; ++j) {
            for ( i=0; i<n; ++i) {
                if(i-j!=0 && j-i==sum && k==ind) // элемент очередной диагонали
                    a[i][j]=0;
            }
        }
        k++;
        if (sum==0) k--; // вычитаем индекс главной диагонали
    }
    // вывод
    for(i=0; i<n; i++) {
        printf("\n");
        for(j=0; j<n; j++)
            printf("%d ", a[i][j]);
    }
    // освобождение памяти
    for (i=0; i<n;++i)
        free(a[i]);
    free (a);
    
    return 0;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы