2012-10-18 2 views
0

다차원 배열을 정렬하려고하는데 정확한 방법인지 확실하지 않습니다. 지금까지 다차원 배열에서 다섯 자리 숫자를 얻은 다음 단일 차원 배열로 이동하고 배열 정렬을 사용했습니다. 더 나은 방법을 알고 있습니까? 또는 내 개선 방법에 대한 아이디어가 있습니까? 또한, 코드는 현재 정렬 영역에서 작동하지 않습니다, 그것은 나에게 배열 오류 인덱스를 제공합니다.다차원 배열 순서 지정

도움이 될 것입니다. 사전

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

2 차원 배열 대신 배열 배열을 원한다고 생각합니다. 또는, 더 나은, 배열의 목록. 플레이어 당 주사위 롤 목록을 정렬하는 아이디어입니까? –

답변

0

반복하는 배열의 관용적 방법 감사는이 들어 문

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 

될 것이다. 따라서 예외가 발생합니다.


정수 난수 한 번만 랜덤를 만든 다음 Next 메서드를 호출하여 다음 난수를 얻을이 0에서 10 사이의 난수를 생성하는 Random 클래스

Dim randomizer As New Random() 
Dim randomNumber As Integer 

... 

randomNumber = randomizer.[Next](10) 

을 사용하여 만들 수 있습니다 .

은 ( Next는 VB에서 키워드이기 때문에 당신은 괄호 사이에 Next 방법을 넣어해야합니다.)


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

일단 난수가 출력되면이 난수를 어떻게 정렬할까요? – user1683391

+0

내 업데이트를 참조하십시오. 각 행의 길이가 다를 수 있기 때문에 이러한 배열을 지그재그 배열이라고합니다. 예를 들어'game (0) = New Integer (2) {}'와'game (1) = New Integer (17) {}'을 쓸 수 있습니다. –

0

당신이 이것을 스케치하면 정말 도움이 될 것입니다. 단일 차원 배열과 다차원 배열 간에는 실제 차이점이 없습니다. 그것은 순전히 자신의 생각 과정입니다. 5 개의 주사위의 롤 그리드로 구성된 5x3 배열을 고려하십시오. -> 롤 1 -> 1 2 3 4 5 롤 2 -> 2 4 2 1 5 롤 3 -> 2 5 4 3 배열의 시작 : 2 차원으로

: 우리는 두 가지 방법으로 구성 할 수있다

또는 1 차원으로 2 : 배열의 시작 - 당신은 어느 쪽이든 임의로 당신이 분할하고 방법을 결정하기> 1 2 3 4 5 2 4 2 1 5 2 5 4 3 2

당신의 메모리 블록의 덩어리. 2 차원의 경우, 기본적으로 첫 번째 배열 인덱스를 마킹하는 것입니다. "각 두 번째 차원은 5 개의 정수를 보유합니다."메모리에서 당신은 다음과 같을 것입니다 : memory_address = 배열의 메모리 공간에 도달하기위한 오프셋 + [1st_Dim] * sizeof (5 정수) + [2nd_Dim] * sizeof (정수)

memory_address = 배열의 메모리 공간을 확보하기위한 오프셋 + [1st_Dim] * sizeof (정수)

두 개의 주소는 사용자가 오른쪽 인덱스.

인덱스를 통해이를 반복하면 어떤 내용을 반복하는지 이해하는 데 도움이됩니다.