2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 69
1

Исключить строку и столбец, на пересечении которых находится минимальный элемент главной диагонали

18.06.2013, 23:46. Показов 1766. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задана матрица n*n. Исключить строку и столбец, на пересечении которых находится минимальный элемент главной диагонали.
Не могу понять как исключить строку и столбец/сделать новый массив без строки столбца, где минимальный диагональный элемент.
Написал только пока это:
Visual Basic
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
Sub pg()
Dim matrixA(5, 5) As Integer, matrixB(5) As Integer, i As Byte, k As Byte, j As Byte, n As Byte, m As Byte
 
Min = 200
 
For i = 1 To 5
    
    For j = 1 To 5
        matrixA(i, j) = Int(Rnd() * 45 - 3)
        Cells(i, j) = matrixA(i, j)
        
        If i = j Then
            If matrixA(i, j) < Min Then
                Min = matrixA(i, j)
                k = i
            End If
        End If
        
    Next j
    
Next i
 
Cells(20, 1) = Min
Cells(21, 1) = k
End Sub
То есть, создаю массив, ищу минимальный элемент диагонали и его номер. А дальше вот как удалить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.06.2013, 23:46
Ответы с готовыми решениями:

Удалить из матрицы строку и столбец, на пересечении которых находится минимальный элемент
Нужна помощь с задачками по VBA Сформировать двумерный массив. Удалить из него строку и столбец,...

Обнулить строку и столбец матрицы, на пересечении которых находится её максимальный элемент
Не мог бы кто-нибудь помочь переписать такой код только для VBA пожалуйста Var x: Array of...

Строку и столбец матрицы, на пересечении которых находится мин. элемент, заменить нулями
Ввести массив A(N,M). Найти минимальный элемент матрицы .Все элементы строки и столбца ,на...

Удалить из матрицы строку или столбец, на пересечении которых расположен наименьший по модулю элемент
Ребята помоги , нашел много примеров на вашем форуме, но не могу адаптировать под VBA.

16
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
19.06.2013, 12:01 2
Если еще нужно...
Здесь несколько моментов. 1. Присваивание переменным зарезервированных имен (Min) может плохо закончится! Переименовал на mMin. 2. Нужно следить за Option base. Иногда из-за этого нужно делать кучу лишних движений. Здесь это сделано при обявлении массивов (e.g. Dim matrixA(1 To 5, 1 To 5) As Integer). 3. Паралельно запись значений на лист при генерации - лишнее. 4. Переименовал/убрал/добавил некоторые переменные с более понятными именами. 5. Изменил тип некоторых из Byte на Long. Лучше сразу привыкат - меньше ошибок в будущем. Все остальное - где-то так:
Visual Basic
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
Sub pg()
Dim matrixA(1 To 5, 1 To 5) As Integer, newMATRIX(1 To 4, 1 To 4) As Integer
Dim i As Long, j As Long, r As Long, c As Long, mMin&, countR&, countC&
   Randomize
      For i = 1 To 5
         For j = 1 To 5
            matrixA(i, j) = Int(Rnd() * 45 - 3)
               If i = 1 And i = j Then mMin = matrixA(i, j)
               If i = j Then
                  If matrixA(i, j) < mMin Then
                     mMin = matrixA(i, j): r = i: c = j
                  End If
               End If
         Next j
      Next i
      countR = 0
      For i = LBound(matrixA, 1) To UBound(matrixA, 1)
         If i = r Then i = i + 1
         countR = countR + 1: countC = 0
            For j = LBound(matrixA, 2) To UBound(matrixA, 2)
               If j = c Then j = j + 1
               countC = countC + 1
               newMATRIX(countR, countC) = matrixA(i, j)
         Next 'j
      Next 'i
      Cells(1, 1).Resize(UBound(matrixA, 1), UBound(matrixA, 2)).Value = matrixA
         With Cells(Rows.Count, 1).End(xlUp)
            .Offset(2, 0).Value = mMin:  .Offset(2, 1).Value = r:  .Offset(2, 2).Value = c
         End With
         With Cells(Rows.Count, 1).End(xlUp).Offset(2, 0)
            .Resize(UBound(newMATRIX, 1), UBound(newMATRIX, 2)).Value = newMATRIX
         End With
         Erase matrixA, newMATRIX: MsgBox Space(10) & "D O N E!"
End Sub
1
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 69
19.06.2013, 19:01  [ТС] 3
Спасибо. Но думаю переменная c лишняя, т.к. матрица квадратная
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
19.06.2013, 19:26 4
Вы полностью правы. А вобщем, в таких случаях я подключаю к массивам, например, коллекции (легче работать комплексно с рядом или столбцом), или что-то еще (по ситуации). Показать?
0
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 69
19.06.2013, 19:54  [ТС] 5
Мне вот непонятно почему в самом начале 3 if и 2 end if, а конце программы end if нет вообще?
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
19.06.2013, 20:01 6
Вы еще лучше выкладываете свои мысли, чем я!!! Мне аж завидно стало!!!
Но если я понял правильно, то Вас интересует такая форма записи:
If i = 1 And i = j Then mMin = matrixA(i, j)
Потому-что продолжение в той же строке, в которой Then. "Академически", это было бы так:
Visual Basic
1
2
3
If i = 1 And i = j Then 
   mMin = matrixA(i, j)
enf if
0
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 69
19.06.2013, 20:13  [ТС] 7
Понял. Спасибо. Переделал немного под себя, тип long использовать тоже не вижу смысла, когда у меня числа ограничены значениями -3 до 45.
Убрал вывод с with и др. незнакомыми мне функциями.
В итоге получилось вот:
Visual Basic
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
Sub pg()
Dim matrixA(1 To 5, 1 To 5) As Integer, matrixB(1 To 4, 1 To 4) As Integer
Dim i As Byte, k As Byte, j As Byte, countC As Byte, countR As Byte, pin As Byte
 
countR = 0
 
 
For i = 1 To 5
    For j = 1 To 5
        matrixA(i, j) = Int(Rnd() * 45 - 3)
        Cells(i, j) = matrixA(i, j)
        
        If i = 1 And i = j Then pin = matrixA(i, j)
            If i = j Then
            If matrixA(i, j) < pin Then
                pin = matrixA(i, j)
                k = i
            End If
        End If
    Next j
Next i
 
Cells(20, 1) = pin
Cells(21, 1) = k
 
For i = LBound(matrixA, 1) To UBound(matrixA, 1)
    If i = k Then i = i + 1
        countR = countR + 1
        countC = 0
        
        For j = LBound(matrixA, 2) To UBound(matrixA, 2)
                If j = k Then j = j + 1
                    countC = countC + 1
                    matrixB(countR, countC) = matrixA(i, j)
        Next j
Next i
 
For i = 1 To 4
    For j = 1 To 4
        Cells(i + 8, j) = matrixB(i, j)
    Next j
Next i
 
 
End Sub
Однако, не могу понять почему работает через раз?
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
19.06.2013, 20:38 8
Вот почему через раз - идите пошагово. И проверьте ч/з Locals.
В этом Вы очень ошибаетесь:
...тип long использовать тоже не вижу смысла
Правильно определять тип переменной не потому, какой он в данный момент Вам нужный, а потому, какой он может быть. Это теперь у Вас "теория". А привыкните? Т.к. мы имеем дело с столбцами и рядами, можна Integer/Long. А если Вы поищете здесь сообщения от Hugo121 - поймете, что сегодня Integer потерял свое значение, только вредит, и взамен нужно применять Long. И тогда что остается? Но!!! если!!! точно!!! уверены что это только здесь и сейчас и один раз!!! - тогда зачем вобще VBA?
А что у Вас такая симпатия к Cells(20, 1)? Не проще железку научить самой принимать решения?

Добавлено через 9 минут
Вот Вам конкретно. У Вас pin As Byte. Откуда у Вас такая уверенность, что генератор выдает в Вашем случае от 0 до 255?
0
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 69
19.06.2013, 20:42  [ТС] 9
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Вот почему через раз - идите пошагово. И проверьте ч/з Locals.
В смысле? Что есть locals?


Цитата Сообщение от Igor_Tr Посмотреть сообщение
А что у Вас такая симпатия к Cells(20, 1)? Не проще железку научить самой принимать решения?
Да дело в том, что 21 у меня экзамен по информатике, нужно прийти и решить пару задач по VBA. Это последний семестр информатики. Поэтому в дебри не хочу лезть, да и к vba особой симпатии я не проявляю.

Добавлено через 2 минуты
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Вот Вам конкретно. У Вас pin As Byte. Откуда у Вас такая уверенность, что генератор выдает в Вашем случае от 0 до 255?
Поправил. Заметил когда в матрице первый элемент наименьший, то программа не срабатывает. Точнее значение k определяется как 0. В начало программы добавил k=1. Но теперь когда наименьшим элементом диагонали является матрица(5,5) последний, программа не срабатывает.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
19.06.2013, 20:51 10
Весело! Не хочу Вас переубеждать по любви к VBA и не знаю, какая у Вас специальность. Но... Большинству людей, поверьте, по барабану красивые, заумные приложения. Им главное быстро и эфективно выполнять ежедневные задачи, и понимать, что они делают. На сегодня - VBA одно из лучших решений "для каждого и на каждый день". От учителя грамматики, ....., и до инженера.
0
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 69
19.06.2013, 20:56  [ТС] 11
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Весело! Не хочу Вас переубеждать по любви к VBA и не знаю, какая у Вас специальность. Но... Большинству людей, поверьте, по барабану красивые, заумные приложения. Им главное быстро и эфективно выполнять ежедневные задачи, и понимать, что они делают. На сегодня - VBA одно из лучших решений "для каждого и на каждый день". От учителя грамматики, ....., и до инженера.
Надеюсь, что время мне в будущем не преподнесет сюрпризы с VBA. Специальность: промышленное и гражданское строительство.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
19.06.2013, 21:02 12
Идите пошагово (F8). Locals - это дополнительное информативное окно для отладки VBA (View >> Locals Window), где можно видеть состояние Ваших переменных (массивов, коллекций, ...) на данный момент.

Добавлено через 2 минуты
"Специальность:... ". Вот теперь могу утверждать на 100% - точно потом сюрпризы будут!!!
1
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 69
19.06.2013, 21:09  [ТС] 13
Все понял в чем косяк. Дело в том что когда минимальный элемент главной диагонали является matrixA(5,5), то при формировании нового нужно учитывать, что перескакивать не нужно.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
19.06.2013, 21:12 14
Ну все... Достали...Сейчас выдам... Есть у меня друг - гинеколог. Нарадоваться не может, что выучил VBA (я ему помогал! ). Чаще стал с мной на пиво ходить. Отдых - безподобный!!!! Я про роботу после работы - ни слова (что его интересует!). Принцып у меня такое (немного, но есть). А про то, что меня интересует - ему этика запрещает... Вот мы молча так: выпили, покурили, помолчали, налили... Что может быть лучше - природа, молчание, пиво, друзья...
0
Заблокирован
19.06.2013, 21:19 15
Igor_Tr, давайте ближе к теме!
1
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 69
19.06.2013, 21:28  [ТС] 16

Спасибо за помощь. Разобрался все работает. (условие: If k = 5 Then k = k - 1). Хотя, нет. Не то. Удаляет предыдущий столбец, когда нужно чтобы удалил пятый.

Добавлено через 9 минут
Подправил условие, все работает.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
19.06.2013, 21:29 17
Пока Вы думали, я накидал с коллекцией. Попробуйте. Хоть это так, приблизительно.
Visual Basic
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
Sub coll_pg()
Dim matrixA(), tmpARR(), coll As Collection
Dim i As Long, j As Long, r As Long, c&, mMin&, N&
   ActiveSheet.Cells.Delete
   N = 5: Set coll = New Collection: ReDim matrixA(1 To N, 1 To N): Randomize
      For i = 1 To N: ReDim tmpARR(1 To N)
         For j = 1 To N
            matrixA(i, j) = Int(Rnd() * 45 - 3): tmpARR(j) = matrixA(i, j)
               If i = j Then
                  If i = 1 Then
                     mMin = matrixA(i, j): r = i
                        Else: If matrixA(i, j) < mMin Then mMin = matrixA(i, j): r = i
                  End If
               End If
         Next 'j
         coll.Add tmpARR
      Next 'i
   Cells(1, 1).Resize(UBound(matrixA, 1), UBound(matrixA, 2)).Value = matrixA
   Erase tmpARR: coll.Remove r
      With Cells(Rows.Count, 1).End(xlUp)
         .Offset(2, 0).Value = mMin:  .Offset(2, 1).Value = r:  .Offset(2, 2).Value = r
      End With
      ReDim matrixA(1 To coll.Count, 1 To N - 1)
         For i = 1 To coll.Count: c = 0
               For j = 1 To N
                  If j <> r Then c = c + 1: matrixA(i, c) = coll(i)(j)
               Next j
         Next 'i
         Cells(Rows.Count, 1).End(xlUp).Offset(2, 0). _
               Resize(UBound(matrixA, 1), UBound(matrixA, 2)).Value = matrixA
   Erase matrixA: Set coll = Nothing: MsgBox Space(10) & "D O N E!"
End Sub
0
19.06.2013, 21:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.06.2013, 21:29
Помогаю со студенческими работами здесь

Поменять местами строку и столбец, в которых находится максимальный элемент
Задан массив А(N,N). Поменять местами строку и столбец ,в которых находится максимальный элемент....

Определить во сколько раз отличаются максимальный элемент на главной диагонали и минимальный элемент на не главной диагонали
Определить во сколько раз отличаются максимальный элемент на главной диагонали и минимальный...

Записать нули в ту строку и столбец, где находится элемент
Найти наименьший элемента двумерного массива A размером MxN и записать нули в ту строку и...

Найти сумму элементов столбца и строки матрицы, на пересечении которых находится максимальный элемент матрицы
Найти сумму элементов столбца и строки матрицы. на пересечении которых находится максимальный...


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

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

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