2011-08-30 3 views
0

내 프로그램에 컴파일 오류가 없지만 출력이 잘못되었습니다. 예 입력 : 배열선형 검색 문제

크기 : 5 개
입력 번호 : 5 4 3 2 1
// 정렬 : 1 2 3 4 5
됨 : 1
출력 : 인덱스를 찾을 수 1~4

이미 숫자가 정렬되었으므로 결과는 인덱스 0에서 번호 1이어야합니다. 어떻게 변경합니까?

int[] nums = new int[100]; 
    int SizeNum; 
    bool isNum = false; 

    private void ExeButton_Click(object sender, EventArgs e) 
    { 
     int i, loc, key; 
     Boolean found = false; 
     string SizeString = SizeTextBox.Text; 
     isNum = Int32.TryParse(SizeString, out SizeNum); 
     string[] numsInString = EntNum.Text.Split(' '); //split values in textbox 
     for (int j = 0; j < numsInString.Length; j++) 
     { 
      nums[j] = int.Parse(numsInString[j]); 
     } 
     if (SizeNum == numsInString.Length) 
     { 
      Array.Sort(numsInString); 
      key = int.Parse(SearchTextBox.Text); 
      ResultText.AppendText("Sorted: "); 
      for (i = 0; i < SizeNum; i++) 
       ResultText.AppendText(" " + numsInString[i]); 
       ResultText.AppendText("\n\n"); 
      { 
       for (loc = 0; loc < SizeNum; loc++) 
       { 
        if (nums[loc] == key) 
        { 
         found = true; 
         break; 
        } 
       } 
       if (found == true) 
        ResultText.AppendText("Number " + key + " Found At Index [" + loc + "]\n\n"); 
       else 
        ResultText.AppendText("Number " + key + " Not Found!\n\n"); 
      } 
     } 
    } 
+1

이것은 선형 검색 외에는 다른 것처럼 보입니다. –

+0

프로그램이 분명히 * 않습니다 * 당신이 원하는대로하지 않기 때문에 오류가 있습니다 ... –

+0

그것은 lineair 검색과 비슷합니다. 그것은 마지막 부분입니다. 그러나 Sort()는 필요하지 않으며 입력 데이터에서 위치를 원한다면 잘못되었습니다. –

답변

2

당신은 numsInString를 정렬하지만 nums을 검색하고 있습니다. nums이 채워지기 전에 검색을 수행하므로 정렬되지 않은 숫자를 검색 한 결과가 표시됩니다.

numsInStringsnums으로 구문 분석했으면 후자의 배열로만 작업해야합니다. 그것이 당신이 정렬하고 검색하는 대상인지 확인하십시오. 당신이 잘 될 것입니다

Array.Sort(nums); 

코드와 현재 정렬 전화를 교체하면 즉

. 업데이트

는 :

당신은 실제로 다른 수정이 필요합니다. 지금은 nums을 크기 100의 배열로 초기화하고 있습니다. 기본적으로 각 요소는 0입니다. 따라서 처음 5 개의 요소에 숫자를 넣었을 때 배열을 정렬하면 95 0으로 끝나고,

string[] numsInString = EntNum.Text.Split(' '); //split values in textbox 
nums = new int[numsInString.Length]; 

for (int j = 0; j < numsInString.Length; j++) 
{ 
    nums[j] = int.Parse(numsInString[j]); 
} 

을 이제 일종의 nums, 당신은 당신이 입력 한 번호 만 볼 때 당신이 numsInString이 얼마나 큰지 알 때까지 1 2 3 4 5

다음에 당신은 nums를 초기화하는 것을 연기해야한다.

+0

그건 당신이 int array 대신에 string array를 정렬하는 것이고, 나는 당신이 의도 한 것이라고 생각하지 않는다. – crlanglois

+0

@crlanglous 오른쪽; 'nums' 배열로 정렬을 변경하면 두 가지 문제가 해결됩니다. – dlev

+0

그건 내 첫 번째 옵션이었다. Array.Sort (nums) ;. 하지만 0을 표시합니다. 그런 다음 NumInstring으로 변경합니다. – Boogie

0

파싱 하시겠습니까? numsInString다음에을 정렬하고 있습니다. (나는 일종의 당신도,하고 싶은 일을하지 않습니다 생각한다.)

난 당신이 정말 대신 nums 정렬 싶은 생각 :

Array.Sort(nums); 

이 끝을 달성하는 간단한 방법이 있다는 것을 말해 두 겠는데 결과 - IndexOf을 사용하여 배열에서 값의 색인을 찾으십시오. 당신이 몸 루프를 가지고 것처럼 보일 하게

for (i = 0; i < SizeNum; i++) 
    ResultText.AppendText(" " + numsInString[i]); 
    ResultText.AppendText("\n\n"); 
{ 
    ... 
} 

하지만, 실제로 상당의 :

그것은 왜 당신이있어 중괄호도 여기에 다소 불분명

for (i = 0; i < SizeNum; i++) 
{ 
    ResultText.AppendText(" " + numsInString[i]); 
} 
ResultText.AppendText("\n\n"); 
{ 
    ... 
} 

... 중괄호는 여기에 용도가 없으며 가독성을 해칠뿐입니다.

1

numsInString 배열을 정렬하지만 여전히 배열 배열 nums을 검색 중입니다.

for (loc = 0; loc < SizeNum; loc++) 
{ 
    if (numsInString[loc] == key) 
    { 
     found = true; 
     break; 
    } 
}