如何在smalltalk中获得新的一行?

时间:2012-12-18 11:33:32

标签: smalltalk

我想使用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中获得新行的方式

3 个答案:

答案 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