2016-12-28 42 views
-1

我試圖做一個程序,它會找出哪一個數組的一半加在一起是更大的範圍,但不斷收到這個錯誤,我似乎無法找出原因系統索引出的C#

「嘗試從數組後部開始工作時,第31行的」平均Mark.exe「中出現」System.IndexOutOfRangeException「類型的未處理異常。

我對c#很新,想到我在做什麼應該工作? 非常感謝!

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace most_frequent_int 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      halfCheck(new int[] {1,1,2,3}); 
     } 

     static void halfCheck(int[] checkArray) 
     { 
      int fHalf = 0; 
      int sHalf=0; 

      //even method 
      if (checkArray.Length % 2 == 0) 
      {    
       for (int i= 0;i<checkArray.Length/2;i++)//check first half even 
       { 
        fHalf = fHalf + checkArray[i]; 
       } 

       for (int i=checkArray.Length;i>checkArray.Length/2;i--) 
       { 
        sHalf = sHalf + checkArray[i]; 
        Console.WriteLine(sHalf); 
       } 

       if (fHalf > sHalf) 
       { 
        Console.WriteLine("The first half is bigger"); 
       } 
       else 
       { 
        Console.WriteLine("The second half is bigger"); 
       } 
       Console.ReadLine(); 

      } 

      //odd method 
      else 
      { 
       Console.WriteLine("odd"); 
      } 
     } 
    } 
} 
+0

調試器告訴你什麼時候你通過代碼? –

+0

@哈維拉什你可以評論錯誤發生的地方 –

+0

http://stackoverflow.com/questions/20940979/what-is-an-indexoutofrangeexception-and-how-do-i-fix-it調試它並修復錯誤 –

回答

2

該錯誤是在這樣的代碼:

for (int i=checkArray.Length;i>checkArray.Length/2;i--) 
{ 
    sHalf = sHalf + checkArray[i]; 
    Console.WriteLine(sHalf); 
} 

Length屬性是基於1的,因爲它計數陣列中的元素,但索引是從零開始。當您嘗試訪問checkArray[i]時,i值已超過數組的末尾。考慮從checkArray.Length - 1開始。

0

在此行中:

for (int i = checkArray.Length; i > checkArray.Length/2; i--) 

要指定i到陣列的第一個迭代的長度。你不能通過它的長度來索引一個數組,因爲它比最後一個有效位置多一個。

嘗試這種情況:

for (int i = checkArray.Length - 1; i > checkArray.Length/2; i--) 
0

的問題是在下面的行:

for (int i=checkArray.Length;i>checkArray.Length/2;i--) 

訪問的第一個元素是checkArray[checkArray.Length]其是從數組中。允許的索引是checkArray.Length -1

嘗試:

for (int i=checkArray.Length - 1; i > checkArray.Length/2; i--) 
0

這條線:

for (int i=checkArray.Length;i>checkArray.Length/2;i--)

每次都會拋出一個IndexOutofRangeException。使用數組時,.length屬性返回數組中元素的數量,這與最高索引不同。

例如,如果checkArray有5個元素,索引爲0,1,2,3和4。checkArray.Length將返回元件的數量,這是5

由於您的for循環開頭i=checkArray.length,它嘗試的第一個索引總是會超出範圍。改爲嘗試i=checkArray.Length-1

0

你只需要改變我在第二個循環開始。 I = checkArray.Length - 1

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace most_frequent_int 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
    halfCheck(new int[] {1,1,2,3}); 
    } 

    static void halfCheck(int[] checkArray) 
    { 
     int fHalf = 0; 
     int sHalf=0; 

     //even method 
     if (checkArray.Length % 2 == 0) 
     {    
      for (int i= 0;i<checkArray.Length/2;i++)//check first half even 
      { 
       fHalf = fHalf + checkArray[i]; 
      } 

     for (int i=checkArray.Length - 1;i>checkArray.Length/2;i--) 
      { 
       sHalf = sHalf + checkArray[i]; 
       Console.WriteLine(sHalf); 
      } 

      if (fHalf > sHalf) 
      { 
       Console.WriteLine("The first half is bigger"); 
      } 
      else 
      { 
       Console.WriteLine("The second half is bigger"); 
      } 
      Console.ReadLine(); 

     } 

     //odd method 
     else 
     { 
      Console.WriteLine("odd"); 
     } 

    } 

} 
} 

陣列被編入索引從0開始,但長度在1開始所以你的陣列長度是4和但checkArray [4]不存在作爲在陣列中的最後一個項目是3.長度-1應該解決它。