Опитвам се да сортирам многомерни масиви, ноне съм сигурен дали това е правилният начин да го направя. Досега получавам 5-те си номера в многомерния масив и след това ги премествам в едномерна матрица и използвам сортиране на масиви. Познава ли по-добър начин? или имате идеи за това как да подобрите моята? Също така, кодът в момента не работи в зоната за сортиране, той ми дава индекс от грешката в масива.
Всяка помощ ще бъде оценена. Благодаря предварително
Module q
Sub Main()
Randomize()
Dim Player,RandomNumber,NumberOfPlayers,Index As Integer
Dim Roll as Integer = 0
Console.Write("How many people will be playing Yahtzed?: ")
Player = convert.toint32(Console.Readline)
NumberOfPlayers = Player
Dim Game(Player,5) As Integer
Do until Player = 0
Console.Write("User")
Roll = 0
Do until Roll = 5
RandomNumber = CINT(Int((6 * Rnd()) + 1))
Game(Player,Roll) = RandomNumber
Roll += 1
Console.Write(" "&RandomNumber)
Loop
Player -= 1
Console.Writeline()
Loop
Player = NumberOfPlayers
Do until Player = 0
Dim Ordering(5) as Integer
Roll = 0
Do until Roll = 5
Ordering(Index) = Game(Player,Roll)
Roll += 1
Index += 1
Array.Sort(Ordering)
Loop
Loop
End Sub
End Module
Отговори:
0 за отговор № 1Идиоматичният начин на повтаряне на масиви се прави с помощта на For-изявление
Const NPlayers As Integer = 5, NRolls As Integer = 5
Dim game = New Integer(NPlayers - 1, NRolls - 1) {}
Dim randomizer As New Random()
Dim randomNumber As Integer
For p As Integer = NPlayers - 1 To 0 Step -1
For r As Integer = 0 To NRolls - 1
randomNumber = randomizer.[Next](10)
game(p, r) = randomNumber
Next
Next
Индексът на масива винаги се движи от 0
да се arraysize-1
.
Размерът на вашия масив за поръчка ще бъде NPlayers * NRolls
Dim Ordering(NPlayers * NRolls - 1) As Integer
Вашият е твърде кратък. Затова получавате изключение.
Целочислените случайни числа могат да бъдат създадени с помощта на Random
клас
Dim randomizer As New Random()
Dim randomNumber As Integer
...
randomNumber = randomizer.[Next](10)
Това създава случайни числа между 0 и 10. Създайте рандомизатор само веднъж и след това вземете следващото случайно число като извикате Next
метод.
(Трябва да сложите Next
метод между скобите, защото Next
е ключова дума в VB.)
UPDATE
Предполагам, че искате да сортирате ролите на играч. Най-лесният начин да постигнете това е да използвате вместо това назъбен масив.
Const NPlayers As Integer = 5, NRolls As Integer = 5
Dim game = New Integer(NPlayers - 1)() {}
For p As Integer = NPlayers - 1 To 0 Step -1
game(p) = New Integer(NRolls - 1) {}
For r As Integer = 0 To NRolls - 1
game(p)(r) = randomizer.[Next]()
Next
Array.Sort(game(p))
Next
Но ще трябва да имате достъп до ролките game(p)(r)
вместо game(p,r)
.
0 за отговор № 2
Наистина ще ти помогна да заложа, ако ти го скицирашнавън. Няма реална разлика между масив с едно измерение и мултимерен масив, това е чисто вашият мисловен процес. Помислете за 5x3 масив, състоящ се от мрежа от ролки от 5 зарчета.
Като двуизмерно: начало на масив -> рол 1 -> 1 2 3 4 5 ролка 2 -> 2 4 2 1 5 ролка 3 -> 2 5 4 3 2
Или като 1 измерение: начало на масив -> 1 2 3 4 5 2 4 2 1 5 2 5 4 3 2
Така или иначе трябва да произволно да определите какВие разделяте парчетата блокове памет. В двуизмерния случай предварително маркирате първия индекс на масива, за да кажете основно: "Всяко второ измерение ще съдържа 5 цели числа." В паметта ще разберете къде сте така: memory_address = отместване, за да стигнете до паметта на вашия масив + [1st_Dim] * sizeof (5 цели числа) + [2nd_Dim] * sizeof (цяло число)
Едномерният случай прави това вместо това: memory_address = отместване, за да стигнете до паметта на вашия масив + [1st_Dim] * sizeof (цяло число)
Двата адреса ще бъдат идентични, стига да "внимавате да знаете, че сте на правилния индекс".
Начертайте го на хартия и преминете през индексирането, то ще ви помогне да разберете какво прелиствате.