Лучший способ заставить пользователя ввести целое число в Matlab - PullRequest
5 голосов
/ 08 марта 2011

Я пишу простую программу на Matlab и задаюсь вопросом, как лучше всего убедиться, что вводимое пользователем значение является правильным целым числом.

Я сейчас использую это:

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

Однако я действительно знаю, что должен быть лучший способ, потому что это не всегда работает.Я также хотел бы добавить проверку ошибок, в том числе блок try catch.Я новичок в 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 ]

7 голосов
/ 08 марта 2011

Следующее может использоваться непосредственно в вашем коде и проверять нецелочисленный ввод, включая пустые, бесконечные и мнимые значения:

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))

EDIT

Эти тесты для любых целочисленных значений. Чтобы ограничить действительные значения положительными целыми числами, добавьте num_dice > 0, как в @ ответ MajorApus .

Вы можете использовать вышеупомянутое, чтобы заставить пользователя вводить целое число, выполняя циклы, пока они не уступят вашим требованиям:

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
6 голосов
/ 08 марта 2011

Попробуйте, измените его при необходимости.

function answer = isint(n)

if size(n) == [1 1]
    answer = isreal(n) && isnumeric(n) && round(n) == n &&  n >0;
else
    answer = false;
end
2 голосов
/ 27 июля 2015

Один простой способ проверить свойства входов функции / пользователя - использовать функцию validateattributes. Я не знаю, когда эта функция была впервые представлена; возможно, его не было, когда вопрос был задан впервые, но я думаю, что стоит упомянуть, хотя вопрос старше.

Если вы хотите проверить, что введенный пользователем ввод представляет собой скалярное, положительное, ненулевое, действительное значение целого числа любого числового типа данных, вы можете сделать это, используя блок try-catch вот так:

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.

0 голосов
/ 26 июля 2015

Попробуйте это.Я думаю, что это проще:)

% 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
0 голосов
/ 08 марта 2011

Возьмите входные данные как строку и используйте sscanf (http://www.mathworks.com/help/techdoc/ref/sscanf.html), чтобы определить, было ли преобразовано действительное целое число из текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...