2014-06-19 56 views
2

我一直在研究Deitel的Visual C#2010。我被困在有關數組章節的練習中。現在已經困擾了我好幾天了,我現在已經寫了好幾遍了,每次都出錯了。我無法解決這個簡單的練習Deitel Visual C#2010

該練習要求爲小型航空公司開發新的預訂系統。一架飛機的容量是10個座位。所以你要求客戶輸入1爲頭等艙,2爲經濟。 1至5個座位爲頭等艙。從6到10的座位是爲了節約。

我必須使用bool類型的一維數組來表示飛機的座位字符。將數組的所有元素初始化爲false以表示空位(幸運的是布爾初始化爲false,因爲我不知道如何初始化數組)。在分配每個座位時,將平面中的相應元素設置爲true。

應用程序不應該分配已經坐下的座位。當經濟艙充滿時,應用程序應詢問客戶是否想要乘坐頭等艙(反之亦然)。如果客戶回答是,請將其分配到經濟艙(如果有空座位)。如果經濟艙裏沒有空座位,或者顧客拒絕乘坐頭等艙,那麼就向他展示「下一班航班是三小時後!」。

我正在自學這本書。不是作業或作業,我真的不希望發佈我寫的代碼,因爲我想要一個全新的方法來解決問題,但我很確定我會被問到代碼,所以這裏是

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

namespace Craps_Game 
{ 
    class AirlineReservation 
    { 
     private static bool[] seats = new bool[10]; 


    private static void FirstClass(ref bool[] seats) 
    { 
     for(int i = 0; i < 5; i++) 
     { 
      if (seats[i] == false) 
      { 
       seats[i] = true; 
       Console.WriteLine("Your seat number is " + i); 
       break; 
      } 
      else 
      { 
       Console.WriteLine("First Class is full. Would you like to fly Economy?"); 
       if (Console.ReadLine().ToLower() == "y") 
        Economy(ref seats); 
       else 
        Console.WriteLine("The next flight is in three hours!. Good bye"); 
      } 
     } 
    } 


    private static void Economy(ref bool[] seats) 
    { 
     for (int i = 5; i < 10; i++) 
      if (seats[i] == false) 
       seats[i] = true; 
      else 
      { 
       Console.WriteLine("Economy class is full. Would you like to fly First Class"); 
       if (Console.ReadLine().ToLower() == "y") 
        FirstClass(ref seats); 
       else 
        Console.WriteLine("The next flight is in three hours!. Good Bye"); 
      } 

    } 


    public static void Reservation() 
    { 
     do 
     { 
      Console.WriteLine("Enter 1 to fly First Class"); 
      Console.WriteLine("Enter 2 to fly Economy Class"); 
      if (Convert.ToInt32(Console.ReadLine()) == 1) 
       FirstClass(ref seats); 
      else 
       Economy(ref seats); 
     } while (true); 
    } 
} 

}

記住,我寧願解決問題,而不是固定這一個完全不同的方式:)

+1

有問題與此代碼,衆說紛紜。建議:瞭解如何使用調試器。學習如何逐行掃描代碼,並檢查變量和數組的內容。我用你的代碼做了這件事,並且第一次通過時將第一個座位設置爲「座位[0]」的循環看到它已打開並分配給它。第二次,它檢查'座位[0]',看到它已被佔用,然後執行條件的其他部分,即使有四個座位是空閒的。當你一行一行地說,它沒有做你想做的事,這是非常明顯的。 – Steve

+0

請參閱此MSDN頁面進行簡介:http://msdn.microsoft.com/en-us/library/ms173083(v=vs.90).aspx – Steve

+0

@Steve我知道這一點。我確實通過斷點來完成它,我確實知道這是問題所在。但我仍然無法解決這個問題,這只是最新的嘗試。 – Mustafa

回答

2

「我必須使用bool類型的一維數組來表示飛機的座位炭」

「我希望有一個完全新鮮的方式來解決問題「

「請記住,我寧願採取一種完全不同的方式來解決問題,而不是修復這個問題」

這樣吧!其他人已經給了你很好的建議,但這是「新鮮」的方式。

using System; 

namespace FunnyConsoleApplication 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      Airplane plane = new Airplane(); 
      bool reserve = true; 

      while (reserve) 
      { 
       Console.Clear(); 
       Console.WriteLine("Enter [1] to fly First Class ({0} vacant)", plane.VacantFirstClassSeats()); 
       Console.WriteLine("Enter [2] to fly Economy Class ({0} vacant)", plane.VacantEconomySeats()); 

       string input = Console.ReadLine(); 

       switch (input) 
       { 
        case "1": 
         if (plane.HasFirstClassSeats) 
         { 
          plane.ReserveFirstClassSeat(); 
         } 
         else if (plane.HasEconomySeats) 
         { 
          if (IsOk("No vacancy, enter [y] to fly Economy instead?")) 
           plane.ReserveEconomySeat(); 
          else 
           reserve = false; 
         } 
         else 
         { 
          reserve = false; 
         } 
         break; 

        case "2": 
         if (plane.HasEconomySeats) 
         { 
          plane.ReserveEconomySeat(); 
         } 
         else if (plane.HasFirstClassSeats) 
         { 
          if (IsOk("No vacancy, enter [y] to fly First Class instead?")) 
           plane.ReserveFirstClassSeat(); 
          else 
           reserve = false; 
         } 
         else 
         { 
          reserve = false; 
         } 
         break; 
       } 

       Console.WriteLine(); 
      } 
      Console.WriteLine("No can do, good bye!"); 
      Console.ReadLine(); 
     } 

     private static bool IsOk(string question) 
     { 
      Console.WriteLine(question); 
      return string.Compare(Console.ReadLine(), "y", StringComparison.OrdinalIgnoreCase) == 0; 
     } 
    } 

    public class Airplane 
    { 
     private readonly bool[] _seats = new bool[10]; 

     public bool HasFirstClassSeats 
     { 
      get { return HasSeats(0); } 
     } 

     public bool HasEconomySeats 
     { 
      get { return HasSeats(5); } 
     } 

     public int VacantFirstClassSeats() 
     { 
      return GetVacant(0); 
     } 

     public int VacantEconomySeats() 
     { 
      return GetVacant(5); 
     } 

     public void ReserveFirstClassSeat() 
     { 
      Reserve(0); 
     } 

     public void ReserveEconomySeat() 
     { 
      Reserve(5); 
     } 

     private bool HasSeats(int index) 
     { 
      for (int i = index; i < index + 5; i++) 
      { 
       if (!_seats[i]) 
        return true; 
      } 
      return false; 
     } 

     private int GetVacant(int index) 
     { 
      int count = 0; 
      for (int i = index; i < index + 5; i++) 
      { 
       if (!_seats[i]) 
        count++; 
      } 
      return count; 
     } 

     private void Reserve(int index) 
     { 
      for (int i = index; i < index + 5; i++) 
      { 
       if (!_seats[i]) 
       { 
        _seats[i] = true; 
        break; 
       } 
      } 
     } 
    } 
} 

,讓你

funnyconsoleapp

4

我不想在代碼中解決完整的問題,因爲您正在學習,但是我會告訴您我在代碼中看到的主要問題,即錯誤。

  • Economy方法不退出循環,如果它發現一個 座位是可用的。它需要打破。
  • 你的else當你沒有找到一個座位是不是檢查是否所有的座位都被採取。檢查i == 9是否會成功,如果沒有更多座位,則不會更早。


private static void Economy(ref bool[] seats) 
{ 
    for (int i = 5; i < 10; i++) 
    { // <---- Added the brackets 
     if (seats[i] == false) 
     { 
      seats[i] = true; 
      break; // <----- You forgot to break when you reserved a seat. 
     } 
     else if (i == 9) // <---- You weren't checking if all seats are taken. 
     { 
      Console.WriteLine("Economy class is full. Would you like to fly First Class"); 
      if (Console.ReadLine().ToLower() == "y") 
       FirstClass(ref seats); 
      else 
       Console.WriteLine("The next flight is in three hours!. Good Bye"); 
     } 
    } 
} 
+0

另外,如果所有座位都被佔用(如果代碼足以實現這一目標),那麼用戶可能會遇到一系列問題 - 「頭等艙已滿,經濟?」。其次是「經濟艙滿,頭等艙?」,並且來回直到用戶放棄。 – Steve

+1

@Steve是的,我寫了一篇關於改變他的方法返回bool的文章,以確定是否保留了座位,但是也許這是他一旦啓動並運行後可以學習的東西。 – TyCobb

+0

@TyCobb檢查座位是否充滿方法的想法確實讓我想起了:)。但是我也失敗了。這個問題讓我感到無法接受。在我花費大量的時間閱讀和學習面向對象的概念之後,它意識到你仍然在吮吸基礎知識:)。 – Mustafa

3

我喜歡你接近編程的方式,你的任務與本網站!

因此我不願意爲你寫出代碼 - 所有的樂趣都是由你自己完成的。但因爲你被卡住了,讓我給你一些提示:

  • 從底部開始,想到的第一件事是,你總是甚至提供兩班當一個或兩個都滿了。這裏是一個函數頭,可以幫助更進一步比你已經做打破下來:
public int getFirstVacantSeatIn(int classType) 
// returns 1-5 for classType=1, 6-10 for classType=2, -1 if classType is full 

您可以使用此功能進行提示動態如下:

Console.WriteLine((getFirstVacantSeatIn(1) >= 0 ? 
        "Enter 1 to fly First Class") : "First Class is full"); 

當你嘗試分配新的座位,你可以重複使用它..:

  • 另一點是,當一個人完全沒有檢查另一個人是否已滿時,你可以在類之間切換。我懷疑這是你面臨的問題?

所以你應該在提供升級或降級之前檢查..上面的函數也會有幫助。如果你能再利用的東西,很可能是正確創建的事..

祕訣就是曾經如此經常進一步打破你的問題,並進一步,直到它消失了,總是利用/創建有用的名稱的子問題..

+1

我強烈建議將'class'參數重命名爲別的東西,或者至少要做'@ class';) – TyCobb

+0

OK,同意;-)(我很容易說服..) – TaW