ネストされたループ
CoddyのSwiftジャーニー「基礎」セクションの一部。レッスン 49/86。
ネストされたループとは、単に別のループの中にあるループのことです。内側のループは、外側のループの1回の反復ごとに、すべての反復を完了します。
let rows = 3
let cols = 2
for row in 1...rows {
for col in 1...cols {
print("Row \(row), Col \(col)")
}
}
// 出力:
// Row 1, Col 1
// Row 1, Col 2
// Row 2, Col 1
// Row 2, Col 2
// Row 3, Col 1
// Row 3, Col 2rowの各値に対して、内側のループは最初からやり直し、colのすべての値を1からcolsまで順に処理します。つまり、rows = 3、cols = 2の場合、内側のコードは合計6回(3 × 2)実行されます。rowsとcolsは変化しません。ループをいつ終了するかを示すだけです。
入れ子のループは、グリッド状の構造を扱ったり、パターンを生成したりするためによく使われます。
アスタリスクで簡単な長方形を出力する例を見てみましょう。
for row in 1...2 {
for col in 1...4 {
print("*", terminator: "")
}
print("") // 次の行に移る
}
// 出力:
// ****
// ****terminator: "" は print が改行を追加するのを防ぐため、アスタリスクは同じ行に表示されます。内側のループが終了した後、print("") によって次の行に移ります。
チャレンジ
簡単入力から2つの整数 rows と cols を読み取ります。入れ子になったループを使って、それぞれのセルに行番号と列番号の積を表示する数値のグリッドを出力します。
次の入力を受け取ります:
- 1行目: 行数(例:
"3") - 2行目: 列数(例:
"4")
要件:
- 行用の外側のループを使います(1から
rowsまで) - 列用の内側のループを使います(1から
colsまで) - 現在の行番号と列番号の積を出力します
- 同じ行の値はスペースで区切ります
- 各行はそれぞれ別の行に出力します
ヒント: terminator: " "を使って値を同じ行に出力し、内側のループの後にprint("")を使って次の行に移動します。
たとえば、rowsが3でcolsが4の場合、出力は次のようになります:
1 2 3 4
2 4 6 8
3 6 9 12 ループごとに新しいカウンターを使い(たとえば、行にはrow、1行内の数値にはcol)、それをrowsまたはcolsと比較します。rowsとcols自体は変更しないでください。各行でcolsを再び使う必要があります。
自分で試してみよう
let rows = Int(readLine()!)!
let cols = Int(readLine()!)!
// TODO: 以下にコードを書いてください
// ネストしたループを使って九九の表を出力してください
// 外側のループ: 行を反復処理します (1 から rows まで)
// 内側のループ: 列を反復処理します (1 から cols まで)
// row * column の積を出力してください
// 値を同じ行に出力するには print(..., terminator: " ") を使ってください
// 内側のループの後に print("") を使って次の行に移ってくださいこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Swiftプレイグラウンド