2012-01-15 6 views
0

こんにちは私は抜け出せないくせに達しました。C#の新機能で、すべてのコードパスが値を返すわけではありません。ボトルカウンティングプログラム、switch文

私のプログラムは、4つの部屋で収集されたボトルの数を記録します。プログラムは、部屋番号を入力してから、その部屋が収集したボトルの数を入力する必要があります。ユーザーが「quit」と入力すると、プログラムは各部屋で収集されたボトルを吐き出し、収集された最も多くのボトルを持つ部屋を計算します。私は入力していない限り、各部屋にボトルを追加することができるはずです。

GetRoom(int room)が機能しない、つまり値を返さないメソッドです。 ほとんどのボトルを集めた部屋はどのようにして見つけられますか?数学。マックス?

LINQまたは配列を使用することはできません。割り当てルールの一部。あなたは、あなたの関数が何かを返すことを確認する必要があり

namespace BottleDrive1 
{ 
    class Program 
    {//Initialize 4 rooms. 
     int room1 = 0; 

     int room2 = 0; 

     int room3 = 0; 

     int room4 = 0; 

     static void Main(string[] args) 
     { 
      //Start of while loop to ask what room your adding into. 
      while (true) 
      { 
       Console.Write("Enter the room you're in: "); 
       //If user enters quit at anytime, the code will jump out of while statement and enter for loop below 
       string quit = Console.ReadLine(); 
       if (quit == "quit") 
        //Break statement allows quit to jump out of loop 
        break; 
      } 
     } 

     private void SetRoom(int room, int value) 
     { 
      switch (room) 
      { 
       case 1: 
        room1 = value; 
        break; 
       case 2: 
        room2 = value; 
        break; 
       case 3: 
        room3 = value; 
        break; 
       case 4: 
        room4 = value; 
        break; 
      } 
     } 
     public void GetRoom(int room) 
     { 
      int count = int.Parse(Console.ReadLine()); 

      switch (room) 
      { 
       case 1: 
        room1 += count; 
        break; 
       case 2: 
        room2 += count; 
        break; 
       case 3: 
        room3 += count; 
        break; 
       case 4: 
        room4 += count; 
        break; 
       default: 
        throw new ArgumentException(); 
      } 

     } 
    } 
} 
+1

:エンドユーザーが入力した値の追加のチェックは、現在の部屋を取得しようとしたときに例外を防止またはユーザーが入力した値intに解析するために追加されていることに注意してくださいよく –

+0

あなたのループ内でbreak文 –

+0

Visual Studioは、それが2つのブラケットは<私が最も最近の – gli

答えて

0

ここでは、クラスを使用して各部屋の情報を保持する例を示します。クラスを使用する理由は、今後情報を収集するためにプログラムを変更する必要がある場合は、別の配列をまだトラッキングする必要がないため、クラスにプロパティを追加するだけです。

個々の部屋は、異なる構造を示すために配列の代わりにリストに保持されるようになりました。ここで

は新しいルームクラスです:

public class Room 
{ 
    public int Number { get; set; } 
    public int BottleCount { get; set; } 

    public Room(int wNumber) 
    { 
     Number = wNumber; 
    } 
} 

そして、ここでは、プログラムの新バージョンです。括弧がフォーマットされていない

static void Main(string[] args) 
    { 
     const int MAX_ROOMS = 4; 
     var cRooms = new System.Collections.Generic.List<Room>(); 

     for (int nI = 0; nI < MAX_ROOMS; nI++) 
     { 
      // The room number is 1 to 4 
      cRooms.Add(new Room(nI + 1)); 
     } 

     // Initializes the room that wins 
     //Start of while loop to ask what room your adding into. 
     while (true) 
     { 
      Console.Write("Enter the room you're in: "); 
      //If user enters quit at anytime, the code will jump out of while statement and enter for loop below 
      string roomNumber = Console.ReadLine(); 
      if (roomNumber == "quit") 
      { 
       //Break statement allows quit to jump out of loop 
       break; 
      } 
      int room = 0; 
      if (int.TryParse(roomNumber, out room) && (room < MAX_ROOMS) && (room >= 0)) { 
       Room currentRoom; 

       currentRoom = cRooms[room]; 

       Console.Write("Bottles collected in room {0}: ", currentRoom.Number); 

       int wBottleCount = 0; 

       if (int.TryParse(Console.ReadLine(), out wBottleCount) && (wBottleCount >= 0)) 
       { 
        // This line adds the count of bottles and records it so you can continuously count the bottles collected. 
        currentRoom.BottleCount += wBottleCount; 
       } 
       else 
       { 
        Console.WriteLine("Invalid bottle count; value must be greater than 0"); 
       } 
      } 
      else 
      { 
       Console.WriteLine("Invalid room number; value must be between 1 and " + MAX_ROOMS.ToString()); 
      } 
     } 

     Room maxRoom = null; 

     foreach (Room currentRoom in cRooms) //This loop goes through the array of rooms (4) 
     { 
      // This assumes that the bottle count can never be decreased in a room 
      if ((maxRoom == null) || (maxRoom.BottleCount < currentRoom.BottleCount)) 
      { 
       maxRoom = currentRoom; 
      } 
      Console.WriteLine("Bottles collected in room {0} = {1}", currentRoom.Number, currentRoom.BottleCount); 
     } 
     //Outputs winner 
     Console.WriteLine("And the Winner is room " + maxRoom.Number + "!!!"); 
    } 
1

: HERESには私のコードです。このコードをコンパイルしようとしましたか?あなたのメソッドを修正するコンパイルエラーがあります。

そして、Math.Maxは最大値を見つけるのに適しています。

+0

コンパイルエラー「エラー 『BottleDrive1.Program.GetRoom(int型)』:いないすべてのコードパスが値を返す」あなたはあなたが休憩を呼び出す前に、要求されている部屋を返却する必要があります – gli

+0

。 – Joe

+0

このように?ケース1: room1 + =カウント; return room1; 私は帰国後に休憩を取ると、そこに帰国して休憩にアクセスすることはできません。 – gli

1

GetRoomメソッドは値を返しません。 switch文にデフォルト値を指定するか、その後にreturn文を指定します。また、これらのケースで例外を発生させることもできます。

例:

public int GetRoom(int room) 
{ 
    int count = int.Parse(Console.ReadLine()); 
    switch (room) 
    { 
     case 1: 
      room1 += count; 
      break; 
     case 2: 
      room2 += count; 
      break; 
     case 3: 
      room3 += count; 
      break; 
     case 4: 
      room4 += count; 
      break; 
     default: 
      throw new ArgumentException(); //either this 
    } 
    throw new ArgumentException(); //or this 
} 

ところで、あなたはあなたの既存のコードを簡素化し、新しい書き込みあなたにいくつかの時間を節約する代わりに、4つの異なる変数の4つの要素の配列を使用することができます。例えば、GetRoomは次のようになります。

public int GetRoom(int room) 
{ 
    int count = int.Parse(Console.ReadLine()); 
    rooms[room] += count; 
    //return what you need to return here 
} 
+0

これはリターンとして機能しますか? – gli

+0

公共INT GetRoom(INT室) {int型のカウント= int.Parse(Console.ReadLine())。 スイッチ(部屋) {ケース1: ROOM1 + =数えます。 return room1; ケース2: ROOM2 + =数えます。 return room2; ケース3: room3 + =カウント; return room3; ケース4: room4 + =カウント; リターンルーム4; } – gli

+0

私は、アレイの提案のための –

1

問題は、あなたのGetRoom方法がintを返すように定義され、したがって、それはすべてのコードパスでそうしなければならないということです。この特定の例は、どのパスでも値を返しません。

GetRoomメソッド内のロジックに基づいていますが、返す代わりにルームを修正しているようです。その場合は、単にあなたがすべてであなたの関数から何かを返されていませんvoid

public void GetRoom() { 
    ... 
} 
+0

ありがとう、私のプログラムがデバッグに合格するようにvoidがあります。しかし、今私は "Console.Write("あなたがいる部屋を入力して取得することができません: ");"ループ。それは私が何を入力しても部屋の番号を求めている。 – gli

+0

@GeorgeLi入力に基づいてGetRoomまたはSetRoomを呼び出す必要があります。サンプルから、入力値に基づいてフローをどのようにしたいかを伝えることは難しい – JaredPar

0

を返すようにする方法を切り替えます。このようなものを試してみて、一時変数に結果を格納してから、関数を終了すると結果が返されます。

public int GetRoom(int room) 
{ 
    int count = int.Parse(Console.ReadLine()); 
    int temp = 0; 
    switch (room) 
    { 
     case 1: 
      room1 += count; 
      temp = room1; 
      break; 
     case 2: 
      room2 += count; 
      temp = room2; 
      break; 
     case 3: 
      room3 += count; 
      temp = room3; 
      break; 
     case 4: 
      room4 += count; 
      temp = room4; 
      break; 
     default: 
      throw new ArgumentException(); 
    } 

    return temp; 

} 
+0

ありがとう! – gli

+0

@GeorgeLi - 問題ありません。あなたはあなたが尋ねた古い質問を見て、[回答を受け入れる]ことができます(http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。君は –

関連する問題