Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Задачка на двумерные массивы [C++]

76K
19 ноября 2011 года
capitas
6 / / 19.11.2011
Дана действительная квадратная матрица порядка N (N-нечетное), все элементы которой различны. Найти наибольшие элементы среди стоящих на главное и побочной диагоналях и поменять его местами с элементом, стоящим на пересечении этих диагоналей.

заранее спасибо. а то совсем запутался
14
19 ноября 2011 года
Phodopus
3.3K / / 19.06.2008
За что спасибо то? В чем запутался?
76K
20 ноября 2011 года
capitas
6 / / 19.11.2011
если честно запуталсяуже в условии, и совершенно не представляю как решить эту задачку.. а спасибо то заранее, если поможете.
244
20 ноября 2011 года
UAS
2.0K / / 19.07.2006
Как я понял - надо найти максимальный элемент по двум диагоналям и поменять его с центральным.
Вот код, написан на Java. В C++ переводите сами

Код:
int N = 5; // размер матрицы

int[][] matrix = new int[N][N];

// здесь заполнение матрицы

// проходим по диагоналям

// индекс максимального числа
int maxRow = 0;
int maxCol = 0;

for(int i = 0; i <N; i++) {
    if( matrix > matrix[maxRow][maxCol] ) {
        maxRow = i;
        maxCol = i;
    }
    if( matrix[N-1-i] > matrix[maxRow][maxCol] ) {
        maxRow = i;
        maxCol = N-1-i;
    }
}

// значение в центре матрицы
int middle = matrix[N/2][N/2];

// обмен местами значений
matrix[N/2][N/2] = matrix[maxRow][maxCol];
matrix[maxRow][maxCol] = middle;
76K
20 ноября 2011 года
capitas
6 / / 19.11.2011
Цитата: UAS
Как я понял - надо найти максимальный элемент по двум диагоналям и поменять его с центральным.



а вот я не понял..
и ваше решение мне практически ни о чем не говорит к сожалению((, я с явой не знаком, да я и с с++ не знаком практически.

244
20 ноября 2011 года
UAS
2.0K / / 19.07.2006
Ну так зачем в университет пошли? Идите в техникум на слесаря учитесь. Там особо думать не надо.
76K
20 ноября 2011 года
capitas
6 / / 19.11.2011
откуда такая реакция? это мое второе высшее. до этого ни с математикой ни с информатикой так плотно связан не был. вообще информатика на моем факультете это формальность она косвенно связана с моей специальностью. тем более заочка. не смотря на ваши выпады, я считаю себя человеком неглупым. мне надо объяснить и я все пойму. просто некому это сделать, вот сюда и обратился, судя по всему зря.
244
20 ноября 2011 года
UAS
2.0K / / 19.07.2006
У меня вот тоже высшее, техническое, с отличием. Вот только когда мне задавали любые задачи по любой теме (начиная экологией и бухгалтерией и заканчивая рассчетом криптографических преобразований вручную) - я сидел и разбирался. На мелкие задачи, подобные объемам этой, но из области которую я не понимал, я тратил от 2 часов до недели. Сидел и разбирался.

В чём проблема? Мне за вас найти в википедии ссылку на описание что такое матрица? Что такое главное и побочная диагональ? Это элементарные понятия и человек с одним высшими должен прекрасно знать что это такое - это дают на 1-2 курсе любого универа.

Цитата:
мне надо объяснить и я все пойму.

Про матрицы я уже сказал - это есть везде. Главная и побочная диагональ образуют букву Х в матрице, грубо говоря. По алгоритму тоже ничего сложного - есть цикл. Вы циклом (for) пробегаетесь по всем строкам матрицы и смотрите элемент на главной и побочной диагонали. Ищете максимальный. Потом меняете местами.

Так что читайте учебник по C, смотрите на мой код. Человек неглупый должен только глядя на код понять, что если N - это размер матрицы, то new int[N][N] - это сама матрица размерами NxN. int вбиваете в гугл и находите, что это целое число. Т.е. задается целочисленная матрица размерами NxN.
Потом надо выбрать максимальное число, по умолчанию это будет число на 0 строке и 0 столбце. Далее цикл. Чтобы понять, как он работает - нарисуйте вручную матрицу на бумаге и вручную сделайте цикл - сразу увидите как он работает.

Тем более раз вы обратились за помощью. Обращение за помощью - это не значит "сделайте за меня", это направление вас по верному пути. Вы же говорите, что с языками вообще не знакомы - т.е. по сути просите написать за вас, что в это разделе не привествуется. Я могу этот код спокойно переписать на C++, но халявщиков мне в универе хватило. Так что я вам дал готовое решение на другом языке (но схожем) - вам лишь стоило потратить несколько часов (а то и дней), чтобы разобраться. Учитесь, че.

76K
20 ноября 2011 года
capitas
6 / / 19.11.2011
я не просил готового решения. готовое решение меня бы не устроило. ибо если будут какие то подобные задачи я не смогу решить самостоятельно. поэтому для меня важно понимать. я просил помочь, вы в итоге помогли. будем разбираться. и мы этого на меде не изучали ни на первом ни на втором. спасибо
14
22 ноября 2011 года
Phodopus
3.3K / / 19.06.2008
Блин, ну матрицы-то уж изучают везде. А у нас программистом работает хирург. И хороший программист.
76K
22 ноября 2011 года
capitas
6 / / 19.11.2011
вот что полчилось:

код
Цитата:
#include <stdio.h>
#include <locale.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>

#define SIZE 5

int main ()
{
printf ("Matrix \n\n");
int matrix[SIZE][SIZE]={ {1, 10, 15, 16, 21},
{2, 9, 14, 17, 24},
{3, 8, 13, 18, 23},
{4, 7, 12, 19, 25},
{5, 6, 11, 20, 22} };

int max = matrix[0][0];
int i;
int j;
for(i = 0; i <SIZE; ++i)
{for (j = 0; j < SIZE; ++j)
{ if (max<matrix[j]&& (i=j))
max=matrix[j];
}
}
printf ("max= %d", max);

int middle = matrix[SIZE/2][SIZE/2];


matrix[SIZE/2][SIZE/2] = matrix[j];
matrix[j] = middle;
getch();
}



(пожалуйста проверьте правильно ли)
но есть проблема в выводе на экран. мне бы хотелось, наглядности ради, что бы выводилась матрица ДО и ПОСЛЕ. вставляю принтф но чушь какая то получается.
матрицы мы не изучали. не знаю в каком вузе учился ваш хирург.

14
22 ноября 2011 года
Phodopus
3.3K / / 19.06.2008
Цитата: capitas
вставляю принтф но чушь какая то получается.


где и как вы вставляете printf ?

244
22 ноября 2011 года
UAS
2.0K / / 19.07.2006
Неверно. У вас происходит поиск максимума только по главной диагонали, а надо ещё и по побочной. Побочная, эта которая идёт от "сверху справа" до "снизу слева".
А ещё у вас в коде i = j, а необходимо i == j. В первом случае присваивание, а во втором случае - сравнение.
Ещё, после отработки цикла у вас i и j всегда будут равны SIZE - 1.

Перепишите цикл в стиле, как я написал - запоминайте только индексы (т.е. i и j).
Код:
int max_i = 0;
int max_j = 0;

for(int i = 0; i <SIZE; ++i) {
    for (int j = 0; j < SIZE; ++j) {
        if( matrix[max_i][max_j] < matrix[j] && (i == j || j == SIZE - i - 1 ) {
            max_i = i;
            max_j = j;
        }
    }
}

...

matrix[SIZE/2][SIZE/2] = matrix[max_i][max_j];
matrix[max_i][max_j] = middle;


Для вывода матрицы используйте что-то в стиле
 
Код:
for(int i = 0; i <  SIZE; i++) {
    for(int j = 0; j < SIZE; j++) {
        printf("%d ", matrix[j]);
    }
    printf("\n ");
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог