我想使用smalltalk代码
以下列格式显示数字 1
1 2
1 2 3
1 2 3 4
我写了以下代码
| i j y k |
i :=1.
j :=1.
y:= ('y' at: 1 put: $ )out.
(i<=4)ifTrue: [
i to: 4 by:1 do:[:i |
(j<=i)ifTrue: [
j to: i by: 1 do:[:j |
( j print++y print)out.
]
]
]
]
当我执行上述程序时,它以下列格式显示数字
输出:
1 ' '
1 ' '
2 ' '
1 ' '
2 ' '
3 ' '
1 ' '
2 ' '
3 ' '
4 ' '
任何人都可以帮助我帮助我以金字塔形式展示出来以及在smalltalk中获得新行的方式
答案 0 :(得分:4)
尝试以下代码。
|n|
Transcript cr.
n := 4.
1 to: n do: [:i |
1 to: i do: [:j |
Transcript show: j].
Transcript cr].
回答你的问题:你会通过Transcript cr获得一个换行符,然后将其发送给Character cr。
答案 1 :(得分:1)
您可以使用
创建一个带回车的字符串(String with: Character cr)
但是你应该学习如何使用Stream
而不是连接字符串,请参阅消息writeStream,#nextPut:,#nextPutAll:和class WriteStream
编辑我不想提供现成的解决方案,但是由于你还有很多其他解决方案,这里有一个可能会坚持使用字符串。我认为#out会根据您的问题建议生成自己的CR。我自己的解决方案就是#inject:into:积累而不是在每个循环中重新创建整个String:
(1 to: 4) inject: String new into: [:str :num |
(str , num printString , ' ') out; yourself]
或使用传统的成绩单:
(1 to: 4) inject: String new into: [:str :num |
| newStr |
newStr := str , num printString , ' '.
Transcript cr; show: newStr.
newStr]
我希望它打开一些关于更高级别的集合迭代器的观点,而不是愚蠢的#to:do:
答案 2 :(得分:0)
| max resultString |
max := 5 .
resultString := String new.
1 to: max do: [ :line |
1 to: line do: [ :number |
resultString add: number asString, ' '
].
resultString lf.
].
resultString