2011-03-08 16 views
5

Matlab'da basit bir program yazıyorum ve kullanıcının girdiği değerin doğru bir tam sayı olduğundan emin olmanın en iyi yolunu merak ediyorum. Şu anda bu kullanıyorumBir kullanıcının Matlab'da bir tamsayı girmesini zorlaştırmanın en iyi yolu

: Gerçekten iyi bir yolu olmalı biliyorum Ancak

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

bu her zaman işe yaramaz çünkü. Ayrıca bir try catch bloğu kontrol etmek için hata eklemek istiyorum. Matlab'a yeniyim, bu yüzden bu konudaki her şey harika olurdu.

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 

Bu çalışıyor gibi görünüyor. Bununla ilgili yanlış bir şey var mı?

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

yukarıda sadece sayısal alan için doğru şekilde çalışır: Tamsayımı

+0

Deneme bloğunuzun "yakalama" kısmı hiçbir zaman girilmeyecektir. Eğer 'while' testi başarısız olursa, döngü durur, yani."catch" u tetiklemek için bir hatayla karşılaşılmadı. –

+0

İstisnalar giriş fonksiyonundan mümkün oldu. Üzerinde '<' veya '-' gibi bir şey girerseniz ve bir değişkene koymaya çalışırsanız, bir çökme olur. Şimdi sscanf – Tanner

+0

kullanarak düzelttim. [ROLL] fonksiyonuna ilgi duyabilirsiniz (http://www.mathworks.com/matlabcentral/fileexchange/27327-a-dice-roller-for-matlab) Matlab için bir zar silindiri. – Jonas

cevap

7

, boş sonsuz ve hayali değerler de dahil olmak üzere kod ve olmayan tamsayı girişi karşı kontroller doğrudan kullanılabilecek aşağıdaki kabul edilen yanıt ile tanımlanır giriş. Bir çok boyutlu dizi kullanabileceğiniz yalnızca tamsayılar içerip içermediğini test etmek için:

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

DÜZENLEME

Bu test herhangi tamsayı değerleri için. Geçerli değerleri pozitif tamsayılarla sınırlamak için @MajorApus's answer numaralı gibi bir num_dice > 0 ekleyin.

bunlar taleplerine yenik kadar döngü tarafından girişine kullanıcıya bir tamsayı zorlamak için yukarıdaki kullanabilirsiniz:

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 
+0

Evet Girdiğiniz> 0 bölümü ile birlikte kendi kullanımınızı zaten yaptım. Şimdi giriş satırında geçersiz girdiye karşı nasıl korunmalıyım? Bir istisna atıldığında girişi yeniden sormanın en iyi yolu nedir? – Tanner

+0

@Tanner: Kullanıcıya geçersiz giriş girdiğinde girdiyi yeniden soran, yanıtımıma örnek bir kullanım ekledim. –

+0

Harika teşekkürler. Orijinal soruma daha fazla kod ekledim, bu şekilde yapmanın yanlış bir yanı var mı? Matlab hakkında bir şey beni öldürüyor. C, C++, C#, Java, VB bunlardan herhangi birini bir saat önce yapmıştım ama matlab değil! – Tanner

0

bir dize olarak girdi alın ve sscanf (http kullanın: //www.mathworks .com/help/techdoc/ref/sscanf.html) geçerli bir tamsayı metinden dönüştürülmüş olup olmadığını belirlemek için.

+0

Aslında bunu yapıyordum, ama ben çirkin almak için çirkin görünüyordu, sonra bir tamsayı ayrıştırıyor ve sonra durumu kontrol ediyor, sonra bir süre döngüsüne atlıyor – Tanner

+0

Hiçbir zaman estetiğin bir sorun olduğunu söylemedin :) Unutmuştum "_________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ – jonsca

+0

Evet Kabul ettiğim cevapta bir tane buldum. Şimdi girişi gerçekten ayrıştırmak için sscanf'e geçtiniz. Bir operatör (+ - vb.) Girdiyseniz giriş ile bir istisna atardı – Tanner

6

Bunu deneyin, gerektiği gibi değiştirin.

function answer = isint(n) 

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

Bunu deneyin. Bunun fonksiyonu/kullanıcı tarafından sağlanan girdilerin özelliklerini kontrol etmek daha basit :)

% 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 
2

kolay bir yolu validateattributes fonksiyonunu kullanmaktır olduğunu düşünüyorum. Bu fonksiyonun ne zaman kullanıma sunulduğunu bilmiyorum; Soruyu ilk sorduğunda mevcut olmayabilir, ama sanırım soru daha eski olsa bile söz ediyor. Eğer bir kullanıcı tarafından sağlanan girdi bir sayıl olup olmadığını kontrol etmek istiyorsanız

, sıfır olmayan herhangi bir sayısal veri türünün gerçek değerli tamsayı, bunu kullanarak olumlu yapabilirsiniz try-catch block şöyle:

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 

Kullanıcı tarafından sağlanan bir giriş yerine işlev girişleriyle uğraşıyorsanız, inputParser sınıfından da yararlanabilirsiniz.

İlgili konular