1

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 ' '

out をピラミッド形式で表示する方法と、smalltalk で新しい行を取得する方法を教えてください。

4

3 に答える 3

5

次のコードを試してください。

|n|
Transcript cr.
n := 4.
1 to: n do: [:i |
    1 to: i do: [:j |
        Transcript show: j].
    Transcript cr].

あなたの質問に答えるには:Transcript crによって改行が取得され、それがCharactercrに送信されます。

于 2012-12-18T12:44:33.000 に答える
2

単一のキャリッジリターンで文字列を作成できます

(String with: Character cr)

ただし、文字列を連結するのではなく、使用方法を学ぶ必要がありStreamます。メッセージ writeStream、#nextPut:、#nextPutAll:、およびクラス WriteStream を参照してください。

編集既製のソリューションを提供したくありませんでしたが、他にも多くのソリューションがあるため、文字列に固執する可能性のあるソリューションを次に示します。あなたの質問が示唆するように、 #out は独自の CR を生成すると思います。私自身の解決策は、各ループで文字列全体を再作成するのではなく、 #inject:into: を蓄積することです。

(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: よりも高レベルの Collection イテレータについて、いくつかの視点が開かれることを願っています。

于 2012-12-18T12:38:41.080 に答える
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
于 2012-12-18T13:22:08.710 に答える