2011-03-24 80 views
2

我有作業。我試圖解決它,但我需要一些幫助..隊列在C++ ..家庭作業

  1. 使用隊列ADT並且不要更改任何ADT的功能或過程。您必須創建一個代表將在車站等候隊列中以清洗車身的汽車的結構車。每輛車都有自己的ID,看起來像124ate [6個字符],並且名稱像例如。 Superpan和生產年份作爲整數變量。在你的程序中,你不應該明確地調用Queue ADT,而應該使用全局函數來調用它們(隱式地)。
  2. 您的主程序只應該聲明和調用全局函數, 不應該使用任何結構。
  3. 你的輸出應該首先如下所示:
    1. 公園新車
    2. 打印
    3. 移動最早來車
    4. 打印所有汽車的汽車數量
    5. 出口

我的回答:

#include <iostream> 
#include "queue.h" 
#include <string> 

using namespace std ; 

struct car { 
    char ID[6]; 
    int year; 
    string name; 
} 

int main() 
{ 
    int num; 
    car car1; 
    Queue <car> q1; 

    do { 
     cout << "mniu \n" 
      << "1. Park new car \n" 
      << "2. Print the number of cars \n" 
      << "3. move earliest coming car \n" 
      << "4. Print All cars \n" 
      << "5. exit \n"; 

     cin >> num; 

     switch (num) 
     { 
     case 1: 
      int n; 
      cout << "enter id:\n"; 
      cin >> car1.ID; 
      cout << "enter name:\n"; 
      cin >> car1.name; 
      cout << "enter year:\n"; 
      cin >> car1.year; 

      q1.enqueue (car1); 
      break; 

     case 2: 
      cout << "number of cars: " << q1.queueCount(); 
      break; 

     case 3: 
      q1.dequeue(car1); 
      break; 

     case 4: 
      while (q1.queueCount()!=0) 
       cout << q1.front(); 

     case 5: 
      cout << "Thank you /n End program"; 
      break; 

     default: 
      cout << "failed number. chose from 1 to 5 \n"; 
     } 
    } 

    while (num==5); 

    return 0; 

} 

我的問題:

  1. 我如何可以打印節點的隊列節點而不刪除它?
  2. 「你的主程序只應該聲明和調用全局函數, 不應該使用任何結構。」這是否意味着我的代碼是錯誤的,因爲我寫的所有內容都是主要的..我不明白。
+0

什麼意思使得「不應該使用結構」的要求?你將如何模擬一輛汽車?類也是默認情況下具有公共訪問權的結構。 – harper 2011-03-24 15:18:14

+0

+1用於發佈您的代碼並且不要求人們編寫您的程序。 – 2011-03-24 16:48:32

回答

0
  1. 這是一個隊列,這樣可以節省第一個節點,它,並打印出每個元素,刪除,並將它推回隊列,直到看到(用於第二次!)的第1個要素。
  2. 是的,你不應該寫在main中的所有程序,而是使用函數和其他文件,按照某種邏輯意義組織。

編輯:

1.

car first = q1.dequeue(); 
q1.enqueue(first); 
    //ADD HERE: print first... 
while (q1.peek() != first) { 
    car element = q1.dequeue(); 
    q1.enqueue(first); 
    //ADD HERE: print element... 
} 


添加您的打印其中的意見 「在這裏補充:......」 的

2.您應添加功能,如getUserInput()和printQueue()來處理所有這些scenerios,主要將這些函數調用

+0

謝謝你amit gr .. 1 - 我該如何使用隊列ADT功能2 - 你的意思是我把everytheng放在全局函數中嗎?但是我的代碼怎麼會有開關,很多選擇如何。對不起,但我可以解釋.. – hnoo 2011-03-24 14:44:05

+0

我編輯了答案,看看你現在能否更好地理解它... – amit 2011-03-24 15:00:27

+0

p.s.這是一個半僞代碼,尤其是我沒有檢查指針/引用類型/值類型的正確性 – amit 2011-03-24 15:02:38

0

「你的主程序只應該聲明和調用全局函數,」

我相信你的老師鼓勵你將代碼分成單獨的子程序,每個子程序只做一件事。在這種風格,典型的main可能是:

int main() { 
    MyDataStruct x; 
    ReadInput(x); 
    ProcessData(x); 
    WriteOutput(x); 
} 

注意,沒有for循環中main,沒有附加上了,銷售和copmute最稅表情,沒有什麼主要要求任何處理。所有的好東西都在你的全局函數或數據結構的方法中。

將其應用於你的程序,你的主要可能是這樣的:

int globalExitFlag; 
int main() { 
    Queue<car> q; 
    Car c; 
    while(!globalExitFlag) { 
     int cmd; 
     cmd = PrintMenuAndAcceptOneAnswer(q, c); 
     DoOneCommand(q, c, cmd); 
    } 
} 

然後你就可以把你的cinPrintMenuAndAcceptOneAnswer閱讀的膽量,而印刷和隊列操縱住在DoOneCommand。當然,你必須自己寫PrintMenuAndAcceptOneAnswerDoOneCommand。我將進一步打破這些子程序 - 例如,DoOneCommand應該叫DoPrintAllCarsDoExitDoParkOneCar

最後,我也把while在這個main(),我認爲這是適當的。注意全局變量。我假設當你處理「退出」命令時,你將設置該變量來指示處理應該結束。

祝你好運,並回來告訴我們你的任務是如何實現的。