Matlab要求整数循环

时间:2016-04-27 14:57:40

标签: matlab random prompt

我正在创建一个模拟随机游走的程序,它要求用户输入整数步骤来进行游走。

对此的提示使用与此非常类似的代码:

    **% Ask user for a number.
    defaultValue = 45;
    titleBar = 'Enter a value';
    userPrompt = 'Enter the integer';
    caUserInput = inputdlg(userPrompt, titleBar, 1,{num2str(defaultValue)});
    if isempty(caUserInput),return,end; % Bail out if they clicked Cancel.
    % Round to nearest integer in case they entered a floating point number.
    integerValue = round(str2double(cell2mat(caUserInput)));
    % Check for a valid integer.
    if isnan(integerValue)
    % They didn't enter a number.  
    % They clicked Cancel, or entered a character, symbols, or something else not allowed.
    integerValue = defaultValue;
    message = sprintf('I said it had to be an integer.\nI will use %d and continue.', integerValue);
    uiwait(warndlg(message));
    end**

但是,如果用户第一次没有输入整数,我希望它再次显示“输入值”提示,即4.4。

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

if (mod(integerValue,1) == 0)
如果integerValue是整数,

将评估为true。只需用这个逻辑来增加你的if语句。您可能需要考虑更改为使用while循环,以便用户可以多次输入错误输入。

答案 1 :(得分:1)

第一个答案对于检查整数值是完全正确的,但是为了解决“再次显示提示”问题,你可以使用循环调节它来获得你想要的确切数据类型:

caUserInput = nan; %or anything worng for that matter
while isempty(caUserInput) || isnan(caUserInput)
    caUserInput = inputdlg(userPrompt, titleBar, 1,{num2str(defaultValue)});
end 

如果你想要的话,你可以用更加花哨的风格用不同的参数线重新开始它:

inputiswrong = 1; %or anything worng for that matter
while inputiswrong 
    inputiswrong = 0;
    caUserInput = inputdlg(userPrompt, titleBar, 1,{num2str(defaultValue)});
   if isempty(caUserInput )
      userPrompt = 'Try again with an input';
      inputiswrong = 1;
   end
   if isnan(caUserInput )
      userPrompt = 'not really a number';
      inputiswrong = 1;
   end
   %and so on
end 

在这两种情况下你应该考虑将caUserInput转换为你可以使用的东西,我认为inputdlg返回一个单元格,所以可能是inputdlg()周围的cell2mat()。

答案 2 :(得分:1)

请记住,MATLAB中未指定的输入默认为双精度。例如,a=3不是整数。所以你应该考虑两种情况:

整数类型

如果您在MATLAB中讨论整数类型,最简单的方法是使用MATLAB的isinteger函数:

tf = isinteger(A)

例如:

isinteger(4.4)
=
    0

如前所述,3不是整数:

isinteger(3)
=
    0

但实际上这个是整数:

isinteger(uint8(3))
=
    1

重复输入查询也可以在while循环中轻松使用相同的功能

while ~isinteger(a)
    disp('enter an integer');
    ....
end

常量双精度,无小数

但是如果你认为常规常量输入是整数,你可以将它们转换为整数并将结果与​​原始值进行比较:

while a ~= double(int64(a))
    disp('enter an integer');
    ....
end

int64将double类型转换为整数,double将其转换为double。如果在此过程中数字保持不变,那么您可以认为它是一个整数。

针对您特定计划的建议

我会使用fix函数去掉小数部分。通常当您收到包含十进制值的双精度数时,主要意图是浮点前的数字。因此,在许多算法中,通常的做法是使用fix将给定数字的每个元素四舍五入到最接近零的整数。