Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 | 2 |

 

  Вопрос: Прошу помощи с разрешающим массивом. Добавлено: 24.05.08 20:44  

Автор вопроса:  Blood
Доброго времени суток, уважаемые профи бейсика. Обращяюсь я к вам за советом, с просьбой найти проблему, из за которой мой код работает неверно. Передо мной стоит такая задача : Я создал и заполнил двухмерный массив чисел. Теперь от меня требуется найти номер столбца с максимальным произведением элементов среди стобцов заданной матрицы, содержащих только такие элементы, которые строко больше соответствующих элементов первого столбца. Тоесть вот пример :

7 8 6
4 5 1
1 2 3

Годится лишь второй столбец, так как 8 больше 7, 5 больше 4х, а 2 больше 1. Ну это понятно.

Я решил сделать цикл проверки с второго столбца, чтобы он проверял на наличие таких элементов, и если этот столбец подходит, то в разрешающий массив ( одномерный массив, заполненный нулями изначально, в котором элементов столько же сколько и столбцов) заносится 1 на место того нуля, который совпадает с номером строки ( тоесть вместо второго нуля будет 1).

Потом программа будет выполнять условия лишь для тех столбцов, для которых разрешающий массив равен 1. Однако программа работает совершенно не так. Вот готовый фрагмент кода, можете сказать мне - где я ошибся ?


Private Sub Command1_Click()
Dim n, m As Byte, i, j As Integer, Mas() As Integer, MasJ() As Integer
'------Создание основного массива и заполнение его
n = CByte(InputBox("Введите количество строк"))
m = CByte(InputBox("Введите количество столбцов"))
ReDim Mas(1 To n, 1 To m)
For i = 1 To n
For j = 1 To m
Mas(i, j) = InputBox("Vvedite elemnt " & i & " stroki, " & j & " stolbtsa.")
Debug.Print Mas(i, j);
Temp = Temp + " " + Str(Mas(i, j))
Next j
L1.Caption = L1.Caption + Temp + Chr(10)
Temp = ""
Debug.Print " "
Next i
'Call MinMax(Mas(), n, m)
'----------Создание разрешающего массива и заполнение его нулями.
ReDim MasJ(1 To m)
For j = 1 To m
MasJ(j) = 0
Debug.Print MasJ(j);
Next j
Debug.Print " "
'------Прочёсывание столбцов на наличие всех элементов столбца больше соответствующих элементов первого столбца
For j = 2 To m
For i = 1 To n
If Mas(i, 1) < Mas(i, j) Then
'kok = kok + 1
Debug.Print Mas(i, j)
End If
Next i
'If kok = m Then
MasJ(j) = 2
Debug.Print MasJ(j)
'End If
Next j
'For i = 1 To m
'If MasR(i) = 1 Then
'For j = 1 To n

End Sub


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

Ответить

  Ответы Всего ответов: 21  

Номер ответа: 1
Автор ответа:
 Blood



Вопросов: 2
Ответов: 12
 Профиль | | #1 Добавлено: 24.05.08 20:46
Кстати тут я случайно добавляю вместо 1 двойку, но это по идее не должно играть существенной роли.

Ответить

Номер ответа: 2
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #2 Добавлено: 24.05.08 20:48
Щас чтец матриц придёт :)

Сори за офтоп, приступ юмора затянулся :)

Ответить

Номер ответа: 3
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #3 Добавлено: 24.05.08 20:51
А какое отношение этот код имеет к VBA?

Dim n, m As Byte, i, j As Integer


Ты знаеш что у тебя n и i будет As Variant потому, что тип не указан явно?

Ответить

Номер ответа: 4
Автор ответа:
 Blood



Вопросов: 2
Ответов: 12
 Профиль | | #4 Добавлено: 24.05.08 21:08
Что значит не указан явно, я думал что VBA если указывать несколько переменных одним типом может понять, что я хочу все эти переменные сделать к примеру байтом или интегером ?

Ответить

Номер ответа: 5
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #5 Добавлено: 24.05.08 21:10
Извини я в код не вчитывался и точно сказать в чём проблема немогу, но с переменными ты ошибся, исправь мож в этом и беда.

Ответить

Номер ответа: 6
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #6 Добавлено: 24.05.08 21:13
Описание переменной заканчивается на запятой.

Ответить

Номер ответа: 7
Автор ответа:
 Holsten



Вопросов: 5
Ответов: 100
 Профиль | | #7 Добавлено: 24.05.08 21:22
Кстати тут я случайно добавляю вместо 1 двойку, но это по идее не должно играть существенной роли.

MasJ(j) = 2 ' присвоение
Debug.Print MasJ(j) ' какое значение кроме двойки ожидаешь увидить?

Ответить

Номер ответа: 8
Автор ответа:
 Blood



Вопросов: 2
Ответов: 12
 Профиль | | #8 Добавлено: 24.05.08 21:22
 Smith, не знаю, почему ты так думаешь но нас в универе учили что так можно да и так вполне работает, я проверял.

Ответить

Номер ответа: 9
Автор ответа:
 Blood



Вопросов: 2
Ответов: 12
 Профиль | | #9 Добавлено: 24.05.08 21:30
Ну а как тогда мне заменить именно один 0 на 2йку и потом увидеть весь разрешающий массив целиком ?

Ответить

Номер ответа: 10
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #10 Добавлено: 24.05.08 21:31
Я так думаю потому, что когда я проверял это неработало, непомню в каком сервиспаке.
Неисповедимы пути микрософта.

Ответить

Номер ответа: 11
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #11 Добавлено: 24.05.08 21:32
Ты проверял тип переменных объявленных таким методом?

Ответить

Номер ответа: 12
Автор ответа:
 Blood



Вопросов: 2
Ответов: 12
 Профиль | | #12 Добавлено: 24.05.08 21:41
Да, он видит их именно как Байт или Интегер. Жаль только что видимо никто не может помочь мне именно с вопросом - решение такое удобное, а реализовать его до конца не смог.

Ответить

Номер ответа: 13
Автор ответа:
 Holsten



Вопросов: 5
Ответов: 100
 Профиль | | #13 Добавлено: 24.05.08 21:52
У тебя закомментирована необъявленная переменная 'kok', которая должна по идее дожна обнулятся после

For j = 2 To m
        kok = 0

...

Ответить

Номер ответа: 14
Автор ответа:
 Blood



Вопросов: 2
Ответов: 12
 Профиль | | #14 Добавлено: 24.05.08 22:04
Я не вполне понимал зачем я её поставил, потом решил убрать. Но сейчас попробую.

Ответить

Номер ответа: 15
Автор ответа:
 Holsten



Вопросов: 5
Ответов: 100
 Профиль | | #15 Добавлено: 24.05.08 22:09
Что то вроде этого:
For j = 2 To m
    kok = 0
    For i = 1 To n
        If Mas(i, 1) < Mas(i, j) Then
            kok = kok + 1
            Debug.Print Mas(i, j)
        End If
    Next i
    If kok = m Then
        MasJ(j) = 1
        Debug.Print j
    End If
Next j

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам