Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Помогите с массивами : Добавлено: 17.05.08 21:04  

Автор вопроса:  Blood
Доброго времени суток. Прошу помощи у профи бейсика, так как сам к сожалению решить данную загадку не в состоянии. Суть моей проблемы в следующем :
У меня задание создать массив (3х4) и найти в нём такие элементы, которые являются наибольшими с своей строке и одновременно наименьшими в своем стобце. Как я не бился, но я не могу этого сделать. Создавать массив и искать в нём максимальное/минимальное число я умею, а вот с такой задачей справиться не смог. Может профи могут мне помочь ?

Ответить

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

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


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #1 Добавлено: 17.05.08 21:22
А в чем была проблема, если минимальное\максимальное находить умеешь?

Ответить

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



Вопросов: 2
Ответов: 12
 Профиль | | #2 Добавлено: 17.05.08 21:31
А проблема в том, что я не могу понять, как именно надо писать код чтобы он находил одновременно минимальное и максимальное, причём в условии подразумевается, что такое число может быть не одно. Вот мой код :
Private Sub Command1_Click()
Dim n, m, i, j As Integer, Mas() As Integer, Min, Max As Integer
Min = 20
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) = Int(Rnd * 15)
Debug.Print Mas(i, j);
'L1.AddItem Mas(i, j)
Next j
Debug.Print " "
Next i
For i = 1 To n
If Mas(i, j) <= Min Then
Min = Mas(i, j)
End If
For j = 1 To m
If Mas(i, j) >= Max Then
Max = Mas(i, j)
End If
Next j
Next i
...

Который, естественно, не работает, так как я не понимаю самого процессса. Вот смотри - процесс поиска максимального элемента вообще во всём массиве :
Сначала он прочёсывает строку первого столбца на предмет максимального элемента, находит его, записывает куда то, и начинает прочёсывать остальные строки в массиве сравнивая их с найденным элементом, так ?
Это я понимаю ,а вот принцип нахождения элементов по условию не могу...может поможешь ?

Ответить

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



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #3 Добавлено: 17.05.08 22:17
Ну, для начала желательно научиться писать код так, чтобы его можно были видеть "сквозь строки", т.е. ты смотришь в код, а видишь как он выполняется. Для эотго хотя бы соблюдай правила отступа блоков:

Dim n, m, i, j As Integer, Mas() As Integer, Min, Max As Integer
Min = 20
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) = Int(Rnd * 15)
        Debug.Print Mas(i, j);
        'L1.AddItem Mas(i, j)
    Next j
    Debug.Print " "
Next i
For i = 1 To n
    If Mas(i, j) <= Min Then
        Min = Mas(i, j)
    End If
    For j = 1 To m
        If Mas(i, j) >= Max Then
            Max = Mas(i, j)
        End If
    Next j
Next i

Ответить

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



Вопросов: 2
Ответов: 12
 Профиль | | #4 Добавлено: 17.05.08 22:38
Понятно. Я тут подумал и попытался пойти по такому принципу : сначала прочёсываются все строки на предмет нахождения максимального элемента, потом идёт прочёсывание по столбцам на поиск элемента, который является минимальным в своём стобце, но одновременно равено переменной в которую записан максимальный элемент. Тут ещё проблема, как сделать так, чтобы эти элмементы генерировались, видимо придётся вводить от руки.

Но, увы, только что опробовал и новый метод, код которого ниже, но и он не заработал(

For i = 1 To n
  For j = 1 To m
      If Mas(i, j) >= Max Then
        Max = Mas(i, j)
      End If
  Next j
Next i
For j = 1 To m
 For i = 1 To n
   If Mas(i, j) <= Min And Mas(i, j) = Max Then
    Min = Mas(i, j)
   End If
 Next i
Next j


Не знаю что и делать, прямо руки опускаются...

Ответить

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


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #5 Добавлено: 18.05.08 02:39
Попробуй поделить программу на функции.

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

Т.е. несколько функций, которые будет принимать в параметрах сам массив, и указанный номер строки или стоблца...

Пусть такие функции будут возвращать координаты элемента в массиве.

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

Ответить

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



Вопросов: 2
Ответов: 12
 Профиль | | #6 Добавлено: 18.05.08 09:35
HACKER, кажется я понял твою мысль :

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

Ответить

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



Вопросов: 2
Ответов: 12
 Профиль | | #7 Добавлено: 18.05.08 09:45
Кажется получилось, спасибо огромное HACKER`y.

Такой несерьёзный вопрос : а как вывести массив листбокс ? А то я пытался в цикле по созданию массива прописать L1.Additem Mas(i,j) , но в листбоксе появляется только один элемент массива, вместо всех.

Ответить

Номер ответа: 8
Автор ответа:
 D o c a l



ICQ: 408802757 

Вопросов: 76
Ответов: 985
 Web-сайт: www.doc-source.pp.net.ua/
 Профиль | | #8
Добавлено: 18.05.08 13:59
И вообще хочеш создать програму наподобие етой возьми и напиши себе масив на листочке и попытайся делать всё как должна делать машина.А потом только на листок запишеш алгоритм.а то ты и сам не понимаеш как такое можна зделать а уже пишеш под это програму

Ответить

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



Вопросов: 2
Ответов: 12
 Профиль | | #9 Добавлено: 18.05.08 18:22
Docal, я так и сделал. Вообще изначально я массив создавал рандомно, так что придумывать его не имело смысла, да и я вывожу его в дебаг и вижу, что он из себя представляет. А что касается "как должна делать машина", так я и пытаюсь это понять и в этом прошу помощи, а не тупо набить мне код)

Ответить

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


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #10 Добавлено: 19.05.08 00:20
Такой несерьёзный вопрос : а как вывести массив листбокс ? А то я пытался в цикле по созданию массива прописать L1.Additem Mas(i,j) , но в листбоксе появляется только один элемент массива, вместо всех.

Массив же вроде двухмерный у тебя, наверное подойдет больше ListView (таблицей), чем ListBox (просто список)

вообщем цикл (или двойной вложенный цикл если массив двухмерный).. типа

for i = LBound(mas) to UBound(mas)
 List1.AddItem mas(i)
next

или

for i = LBound(mas,1) to UBound(mas,1)
  for j = LBound(mas,2) to UBound(mas,2)
   str$ = str$ & mas(i,j) & " | "
  next j
  List1.AddItem str$
  str$ = ""
next i

ну или как я уже говорил - в ListView.

Кстати, заметил ты в коде своем индекс массива с единицы обрабатываешь, может так и задумано у тебя, но имей ввиду, что элементы в массиве начинаются с нуля!

т.е.
Dim mas (2)
mas (0) = ...
mas (1) = ...
mas (2) = ...

Если тебе нужно чтобы все индексы массива начинались с 1, то можно в самом верху программы дописать
Option Base 1

Ответить

Страница: 1 |

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



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