2013-11-20 66 views
0

我試圖完成以下任務:使用switch語句和while循環結合

創建 一個 腳本 是 將 反覆 在 的 創建 一個 隨機 整數 ķ 範圍 的至直至 每 案例 已 已被 輸入 在 至少 一次。 You have possible cases。 案例 甲 是 輸入 時的 的 隨機 整數 ķ 的 範圍 是 輸入 等於 和B之間 或 到 7. 案例 是 範圍的 的 隨機 整數 ķ是 和C範圍的 之間 或等於 至8 14. 案例 是 輸入 當 的 的 隨機 整數K 是 之間 或 等於 到和規則: 當 一個 情況 是 進入 你 必須 打印 到 的 用戶 「恭喜你 進入 案例 (A , B, 或 C)「。 你 只能 只有 輸入 每個 案例 一次。 如果 的 程序 試圖 到 進入 的 相同 情況下 更 比 一次, 你 必須 打印。 「無效, 即 案例 已經 已經 已被 輸入」。 的 程序 將 結束 一次 所有 的 案件 已經 一直 進入 和 的 程序 將 打印 「好 工作, 你 有 進入 所有 案件」。 如果 的 程序 試圖 到 進入 任何 已經 進入 情況下 更 比次 (3 總 次 不 只是 爲 一個 具體 情況下), 程序 將 月底 和 打印 到 的 用戶 「這 隨機 發電機 不是 隨機 足夠了」。

這是我有這樣的代碼。我花了幾個小時才能進行調試。我是否以錯誤的方式接近?請讓我知道。

K = round(rand*(20)) 
flag = 0; 
counterA =0; 
    counterB=0; 
    counterC=0; 

switch K 
case {0,1,2,3,4,5,6,7} 
    fprintf('Congratulations you entered Case A\n') 
flag = 1; 
counterA = 1 
case {8,9,10,11,12,13,14} 
    fprintf('Congratulations you entered Case B\n') 
    flag =2; 
    counterB = 1 
case {15,16,17,18,19,20} 
    fprintf ('Congratulations you entered Case C\n') 
    flag = 3; 
    counterC = 1 
end 

while flag == 1 || flag == 2 || flag ==3 
    K = round(rand*(20)) 
    if K >=0 && K<=7 && flag==1 
     disp ('Invalid, that case has already been entered') 
     counterA = counterA+1 
    elseif K >=8 && K<=14 && flag ==2 
     disp ('Invalid, that case has already been entered') 
     counterB=counterB+1 
    elseif K >=15 && K<=20 && flag==3 
      disp ('Invalid, that case has already been entered') 
      counterC =counterC+1 
    elseif K >=0 && K<=7 && flag ~=1 
     counterA =counterA+1 
     flag == 1; 
     if counterA==1&&counterB~=2 ||counterA==1&&counterC~=2 
       fprintf('COngrats guacamole A\n') 
     end 
    elseif K >=8 && K<=14 && flag ~=2 
     counterB=counterB+1 
      flag == 2; 
      if counterB ==1&&counterA~=2||counterB==1&&counterC~=2 
       fprintf('COngratsavacado B\n') 
      end 

    elseif K >=15 && K<=20 && flag~=3 
     counterC=counterC+1 
     flag == 3; 
     if counterC==1&&counterA~=2||counterC==1&&counterB~=2 
      fprintf ('Congratscilantro C\n') 
     end 

    end 
    if counterA==1 && counterB==1 && counterC==1 
     flag=100; 
      disp('DONE') 
     elseif counterA == 3|| counterB==3 || counterC==3 
      disp ('That random generator wasnt random enough') 
      flag =99; 
    elseif counterA==2||counterB==2||counterC==2 
      disp('Inval') 

     end 
+3

我很抱歉提出一些完全不相干的東西,但我必須問:爲什麼你選擇在問題文本的每一行只有一個單詞? (我正在談論你如何寫它,而不是如何出現在上面)。試圖複製粘貼有些奇怪的結果嗎? –

+0

rand是一個以矩陣維度爲參數的函數。我想你的意思是'round(rand(1)* 20)'。 – engineerC

+0

@CaptainMurphy'rand'和'rand(1)'沒有任何區別。 – Daniel

回答

1

你的代碼的一些話:

不要使用變量名稱,如counterAcounterBcounterC,使用具有3個元素,而不是一個陣列。在這種情況下:您只需要一個總限制,因此一個變量就足夠了。

rand*20生成0到20之間的隨機值,但使用round(rand*20)會導致0和20的概率較低。如果需要整數,請使用randi

使用「開始縮進」來清理您的代碼格式,使其更易於閱讀。

這不是一個完整的解決方案,缺少3個錯誤的部分。我想你會自己得到這個。

caseNames={'A','B','C'}; 
caseEntered=[false,false,false]; 
%while there exist a case which is not entered and limit is not reached, continue 
while ~all(caseEntered) 
    K = randi([0,20]); 
    switch K 
     case {0,1,2,3,4,5,6,7} 
      cs=1; 
     case {8,9,10,11,12,13,14} 
      cs=2; 
     case {15,16,17,18,19,20} 
      cs=3; 
    end 
    if caseEntered(cs) 
     %case has previously been entered, tdb 
    else 
     %case is entered frist time 
     fprintf('Congratulations you entered Case %s\n',caseNames{cs}); 
     caseEntered(cs)=true; 
    end 
end 
+2

我在這個答案上介於+1和-1之間。提示爲+1,居高不下爲提示-1。 – nispio

+1

對不起,居高臨下是絕對無意的。英語不是我的母語,有時我會傳達我不想要的信息。 – Daniel

+0

好的。然後+1。 :) – nispio