强制用户在Matlab中输入整数的最佳方法

时间:2011-03-08 18:38:53

标签: matlab

我正在用Matlab编写一个简单的程序,我想知道确保用户输入的值是一个正确的整数的最佳方法。

我目前正在使用它:

while((num_dice < 1) || isempty(num_dice))
    num_dice = input('Enter the number of dice to roll: ');
end

但是我真的知道必须有更好的方法,因为这不会一直有效。我还想添加错误检查ala try try块。我是Matlab的新手,所以对此的任何输入都会很棒。

EDIT2:

try
    while(~isinteger(num_dice) || (num_dice < 1))
        num_dice = sscanf(input('Enter the number of dice to roll: ', 's'), '%d');
    end

    while(~isinteger(faces) || (faces < 1))
        faces = sscanf(input('Enter the number of faces each die has: ', 's'), '%d');
    end

    while(~isinteger(rolls) || (rolls < 1))
        rolls = sscanf(input('Enter the number of trials: ', 's'), '%d');
    end
catch
    disp('Invalid number!')
end

这似乎有效。这有什么明显的错误吗? isinteger由接受的答案定义

5 个答案:

答案 0 :(得分:7)

以下内容可直接在您的代码中使用,并检查非整数输入,包括空值,无限值和虚数值:

isInteger = ~isempty(num_dice) ...
            && isnumeric(num_dice) ...
            && isreal(num_dice) ...
            && isfinite(num_dice) ...
            && (num_dice == fix(num_dice));

以上内容仅适用于标量输入。要测试多维数组是否只包含整数,可以使用:

isInteger = ~isempty(x) ...
            && isnumeric(x) ...
            && isreal(x) ...
            && all(isfinite(x)) ...
            && all(x == fix(x))

修改

这些测试任何整数值。要将有效值限制为正整数,请在@MajorApus's answer中添加num_dice > 0

您可以使用上述方法强制用户通过循环输入一个整数,直到它们屈服于您的需求:

while ~(~isempty(num_dice) ...
            && isnumeric(num_dice) ...
            && isreal(num_dice) ...
            && isfinite(num_dice) ...
            && (num_dice == fix(num_dice)) ...
            && (num_dice > 0))
    num_dice = input('Enter the number of dice to roll: ');
end

答案 1 :(得分:6)

试试这个,根据需要进行修改。

function answer = isint(n)

if size(n) == [1 1]
    answer = isreal(n) && isnumeric(n) && round(n) == n &&  n >0;
else
    answer = false;
end

答案 2 :(得分:2)

检查函数/用户提供的输入属性的一种简单方法是使用validateattributes函数。我不知道这个功能何时首次推出;当问题第一次被问到时,它可能不存在,但我认为即使这个问题较老,也要提及。

如果要检查用户提供的输入是任何数值数据类型的标量,正数,非零,实数整数,您可以使用try-catch block这样做:

invalidInput = true;
while invalidInput
  num_dice = input('Enter the number of dice to roll: ');
  try
    validateattributes(num_dice, {'numeric'}, ...
                       {'scalar', 'integer', 'real', 'finite', 'positive'})
    invalidInput = false;
  catch
    disp('Invalid input. Please reenter...');
  end
end

如果您正在处理函数输入而不是用户提供的输入,您还可以使用inputParser类。

答案 3 :(得分:0)

将输入作为字符串并使用sscanf(http://www.mathworks.com/help/techdoc/ref/sscanf.html)确定是否从文本转换了有效整数。

答案 4 :(得分:-1)

试试这个。我认为这更简单:)

% Assume false input at the beginning
checkDice = 0;  

% As long as the input is false, stay in the loop
while ~checkDice
    % Take the input as a string
    strDice = input('Enter the number of dice to roll: ', 's');
    % Convert string to number
    dice = str2num(strDice);

    % Length of dice will be 1 iff input is a single number
    if length(dice) ~=1
        checkDice = 0;
    else
        % Search for a positive integer
        checkDice = ((dice>=1) && dice == floor(dice));   
    end

end