Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2021, 10:24   #1
Lovskiy
Пользователь
 
Регистрация: 16.10.2021
Сообщений: 27
По умолчанию Кто может обяснить этот код?

Код:
#define N 9
int main()
{
    srand((unsigned)time(NULL));

    int matr[N][N];
    int sum_diagonals[2 * N - 1] = { 0 };

    
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            matr[i][j] = rand() % 10;
            printf("%2d ", matr[i][j]);
        }
        printf("\n");
    }
    printf("\n");
   
    for (int i = 0; i < N; i++) {
        for (int j = N - 1; j >= 0; j--)
            sum_diagonals[i + N - 1 - j] += matr[i][j];

        for (int i = 1, j = N - 1 - i; i < N - 1; i++, j--)
            matr[i][j] = sum_diagonals[i * 2] - matr[i][j];
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            printf("%2d ", matr[i][j]);
        printf("\n");
    }
    return 0;
}
Заполнить матрицу случайными числами. Разместить на побочной диагонали суммы элементов, которые лежат на диагоналях, перпендикулярных к побочной
Lovskiy вне форума Ответить с цитированием
Старый 16.10.2021, 22:00   #2
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 957
По умолчанию

дополнив в начале int N =5;
результат: ideone.com/75VmH3

Код:
 1  2  3  0  3 
 9  1  6  7  5 
 4  5  3  6  0 
 2  6  3  6  0 
 3  7  8  9  4 

 1  2  3  0  3 
 9  1  6 -4  5 
 4  5  6  6  0 
 2  6  3  6  0 
 3  7  8  9  4
однако алгоритм пока непонятен
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую
сфинкс вне форума Ответить с цитированием
Старый 17.10.2021, 00:32   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Lovskiy, а что конкретно не понятно? Думаю, что первая и последняя группа циклов понятны - заполнение, печать исходной и результирующей матриц. А в средней группе циклов закралась ошибка - вывод программы не соответствует заданию (по крайней мере, на мой взгляд). Если вынести один внутренний for наружу, то будет больше походить на правду.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.10.2021, 11:26   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Форматирование исходника ублюдочное. Закрывающая скобка } - вот она, пожалуйста, а открывающую { ищи в конце строки for - глаза сломаешь.
digitalis вне форума Ответить с цитированием
Старый 18.10.2021, 12:08   #5
Lovskiy
Пользователь
 
Регистрация: 16.10.2021
Сообщений: 27
По умолчанию

BDA, да, там ошибка в коде в среднем цикле не нужны скобки.
не понятно следующее например, почему массив sum diagonals состоит из 2N-1. Как работают эти циклы
Код:
for( int i = 0; i < N; i++ )
        for( int j = N - 1; j >= 0; j-- )
            sum_diagonals[i + N - 1 - j] += matr[i][j];
 
    for( int i = 1, j = N - 1 - i; i < N - 1; i++, j-- )
        matr[i][j] = sum_diagonals[i * 2] - matr[i][j];
сфинкс, в среднем цикле фигурные скобки не нужны. Тогда должно работать, но мне непонятно как именно оно работает

Последний раз редактировалось BDA; 19.10.2021 в 08:31.
Lovskiy вне форума Ответить с цитированием
Старый 18.10.2021, 19:00   #6
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 957
По умолчанию

думаю лучше выложить новейшую версию

и реально проверить через онлайн компилятор
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую
сфинкс вне форума Ответить с цитированием
Старый 19.10.2021, 07:43   #7
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

Цитата:
Сообщение от Lovskiy Посмотреть сообщение
не понятно следующее например, почему массив sum diagonals состоит из 2N-1. Как работают эти циклы
этой формулой мы получаем только нечётные числа: 1, 3, 5, 7, 9 и т.д.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace на форуме Ответить с цитированием
Старый 19.10.2021, 08:29   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Вообще, по условию нужны только те диагонали, у которых есть элемент на побочной диагонали, и таких диагоналей, очевидно, N. Но для упрощения кода кто-то решил посчитать суммы на всех диагоналях, а их всего 2N - 1 (возьмите любую матрицу и посчитайте количество диагоналей). Формула i + N - 1 - j преобразует координату (i, j) в номер диагонали, на которой расположен этот элемент. А последний цикл проходит по побочной диагонали (кроме нулевого и последнего элементов) и записывает сумму соответствующей диагонали за вычетом элемента с побочной диагонали.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 25.10.2021, 20:37   #9
Lovskiy
Пользователь
 
Регистрация: 16.10.2021
Сообщений: 27
По умолчанию Обясните этот код.

Код:
#define N 5
int main()
{
    srand((unsigned)time(NULL));

    int matr[N][N];
    int sum_diagonals[2 * N - 1] = { 0 };

    printf("source:\n");
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            matr[i][j] = rand() % 10;
            printf("%2d ", matr[i][j]);
        }
        printf("\n");
    }

    printf("\nresult:\n");
    for (int i = 0; i < N; i++)
        for (int j = N - 1; j >= 0; j--)
            sum_diagonals[i + N - 1 - j] += matr[i][j];

    for (int i = 1, j = N - 1 - i; i < N - 1; i++, j--)
        matr[i][j] = sum_diagonals[i * 2] - matr[i][j];

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            printf("%2d ", matr[i][j]);
        printf("\n");
    }
    return 0;
}
Заполнить матрицу случайными числами. Разместить на побочной диагонали суммы элементов, которые лежат на диагоналях, перпендикулярных к побочной
Lovskiy вне форума Ответить с цитированием
Старый 25.10.2021, 21:21   #10
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 957
По умолчанию

внеся в начало int N=7;
и компилируя: ideone.com/SH6jr0
результат:
Код:
source:
 8  4  1  3  7  8  5 
 9  0  8  1  1  0  9 
 0  5  9  4  7  2  0 
 3  6  7  2  3  5  2 
 3  9  1  1  4  2  6 
 1  3  1  2  5  0  5 
 6  0  7  9  7  6  3 

result:
 8  4  1  3  7  8  5 
 9  0  8  1  1  7  9 
 0  5  9  4 13  2  0 
 3  6  7 24  3  5  2 
 3  9 15  1  4  2  6 
 1 10  1  2  5  0  5 
 6  0  7  9  7  6  3
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую
сфинкс вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кто может исправить ошибки в скрипте? Взамен вам же и останется этот скрипт. lkivaka PHP 3 28.10.2017 23:09
может кто-нибудь поможет преобразовать код с си++ в си BTS Общие вопросы C/C++ 1 14.12.2014 14:19
Бат файл может кто-нибудь откомментировать код? Dimka-novitsek Помощь студентам 21 07.04.2014 22:12
Кто может помочь обяснить программу? Андрей77777 Фриланс 7 16.06.2013 00:53
Не могу сделать этот пример, кто может? afirat Общие вопросы Delphi 1 17.12.2012 16:27