2012-11-23 3 views
0

현재 정렬 프로그램을 작성 중입니다. 배열을 만드는 데 세 가지 다른 방법, 즉 Random, In OrderReverse을 만들었습니다. 현재 In OrderReverse 어레이에 문제가 있습니다. In Order 어레이가 생성 될 때마다 1으로 시작합니다. 어떻게 그렇게되는지 확신 할 수 없습니다. 또한 내 Reverse 배열은 순서가 아닌 모든 클릭을 순서대로 표시합니다. 이 두 가지 문제를 어떻게 해결할 수 있습니까?다른 배열 만들기 : 올바른 결과가 표시되지 않습니다.

namespace sortingMachine 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     //Class Level Variables -------------------------------------------------------------------------------------- 

     Stopwatch sw = new Stopwatch(); 
     Random r = new Random(); 
     OpenFileDialog open1 = new OpenFileDialog(); 

     long operations = 0; 
     int size; 
     int max; 
     int[] createArray; 
     int[] sortArray; 
     int[] copyArray; 

     //Create Array Methods -------------------------------------------------------------------------------------- 

     public void RandomNumber() 
     { 
      size = Convert.ToInt32(textBoxSize.Text); 
      max = Convert.ToInt32(textBoxMax.Text); 
      createArray = new int[size]; 
      copyArray = new int[size]; 
      sortArray = new int[size]; 

      for (int i = 0; i < size; i++) 
      { 
       createArray[i] = r.Next(1, max); 
      } 

      textBoxResults.AppendText("-------------------------------------------------------------------------------" + Environment.NewLine + "Random" + Environment.NewLine + Environment.NewLine); 

      DisplayArrays(); 
     } 

     public void InOrder() 
     { 
      size = Convert.ToInt32(textBoxSize.Text); 
      max = Convert.ToInt32(textBoxMax.Text); 
      createArray = new int[size]; 
      copyArray = new int[size]; 
      sortArray = new int[size]; 

      createArray[0] = 1; 

      for (int i = 1; i < size; i++) 
      { 
       createArray[i] = createArray[i - 1] + r.Next(1, max); 
      } 

      for (int i = 1; i < size; i++) 
      { 
       if (r.Next(1, 101) < Convert.ToInt32(textBoxPercentage.Text)) 
       { 
        for (int x = 1; x < size; x++) 
        { 
         createArray[x] = r.Next(1, createArray[size - 1]); 
        } 
       } 
      } 

      textBoxResults.AppendText("-------------------------------------------------------------------------------" + Environment.NewLine + "In Order" + Environment.NewLine + Environment.NewLine); 

      DisplayArrays(); 
     } 

     public void ReverseOrder() 
     { 
      size = Convert.ToInt32(textBoxSize.Text); 
      max = Convert.ToInt32(textBoxMax.Text); 
      createArray = new int[size]; 
      copyArray = new int[size]; 
      sortArray = new int[size]; 

      createArray[size - 1] = 1; 

      for (int i = size - 1; i > 0; i--) 
      { 
       createArray[i - 1] = createArray[i] + r.Next(1, max); 
      } 

      for (int i = size - 1; i > 0; i--) 
      { 
       if (r.Next(1, 101) < createArray[0]) 
       { 
        for (int x = size - 1; x > 0; x--) 
        { 
         createArray[x] = r.Next(1, createArray[0]); 
        } 
       } 
      } 

      textBoxResults.AppendText("-------------------------------------------------------------------------------" + Environment.NewLine + "Reverse Order" + Environment.NewLine + Environment.NewLine); 

      DisplayArrays(); 
     } 



     private void buttonCreateArray_Click(object sender, EventArgs e) 
     { 

      if ((textBoxSortKey.Text != "") && (textBoxCreateKey.Text != "")) 
      { 
       if (radioButtonRandom.Checked == true) 
       { 
        RandomNumber(); 
       } 

       if (radioButtonInOrder.Checked == true) 
       { 
        InOrder(); 
       } 

       if (radioButtonReverseOrder.Checked == true) 
       { 
        ReverseOrder(); 
       } 
      } 
      else 
      { 
       MessageBox.Show("Type a key into the Key textbox."); 
      } 
     } 



    } 
} 

결과 표시 :

항상 일을 시작하는 이유는 확실하지 않다 순서 배열 :

------------------------------------------------------------------------------- 
In Order 
1 
2 
4 
6 
10 

있습니다 시간 역순으로 배열이 같은 것 이 :

------------------------------------------------------------------------------- 

    Reverse Order 
    10 
    2 
    7 
    6 
    5 

윈도우 형태 : 당신은 두 FORS 사이의 각의 if 문에서, 역순에 관해서 1. 배열의 첫 번째 인덱스를 초기화 중위 기능에

enter image description here

+0

디버깅을하셨습니까? 코드를 한 단계 씩 살펴보고 변경되는 값을 살펴보십시오. –

+1

당신의 문제와 * 아무것도 * 증명할 수있는 짧지 만 완전한 프로그램을 보여 주면 정말 도움이 될 것입니다. 콘솔 앱을 사용하면 훨씬 쉽게 재생산 할 수 있습니다. –

+0

@JonSkeet 완전한 예제 프로그램입니다. 필요한 것은 붙여 넣기를 복사하고 텍스트 상자를 Windows 양식에 맞게 이름을 지정하는 것뿐입니다. 도와주세요. – techAddict82

답변

2

당신이 배열에 값을 할당하는 방법을 보면 첫 번째 요소가 제로 할당 된 것을 볼 수 있습니다,하지만 루프에서 두 번째 요소에서 시작 (즉, 1을) 그래서 당신은 첫째을 다시 지정하지 요소.

 createArray[0] = 1; 

     for (int i = 1; i < size; i++) 
     { 
      createArray[i] = createArray[i - 1] + r.Next(1, max); 
     } 

는 다음과 같이 첫 번째 요소 할당을 작성하십시오 :
 createArray[0] = r.Next(1, max); 

역방향 기능에 관해서는, 너무 많은 불확실성이 정말 당신이 뭘 하려는지보고 거기에있다. 몇 번 더 생각해보십시오. 특히 다음과 같은 코드를주의하십시오. if (r.Next(1, 101) < createArray[0]) - 임의 동작과 마법 번호가 있습니다.

1

1-101 사이의 임의의 숫자를 배열의 첫 번째 숫자와 비교할 시간입니다. 대신 배열의 숫자를 서로 비교해야합니다.

+0

+1 예제 코드를 사용하여'역순 '을 어떻게 바꿀지를 보여줄 수 있습니까? – techAddict82

관련 문제