2013-10-14 88 views
0

我必须建立一个程序,它需要一个比萨的直径,并找出它可以容纳多少片以及每片的面积,比萨,它用常量定义比萨尺寸,但是获得与“int numberOfSlice”的错误是它使用未分配的局部变量,甚至认为分配思想if语句。使用未分配的局部变量

class Program 
{ 
    static void Main(string[] args) 
    { 
     //declarations of Constans 

     const int SMALL_MIN = 12; 
     const int SMALL_MED = 16; 
     const int MED_LARGE = 24; 
     const int LARGE_XLARGE = 30; 
     const int XL_MAX = 36; 
     const int SMALL_SLICE = 8; 
     const int MED_SLICE = 12; 
     const int LARGE_SLICE = 16; 
     const int XL_SLICES = 24; 
     //declarations of varable 
     double pizzaDiameter; 
     int numberOfSlices = 0; 
     double sliceArea; 
     double radius; 
     string userInput = " "; 


     Console.WriteLine("Please enter the diameter of your pizza:"); // tell user to input diameter 
     userInput = Console.ReadLine(); // gets userinput 
     double.TryParse(userInput, out pizzaDiameter); // see if userinput is vaild 


     if (pizzaDiameter >= SMALL_MIN && pizzaDiameter <= XL_MAX) // if in range will continue 
     { 

      // all the ranges for the pizzas 
      if (pizzaDiameter >= SMALL_MIN && pizzaDiameter < SMALL_MED) 
      { 
       numberOfSlices = (SMALL_SLICE); 
      } 

      else if (pizzaDiameter >= SMALL_MED && pizzaDiameter < MED_LARGE) 
      { 
       numberOfSlices = (MED_SLICE); 
      } 

      else if (pizzaDiameter >= MED_SLICE && pizzaDiameter < LARGE_XLARGE) 
      { 
       numberOfSlices = (LARGE_SLICE); 
      } 

      else if (pizzaDiameter >= LARGE_XLARGE && pizzaDiameter <= XL_MAX) 

      { 
       numberOfSlices = (XL_SLICES); 
      } 


      radius = pizzaDiameter/2; // divides pizzaDiameter to get radius 


      sliceArea = Math.PI * Math.Pow(radius, 2)/numberOfSlices; // gets slice area 

      sliceArea = Math.Round(sliceArea, 2); // rounds to 2 places 

      // output of resluts 
      Console.WriteLine("\nA diameter of " + pizzaDiameter + " will yield " + numberOfSlices + " slices."); 
      Console.WriteLine("\nEach slice will have an area of " + sliceArea + "\"."); 

      Console.WriteLine("\nPress any key to exit..."); // tells user to end program 
      Console.ReadKey(); // readkey to end program 


     } 



     else // if the diameter was not in range will display this error 
     { 
      Console.WriteLine("\nEntry Error "); 
      Console.WriteLine("\nPizza must have a diameter in the range of 12\" to 36\" inclusive!"); 
      Console.WriteLine("please try again"); 

      Console.WriteLine("\nPress any key to end this application...");// tells user to end program 
      Console.ReadKey(); // readkey to end program 

     }  






    } 
} 

}

+0

您还没有将其分配到外'else'块中。 – McGarnagle

+3

不要在C#中使用SHOUTING_CONSTANTS。处理你的常量LikeThis。 –

+0

好吧伙计们,我明白了,你们的回复太快了! –

回答

4

有错误告诉你需要知道的一切。您的numberOfSlices变量未正确初始化。在使用它之前,必须为每个可能的代码路径分配一个值。

尝试在它的声明的时候初始化它:

int numberOfSlices = 0; 

或者,你可以更仔细地构建您的if -blocks来避免这个错误:

if (pizzaDiameter <= XL_MAX || pizzaDiameter >= SMALL_MIN) 
{ 
    if (pizzaDiameter >= SMALL_MIN || pizzaDiameter < SMALL_MED) 
    { 
     numberOfSlices = (SMALL_SLICE); 
    } 
    ... 
    else // Note, you do not need the final `if` in this block 
    { 
     numberOfSlices = (XL_SLICES); 
    } 

    radius = pizzaDiameter/2; 

    sliceArea = Math.PI * Math.Pow(radius, 2); 

    Console.WriteLine("\nA diameter of " + pizzaDiameter + " will yield." + numberOfSlices + " slices."); 
    Console.WriteLine("\nEach slice will have an area of " + sliceArea + "\"."); 
    Console.WriteLine("\nPress any key to exit..."); 
    Console.ReadKey(); 
} 
else 
{ 
    Console.WriteLine(" Entry Error "); 
    Console.WriteLine("Pizza must have args diameter in the range of 12\" to 36\" inclusive!"); 
    Console.WriteLine("please try again"); 
    Console.WriteLine(" /nPress any key to end this application..."); 
    Console.ReadKey(); 
} 

在这段代码,numberOfSlices是仅在if块内使用,保证在使用之前为其分配一个值。

2

变量仍然是在外部else块未分配:

if (pizzaDiameter <= XL_MAX || pizzaDiameter >= SMALL_MIN) 
{ 
} 
else 
{ 
    // unassigned here 
} 
1

如果if (pizzaDiameter <= XL_MAX || pizzaDiameter >= SMALL_MIN)返回false,那么numberOfSlices不会得到分配及以下线路将失败。

Console.WriteLine("\nA diameter of " + pizzaDiameter + " will yield." + numberOfSlices + " slices."); 
1

由于您仅在if块中分配了错误,因此您会收到错误消息。
如果条件不满足会怎么样?在这种情况下,它不会被初始化,因此抛出该错误。

编译器会在使用任何变量之前检查每个可能的代码路径中的赋值。

你需要做的是,

int numberOfSlices=0; // Or whatever initial value you want to give 
if (pizzaDiameter <= XL_MAX || pizzaDiameter >= SMALL_MIN) 
{ 
} 
else 
{ 

} 
//Then, even if you try to access it here, it won't throw any error. 

注意:它不是由INT的default value初始化(即0),因为它是不是一类的数据成员。