结合使用switch语句和while循环

时间:2013-11-20 21:40:29

标签: matlab loops for-loop switch-statement

我正在尝试完成以下任务:

创建 一个 脚本 那 将 反复 创建 一个 随机 整数 ķ 在 该 范围 的 0 至 20 直到 一切 案件 具有 是 进入 在 最小 一旦。 您 有 3 可能 案例。 案件 一个 是 进入 什么时候 该 范围 的 该 随机 整数 ķ 是 之间 要么 等于 至 0 和 7。 案件 乙 是 进入 什么时候 该 范围 的 该 随机 整数 ķ 是 之间 要么 等于 至 8 和 14。 案件 C 是 进入 什么时候 该 范围 的 该 随机 整数 ķ 是 之间 要么 等于 至 15 和 20。 规则: 什么时候 一个 案件 是 进入 您 必须 打印 至 该 用户 “恭喜 您 进入 案件 (一个, B, 要么 C)”。 您 能够 只要 输入 每 案件 一旦。 如果 该 程序 尝试 至 输入 该 相同 案件 更多 比 一旦, 您 必须 打印。 “无效, 那 案件 具有 已经 是 进入”。 该 程序 将 结束 一旦 所有 该 例 有 是 进入 和 该 程序 将 打印 “好 工作, 您 有 进入 所有 案件”。 如果 该 程序 尝试 至 输入 任何 已经 进入 例 更多 比 3 时 (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

1 个答案:

答案 0 :(得分: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