2013-04-10 5 views
0

Я пишу функцию в Matlab, которая предлагает пользователю выбрать инструмент (.wav-файл), который будет читаться с использованием функции wavread.Matlab User Input/While Loop

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

До сих пор моя функция выглядит следующим образом:

prompt = 'Select Instrument, Piano: [P], Fork: [F], Violin: [V], Gameboy: [G]'; 
str = input(prompt,'s'); 
if isempty(str) 
    str = 't'; 
end 

while(str ~= 'P') || (str ~= 'F') || (str ~= 'V') || (str ~= 'G') 
    prompt = 'Invalid Selection! Choose, Piano: [P], Fork: [F], Violin: [V], Gameboy: [G]'; 
    str = input(prompt,'s'); 
    if isempty(str) 
     str = 't'; 
    elseif (str == 'P') || (str == 'F') || (str == 'V') || (str == 'G') 
     break 
    end 
end 

При появлении во время цикла, он успешно запрашивает у пользователя и читает в .wav, но если пользователь нажимает P, F, V или G на первой строке, то цикл в то время как все еще используется и "Invalid Sel... " по-прежнему отображается ...

Я не знаю, как я должен это осуществление ....

ответ

3

это потому, что логика не так

(str ~= 'P') || (str ~= 'F') || (str ~= 'V') || (str ~= 'G') 

всегда верно, как ул всегда будет отличаться от любого P, F, V или G. Она не может быть такой же, как и все из них, что вы спрашиваете.

Это должно быть

str ~= 'P' && str ~= 'F' && str ~= 'V' && str ~= 'G' 

или

~(str == 'P' || str == 'F' || str == 'V' || str == 'G') 

или в здравом MATLAB

~any('PFVG' == str) 
+0

О, конечно. Теперь я чувствую себя глупо. Спасибо, что поняли это. Проблема решена: D Также '~ any ('PFVG' == str)' действительно классная строка кода, я собираюсь использовать это. Спасибо за ваше время. – Reanimation

1

как об использовании strcmp?

str = input(prompt,'s'); 
if isempty(str) 
    str = 't'; 
end 

while ~any(strcmp(str,{'P' 'F' 'V' 'G'})) %|| (str ~= 'F') || (str ~= 'V') || (str ~= 'G') 
    prompt = 'Invalid Selection! Choose, Piano: [P], Fork: [F], Violin: [V], Gameboy: [G]'; 
    str = input(prompt,'s'); 
    if isempty(str) 
     str = 't'; 
    elseif (str == 'P') || (str == 'F') || (str == 'V') || (str == 'G') 
     break 
    end 
end 
+0

Я раньше не видел 'strcmp'. Я собираюсь прочитать это сейчас. Спасибо за ваше время: D – Reanimation