Вы должны использовать ⍞
( Ввод символов ; документация ) вместо ⎕
. ⍞
выдаст вам буквенный текст, введенный пользователем.
input←⍞
Затем можно использовать ⎕VFI
( Проверка и исправление ввода ; документация ) в результате для проверки числового ввода. Это даст вам вектор из двух векторов. Первый является логическим и указывается для каждого «слова» в аргументе. Второй вектор числовой, содержащий одно число на слово. Неверные слова становятся нулем.
(valid values)←⎕VFI input
Так что, если вы ищете одно число, проверьте вектор действительности, а затем вы можете проверить, является ли оно целым числом:
:If valid≢,1
:OrIf values≢⌊values
'You entered: 'N'Enter an integer'
→0
:EndIf
Наконец вы можете извлечь N
:
N←⊃values
Несколько не связанных советов
- Не забудьте локализовать переменные, перечислив их вверху, каждая из которых должна начинаться с
;
.
- Используйте
:Else
для остальной части программы вместо →0
, чтобы избежать прыжков.
- Аналогично, вы можете избежать прыжков с
:Leave
, изменив :EndWhile
на :Until N=4
.
- Ваш код может быть легче прочитать, если вы изложите свои условия в позитивном ключе.
- Чтобы избежать нежелательных интервалов, объедините выходные данные (с
,
), а не прядьте (сопоставляя) их.
- Перед выводом введите
⎕←
, чтобы упростить определение и повышение четкости.
Happy;input;valid;values;N;N2;f;D
⎕←'Enter a Number'
input←⍞
(valid values)←⎕VFI input
:If valid≡,1
:AndIf values≡⌊values
N←⊃values
N2←N
:If N<0
N←|N
⎕←'You entered',N2
⎕←'Only positive numbers can be happy'
⎕←'We will check if',N,'is happy'
N2←N
:EndIf
f←10⊥⍣¯1⊢
D←f N
N←+/D×D
:If N=1
⎕←'***************'
⎕←'Yes',N2,'is happy!'
⎕←'***************'
:Else
:While N≠1
N←+/D×D
D←f N
N←+/D×D
⎕←'N is:',N
:If N=4
⎕←'**********************************'
⎕←'Sorry!',N2,'is not a happy number'
⎕←'**********************************'
:EndIf
:If N=1
⎕←'**********************'
⎕←'Yes!',N2,'is a happy number'
⎕←'**********************'
:EndIf
:Until N=4
:EndIf
:Else
⎕←'You entered: ',input,' Enter an integer'
:EndIf