Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
1

Массив: Произвести между матрицами обмен числами так, чтобы max первой матрицы не превышало min второй

09.08.2016, 09:15. Показов 987. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Условие
Даны две квадратные матрицы А() и В() размером 5×5
Он заполнены случайными числами
Требуется произвести между матрицами обмен числами
так, чтобы максимальное число первой матрицы не превышало
минимального числа второй матрицы.
Решение
Вариант 1
Можно ввести еще один линейный массив и сбросить на него все
элементы обоих матриц. Отсортировать этот массив и просто
поделить его элементы между двумя матрицами.
Примечание
Не подходит из-за сортировки. Сортировки нет в условии.
Вариант 2
Надо найти средний элемент. То есть такой, где число элементов
больших данного было бы равно числу элементов меньших данного
Вопрос.
Но как найти такой элемент?
Вариант 3
Тотальное сравнение элементов обоих матриц и обмен этими элементами
Вопрос.
Сколько должно быть сравнений? Где гарантия, что задача будет решена?

Задача пока не решена.
Ищется подходящий алгоритм
Кто может что-нибудь подсказать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2016, 09:15
Ответы с готовыми решениями:

Массив: Получить новую матрицу следующим способом: умножением Min каждой строки первой матрицы на Max соответствующего столбца второй
Пусть даны две вещественные матрицы порядка N. Получить новую матрицу следующим способом:...

Найти max и min элементы массива y и сформировать массив z из элементов массива y, находящихся между max и min y. Записать массив z в обратном порядке
Дан массив Х{80 элементов}. Вычислить {y}_{i}=sin\sqrt{{x}_{i}}+{cos}^{2}{{x}_{1}}^{2} Найти...

Упорядочить массив по убыванию элементов второй строки и напечатать max и min элементы матрицы
1. Введите массив N и определите, есть ли в нем элементы с одинако-выми значениями 2. Дан...

Найти max элемент в первой половине массива и min во второй
Найти МАХ элемент из первой половины массива и МИН – из второй половины массива.

4
6171 / 936 / 310
Регистрация: 25.02.2011
Сообщений: 1,367
Записей в блоге: 1
09.08.2016, 16:03 2
Лучший ответ Сообщение было отмечено echs как решение

Решение

Алгоритм по 3му варианту:
Находим максимальное число в первой матрице, находим минимальное число во второй матрице, запоминаем их индексы.
Если max1 >min2, то меняем числа.
Повторять до тех пор, пока max1>min2
Т.к. матрицы небольшого размера, то и сравнений будет немного.
Максимально возможное кол-во сравнений 5*5*2*25 = 1250

По второму варианту:
Находим медиану двух массивов, в зависимости от чисел используем сортировку или если используются целые числа вспомогательный массив.
Далее используем медиану для обмена между массивами.
Сложность может возникнуть с ситуацией, когда несколько чисел равны медиане, то нужно правильно составить алгоритм разделения чисел между матрицами.
Если используется пузырьковая сортировка для поиска медианы, то это уже 50*49/2 = 1225 итераций, плюс доп. алгоритм по обмену числами. Если используются целые числа (например от 1 до 100), то количество итераций при поиске медианы может быть существенно меньше.

Скорее всего, задачу нужно решить так, чтобы было как можно меньше обменов чисел между матрицами, поэтому вариант 1 не подходит.

Самый простой вариант - 3й, через поиск мин и макс элементы матриц.

Добавлено через 8 минут
пример (писал на vba, но должен работать в QBasic)
Вывод массивов сделайте самостоятельно
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
DIM a(1 TO 5, 1 TO 5) AS LONG, b(1 TO 5, 1 TO 5) AS LONG
DIM i AS LONG, j AS LONG, min AS LONG, max AS LONG
DIM x1 AS LONG, x2 AS LONG, y1 AS LONG, y2 AS LONG
 
RANDOMIZE TIMER
FOR i = 1 TO 5
FOR j = 1 TO 5
    a(i, j) = INT(RND * 100 + 1)
    b(i, j) = INT(RND * 100 + 1)
NEXT j, i
 
'вывод результата
'Cells(1, 1).Resize(5, 5) = a
'Cells(1, 7).Resize(5, 5) = b
DO
    FOR i = 1 TO 5
    FOR j = 1 TO 5
        IF i = 1 AND j = 1 THEN
            max = a(i, j)
            x1 = i
            y1 = j
            min = b(i, j)
            x2 = i
            y2 = j
        ELSE
            IF max < a(i, j) THEN
                max = a(i, j)
                x1 = i
                y1 = j
            END IF
            IF min > b(i, j) THEN
                min = b(i, j)
                x2 = i
                y2 = j
            END IF
        END IF
    NEXT j, i
    IF max > min THEN
        a(x1, y1) = min
        b(x2, y2) = max
    ELSE
        EXIT DO
    END IF
LOOP
'вывод результата
'Cells(7, 1).Resize(5, 5) = a
'Cells(7, 7).Resize(5, 5) = b
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
09.08.2016, 17:26  [ТС] 3
m-ch
Вы правы. Ваше предложение самое наилучшее
Назовем его Вариант 4. Ибо в третьем варианте я
планировал просто обмен значениями без поиска
минимальных и максимальных значений. Отсюда и
возникала неопределенность.

Добавлено через 1 час 8 минут
Вариант программы, решающей эту задачу

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
DECLARE SUB RAND ()
DECLARE SUB minn (x!(), min!, im!, jm!)
DECLARE SUB maxx (x!(), max!, im!, jm!)
CLS
RAND
DIM SHARED n
 
n = 5
DIM A(n, n)
DIM B(n, n)
 
FOR i = 1 TO n
FOR j = 1 TO n
   A(i, j) = FIX(40 * RND) - 20
   LOCATE i, 5 * j - 2
   PRINT A(i, j);
NEXT j, i
 
FOR i = 1 TO n
FOR j = 1 TO n
   B(i, j) = FIX(40 * RND) - 20
   LOCATE i, 5 * j + 30
   PRINT B(i, j);
NEXT j, i
PRINT : PRINT
 
FOR k = 1 TO n * n
   CALL maxx(A(), max, i1, j1)
   CALL minn(B(), min, i2, j2)
   SWAP A(i1, j1), B(i2, j2)
NEXT
 
FOR i = 1 TO n
FOR j = 1 TO n
   LOCATE i + 6, 5 * j - 2
   PRINT A(i, j);
NEXT j, i
 
FOR i = 1 TO n
FOR j = 1 TO n
   LOCATE i + 6, 5 * j + 30
   PRINT B(i, j);
NEXT j, i
END
 
SUB maxx (x(), max, im, jm)
   max = x(1, 1)
   im = 1
   jm = 1
 
   FOR i = 1 TO n
   FOR j = 1 TO n
      IF max < x(i, j) THEN
         max = x(i, j)
         im = i
         jm = j
      END IF
   NEXT j, i
END SUB
 
SUB minn (x(), min, im, jm)
   mix = x(1, 1)
   im = 1
   jm = 1
 
   FOR i = 1 TO n
   FOR j = 1 TO n
      IF mix > x(i, j) THEN
         mix = x(i, j)
         im = i
         jm = j
      END IF
   NEXT j, i
END SUB
 
SUB RAND
   RANDOMIZE TIMER
END SUB
0
6171 / 936 / 310
Регистрация: 25.02.2011
Сообщений: 1,367
Записей в блоге: 1
10.08.2016, 07:21 4
Лучший ответ Сообщение было отмечено echs как решение

Решение

geh, чем не устроил мой код?
в Вашем коде в строке 27 цикл по обмену выполняется 25 раз
Но возможно и не нужно столько раз выполнять обмены, это может привести к ситуации, когда будет произведен не нужный обмен и максимальный элемент первой матрицы будет больше минимального элемента второй матрицы.

Проверка Вашего кода показывает, что может получится не правильная работа макроса.
Просто протестируйте, первую матрицу заполните единицами, вторую двойками и посмотрите результат.

Другие вопросы:
Зачем randomize выводить в отдельную процедуру?
Почему массивы начинаются с нулевого элемента, а не с первого?
Почему используете вещественные переменные, а не целые?
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
10.08.2016, 07:47  [ТС] 5
m-ch
У Вас классный код! Много лучше моего!
Но.
1. Я предпочитаю вводить в программу процедуры. Мне так
больше нравится. Процедура RAND - это конечно перегиб.
2. Теперь серьезно
Вы указали на мою большую ошибку. При обмене элементами
я не поставил условие проверки, надеясь на то, что максимум
будет больше минимума. А этого, КАК ВЫ ВЕРНО ПОДМЕТИЛИ,
может и не быть!
3. Вещественные числа?
Ну это для программы особой роли не играет
4. Определение матрицы с нуля?
Я это просмотрел. А потом матрицы маленькие. Тут на них не
сэкономишь. Но вы все-равно правы.
Я Вам очень благодарен за Ваш интерес к этой теме. Спасибо!
0
10.08.2016, 07:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.08.2016, 07:47
Помогаю со студенческими работами здесь

Массив заполнить случайными числами и вывести max и min. Выводится только max
Задание такое: Массив заполняется случайными числами потом если нет повторяющихся max и min должно...

Найти разницу между min и max числами
нужно найти разницу между min и max числами безумно нужна помощь! Добавлено через 52 минуты...

Переписать простые числа из матрицы A в массив B, из массива удалить числа между max и min элементами
переписать простые числа из матрицы целых чисел A в массив B. Из массива B удалить числа,...

Найти max и min, если min левее max, то среднее арифметическое между ними
#include &lt;iostream.h&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; void main() {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru