Validation 如何测试字符串输入?(戴亚洛APL)
我在做这个函数来练习控制流Validation 如何测试字符串输入?(戴亚洛APL),validation,error-handling,control-flow,apl,dyalog,Validation,Error Handling,Control Flow,Apl,Dyalog,我在做这个函数来练习控制流Happy测试一个数字是否是一个Happy数字。我还试图学习错误处理。因此,我尝试捕捉用户输入是否不是整数。尤其是当输入是字符串时。为此,我尝试合并标量测试,但无法在编辑器上进行测试,因为如果我尝试输入任何不带引号的字母,当然会出现值错误:未定义名称 此外,精通APL手册还警告不要使用Quad进行数据输入 测试输入是否为字符串的正确方法是什么?我假设用户将输入不带引号的字母 (我使用的是Dyalog APL 17.0) (我从中获取了关于如何将数字拆分为数字的代码?)
Happy
测试一个数字是否是一个Happy数字。我还试图学习错误处理。因此,我尝试捕捉用户输入是否不是整数。尤其是当输入是字符串时。为此,我尝试合并标量测试,但无法在编辑器上进行测试,因为如果我尝试输入任何不带引号的字母,当然会出现值错误:未定义名称
此外,精通APL手册还警告不要使用Quad进行数据输入
测试输入是否为字符串的正确方法是什么?我假设用户将输入不带引号的字母
(我使用的是Dyalog APL 17.0)
(我从中获取了关于如何将数字拆分为数字的代码?)
快乐
“输入一个数字”
N←⎕
氮气←N
:如果N更新了答案
不用多说,这里有一个建议的解决方案:
Happy;ok;N;N2
'Enter a Number'
ok←0
:While ~ok
N2←N←⍞ ⍝ N2=original input
ok←∧/N∊⎕D,'¯.' ⍝ allow high minus for negatives and decimal separator
(~ok)/'Please enter numeric data!'
:EndWhile
N←2⊃⎕VFI N ⍝ result of ⍞ will be text, so make it numeric
N←⍬⍴N ⍝ make it a scalar
: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'
'**********************************'
:Leave
:EndIf
:If N=1
'**********************'
'Yes!'N2'is a happy number'
'**********************'
:EndIf
:EndWhile
:EndIf
快乐;好啊N氮气
“输入一个数字”
好啊←0
:While~好的
氮气←N←⍞ ⍝ N2=原始输入
好啊←∧/N∊⎕D、 “'”⍝ 允许负数和小数分隔符使用高负数
(~ok)/“请输入数字数据!”
:EndWhile
N←2.⊃⎕vfin⍝ 结果⍞ 将是文本,因此将其设置为数字
N←⍬⍴N⍝ 让它成为标量
:如果N您应该使用⍞代码>(字符输入;)而不是⎕代码><代码>⍞代码>将为您提供用户输入的文本
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以避免跳跃
类似地,您可以通过将:EndWhile
更改为:直到N=4
来避免使用:Leave
跳转
如果您以肯定的形式陈述您的条件,代码可能更容易阅读
为了避免不必要的间距,请将输出连接起来(使用,
),而不是将其绞合(并置)
在输出之前加上⎕←代码>使其更容易识别并提高清晰度
快乐;输入;有效的;价值观NN2;FD
⎕←'输入一个数字'
输入←⍞
(有效值)←⎕VFI输入
:如果有效≡,1.
:AndIf值≡⌊价值观
N←⊃价值观
氮气←N
:如果N“Digits”。还有{Quad}A表示“Alphabet”,我感到困惑,因此这不是我在函数中用作D的D←fN
我在哪里计算N的数字?好的,我已经从手机上回复了…但是我看到了其他需要提及的事情。今天晚些时候我会更新我的teply;)好的,谢谢。我试过了。它可以工作,但它捕捉到数字,其余的函数没有执行。谢谢!我正在研究你的答案。好的,所以我认为Quade的报价只花了一点时间字符串输入。但我看到用户可以输入数字输入,但Quote Quade将其转换为字符串:chars←⍞ 123 chars 123+/chars域错误。太好了!谢谢。特别是那些无关的建议。我明天会仔细阅读。
N←⊃values
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