Доброго времени суток. Прошу помощи у профи бейсика, так как сам к сожалению решить данную загадку не в состоянии. Суть моей проблемы в следующем :
У меня задание создать массив (3х4) и найти в нём такие элементы, которые являются наибольшими с своей строке и одновременно наименьшими в своем стобце. Как я не бился, но я не могу этого сделать. Создавать массив и искать в нём максимальное/минимальное число я умею, а вот с такой задачей справиться не смог. Может профи могут мне помочь ?
А проблема в том, что я не могу понять, как именно надо писать код чтобы он находил одновременно минимальное и максимальное, причём в условии подразумевается, что такое число может быть не одно. Вот мой код :
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
...
Который, естественно, не работает, так как я не понимаю самого процессса. Вот смотри - процесс поиска максимального элемента вообще во всём массиве :
Сначала он прочёсывает строку первого столбца на предмет максимального элемента, находит его, записывает куда то, и начинает прочёсывать остальные строки в массиве сравнивая их с найденным элементом, так ?
Это я понимаю ,а вот принцип нахождения элементов по условию не могу...может поможешь ?
Ну, для начала желательно научиться писать код так, чтобы его можно были видеть "сквозь строки", т.е. ты смотришь в код, а видишь как он выполняется. Для эотго хотя бы соблюдай правила отступа блоков:
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
Понятно. Я тут подумал и попытался пойти по такому принципу : сначала прочёсываются все строки на предмет нахождения максимального элемента, потом идёт прочёсывание по столбцам на поиск элемента, который является минимальным в своём стобце, но одновременно равено переменной в которую записан максимальный элемент. Тут ещё проблема, как сделать так, чтобы эти элмементы генерировались, видимо придётся вводить от руки.
Но, увы, только что опробовал и новый метод, код которого ниже, но и он не заработал(
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
Т.е. сделай функцию, которая будет находить максимальный элемент в указаном стоблце, потом функцию чтобы максимальных элемент находила в указанной строке.
Т.е. несколько функций, которые будет принимать в параметрах сам массив, и указанный номер строки или стоблца...
Пусть такие функции будут возвращать координаты элемента в массиве.
Вообщем решай маленькие задачи, которые легко укладываются в голове, разбивая всё на функции. Потом уже из этих не больших кирпичей, соберёшь всю программу...
Сначала я прочёсываю каждую строку отдельно на предмет максимального именно в своей строке, потом каждый столбец на предмет минимального в своём столбце и если максимальные и минимальные числа совпадут, то получилось. Спасибо, попробую.
Такой несерьёзный вопрос : а как вывести массив листбокс ? А то я пытался в цикле по созданию массива прописать L1.Additem Mas(i,j) , но в листбоксе появляется только один элемент массива, вместо всех.
И вообще хочеш создать програму наподобие етой возьми и напиши себе масив на листочке и попытайся делать всё как должна делать машина.А потом только на листок запишеш алгоритм.а то ты и сам не понимаеш как такое можна зделать а уже пишеш под это програму
Docal, я так и сделал. Вообще изначально я массив создавал рандомно, так что придумывать его не имело смысла, да и я вывожу его в дебаг и вижу, что он из себя представляет. А что касается "как должна делать машина", так я и пытаюсь это понять и в этом прошу помощи, а не тупо набить мне код)
Такой несерьёзный вопрос : а как вывести массив листбокс ? А то я пытался в цикле по созданию массива прописать 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