根据perl手册for last(http://perldoc.perl.org/functions/last.html),last不能用于打破do {}循环,但它没有提到替代方案.我正在维护的脚本具有以下结构:
do {
...
if (...)
{
...
last;
}
} while (...);
Run Code Online (Sandbox Code Playgroud)
而且我很确定他想要循环结束,但它实际上退出了当前子程序,所以last如果有更好的方法可以推荐,我需要更改或重构整个循环.
在Peter Seibel的Practical Common Lisp中,他给出了这个例子:
(do ((nums nil) (i 1 (1+ i)))
((> i 10) (nreverse nums))
(push i nums))
Run Code Online (Sandbox Code Playgroud)
我可以看到它是如何工作的,在循环中使用nums但不给它一个步骤形式.为什么要将num放在变量定义中而不是这样做:
(let (nums) (do ((i 1 (+ i 1)))
((> i 10) (nreverse nums))
(push i nums)))
Run Code Online (Sandbox Code Playgroud)
我确信这是一个很好的理由,但我还没有得到它.
我试图让一个随机数生成器生成一个1到9之间的数字串,如果它生成一个8,它应该显示最后8,然后停止生成.
到目前为止,它打印1 2 3 4 5 6 7 8,但它不会生成随机的数字串,因此我需要知道如何使循环实际生成如上所述的随机数,感谢您的帮助!
使用Javascript
// 5. BONUS CHALLENGE: Write a while loop that builds a string of random
integers
// between 0 and 9. Stop building the string when the number 8 comes up.
// Be sure that 8 does print as the last character. The resulting string
// will be a random length.
print('5th Loop:');
text = '';
// Write 5th loop here:
function getRandomNumber( upper ) {
var num = Math.floor(Math.random() * …Run Code Online (Sandbox Code Playgroud) CODE SNIPPET 1和CODE SNIPPET 2有什么区别?
;CODE SNIPPET 1
(define i 0)
(do ()
((= i 5)) ; Two sets of parentheses
(display i)
(set! i (+ i 1)))
;CODE SNIPPET 2
(define i 0)
(do ()
(= i 5) ; One set of parentheses
(display i)
(set! i (+ i 1)))
Run Code Online (Sandbox Code Playgroud)
第一个代码片段产生01234,第二个代码片段产生5.发生了什么?额外的一组括号有什么作用?另外,我见过[(= i 50)]用而不是((= i 5)).有区别吗?谢谢!
很多年前我使用过FORTRAN,并且最近负责维护一个旧的FORTRAN程序(F77).以下代码不熟悉:
READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) NUM_WORDS,
. ( BUFFER(BIX), BIX=1, NUM_WORDS )
Run Code Online (Sandbox Code Playgroud)
回顾一些在线论坛发现,让我感到困惑的部分,即延续线,是一个隐含的循环.由于我的程序在这里给我带来麻烦,我想将其转换为传统的DO循环.转换它也可能有助于下一个从现在起5年后冷却这个东西的可怜的邋!!无论如何,我对DO循环等效的最佳猜测是
READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) NUM_WORDS
DO BIX=1, NUM_WORDS
READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) BUFFER(BIX)
ENDDO
Run Code Online (Sandbox Code Playgroud)
但是,当我只进行此更改时,正在运行的测试用例停止工作.我仍然觉得这里发生的是两个不同的READ(第一个获得NUM_WORDS,第二个循环数据),所以我尝试了一个不那么激烈的变化,将其转换为两个语句但保留隐含的循环:
READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) NUM_WORDS
READ(FILE_LOG_UNIT, IOSTAT=FILE_STATUS) ( BUFFER(BIX), BIX=1, NUM_WORDS )
Run Code Online (Sandbox Code Playgroud)
但只是这种变化也会导致良好的测试用例失败.在我的两个改动中,NUM_WORDS的值正如预期的那样,所以看起来循环就是它失败的地方.
那么,原始隐含循环的等效DO循环是什么?或者我完全走错了路?
谢谢
我很惊讶你不能把一个数组成员作为do循环的控制变量,如下所示:
program test
integer, dimension(2) :: i
do i(1) = 1, 3
do i(2) = 1, 3
! anything here
write(*, *) i
end do
end do
end program
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么不允许这样做?
编辑: 或是允许但我做错了?
来自ifort v 11.1的错误消息是:
test.f90(4): error #5082: Syntax error, found IDENTIFIER 'I' when expecting one of: ( % : . = =>
do i(1) = 1, 3
-------^
test.f90(4): error #5082: Syntax error, found ',' when expecting one of: <END-OF-STATEMENT> ;
do i(1) = 1, 3
---------------^
test.f90(5): error …Run Code Online (Sandbox Code Playgroud) 我试图在powerpoint VBA中创建一个弹出问题,到目前为止一切顺利.但是下面的代码似乎不起作用.想法是你得到一个价值的弹出框,输入100 - 200(含).但必须输入一个值或可以接受failed作为输入.无法取消输入框或无效/空响应.内循环(循环1)似乎工作正常,但如果我输入150它不会终止循环2而是继续前进,除非类型失败但它停止任何文本而不是仅停止"failed".
Sub OnSlideShowPageChange(ByVal SSW As SlideShowWindow)
'Declare Variables
Dim xType, xLimitHi, xLimitLo, xPrompt As String
Dim InputvarTemp As String
Dim msgResult As Integer
xLimitHi = 200
xLimitLo = 100
xPrompt = "Enter Value between 100 and 200 (Inclusive)"
Do 'loop 2 check within limit or failed
msgResult = vbNo
Do 'loop 1 check Empty / Null or Cancelled input
InputvarTemp = InputBox(xPrompt, xPrompt)
If StrPtr(InputvarTemp) = 0 Then ' Check if …Run Code Online (Sandbox Code Playgroud) 以下过程在方案r6rs和Racket中都有效:
;; create a list of all the numbers from 1 to n
(define (make-nums n)
(do [(x n (- x 1)) (lst (list) (cons x lst))]
((= x 0)
lst)))
Run Code Online (Sandbox Code Playgroud)
我已经为r6rs和Racket测试了它并且它确实正常工作,但我只知道DrRacket肯定.
我的问题是,如果保证了一步表达式((- x 1)和(cons x lst)在这种情况下)将按顺序进行评估.如果不能保证,那么我的程序不是很稳定.
我没有在任何一种语言的标准中看到任何指定这一点的东西,但我在这里问,因为当我测试时它按顺序进行了评估.
例如,我想以 2 为增量从 1 循环到 500。但是,对于每 8 个循环,我想跳过接下来的 18 个循环(使 do 变量增加 18)。我怎么做?
我的代码是:
event = 0
do i = 1,500,2
event = event + 1
if (event .eq. 8) then
i = i + 18
event = 0
endif
enddo
Run Code Online (Sandbox Code Playgroud)
但是,我收到错误消息:“DO 主体中的 do 变量不应出现在变量定义上下文中”。基本上我不能改变循环中的变量“i”。那么我应该如何编写代码来实现它呢?
谢谢。
我想循环N次迭代,但是在特定条件下应该"跳过"一些迭代.我知道我可以使用goto语句来完成它,例如:
do i = 1, N
if condition(i) goto 14
! Execute my iteration if condition(i) is false
14 continue
end do
Run Code Online (Sandbox Code Playgroud)
但我有点害怕这些goto陈述,我想知道是否有另一种解决方案(我使用的是fortran 90,但对任何解决方案都感兴趣,即使它需要更新的版本).