作業#29 — 畫星星蘋果 — nested loop(巢狀迴圈) 練習
Published in
9 min readMay 24, 2023
目的: 學習使用 for 迴圈。
作業來源:
基本題
- 畫 2 種 Apple,比方有紅色跟綠色。
A. 底線
@IBAction func changeApple(_ sender: UISlider) {
var content = ""
sender.value = sender.value.rounded()
let row = Int(sender.value)
numberLabel.text = "\(row)"
for i in 1...row {
if i <= row-1 {
for _ in 1...row {
content.append("🍎")
}
} else {
for _ in 1...row {
content.append("🍏")
}
}
content.append("\n")
}
appleLabel.text = content
}
B. 對角線
@IBAction func changeApple(_ sender: UISlider) {
var content = ""
sender.value = sender.value.rounded()
let row = Int(sender.value)
numberLabel.text = "\(row)"
for i in 1...row {
for j in 1...row {
if i != j {
content.append("🍎")
} else {
content.append("🍏")
}
}
content.append("\n")
}
appleLabel.text = content
}
C. 棋盤格
@IBAction func changeApple(_ sender: UISlider) {
var content = ""
sender.value = sender.value.rounded()
let row = Int(sender.value)
numberLabel.text = "\(row)"
for i in 1...row {
for j in 1...row {
if (i+j) % 2 == 0 {
content.append("🍎")
} else {
content.append("🍏")
}
}
content.append("\n")
}
appleLabel.text = content
}
進階題
- 從 segmented control 選擇形狀,有正方形,三角形,金字塔和菱形四種。
- 從 slider 改變數量。
A. 正方形
@IBAction func changeApple(_ sender: UISlider) {
var content = ""
sender.value = sender.value.rounded()
let row = Int(sender.value)
numberLabel.text = "\(row)"
for _ in 1...row {
for _ in 1...row {
content += "🍎"
}
content += "\n"
}
appleLabel.text = content
}
B. 三角形
@IBAction func changeApple(_ sender: UISlider) {
var content = ""
sender.value = sender.value.rounded()
let row = Int(sender.value)
numberLabel.text = "\(row)"
for i in 1...row {
for _ in 1 ... i {
content += "🍎"
}
content += "\n"
}
appleLabel.text = content
}
C. 金字塔
@IBAction func changeApple(_ sender: UISlider) {
var content = ""
sender.value = sender.value.rounded()
let row = Int(sender.value)
numberLabel.text = "\(row)"
for i in 1...row {
// 避免 lowerBound > upperBound
if row > i {
for _ in 1...(row-i) {
content += "🥝"
}
}
for _ in 1 ... 2*i-1 {
content += "🍎"
}
content += "\n"
}
appleLabel.text = content
}
*參考 Peter 的解答後,發現 //避免 lowerBound > upperBound
這一段更好的寫法是使用 ..<
:
//我原本的答案:
if row > i {
for _ in 1...(row-i) {
content += "🥝"
}
}
//Peter 的解答:
for _ in i..<count {
content += "🥝"
}
D. 菱形
@IBAction func changeApple(_ sender: UISlider) {
var content = ""
sender.value = sender.value.rounded()
let row = Int(sender.value)
numberLabel.text = "\(row)"
for i in 1...2*row-1 {
// 避免 lowerBound > upperBound
if row > i {
for _ in 1...(row-i) {
content += "🥝"
}
} else if i > row {
for _ in 1...(i-row) {
content += "🥝"
}
}
if i <= row {
for _ in 1 ... 2*i-1 {
content += "🍎"
}
} else {
for _ in 1 ... (2*(2*row-i)-1) {
content += "🍎"
}
}
content += "\n"
}
appleLabel.text = content
}
*同參考 Peter 的解答後,發現更好的寫法可以先假設兩個變數 奇異果總數
及 app蘋果總數
,兩個分別的變動為 遞減1/遞增1
及 遞增2/遞減2
:
//Peter 的解答:
var content = ""
let count = 5
var greenCount = count - 1
var appleCount = 1
for i in 1...count*2-1 {
for _ in 0..<greenCount {
content += "🍏"
}
for _ in 1...appleCount {
content += "🍎"
}
if i < count {
greenCount -= 1
appleCount += 2
} else {
greenCount += 1
appleCount -= 2
}
content += "\n"
}
E. 每排顯示不同圖案,搭配 array。
a. 三角形
let emoji = ["","🧛♀️","👻","🎅","🧙♀️","🦸♀️"]
@IBAction func changeApple(_ sender: UISlider) {
var content = ""
sender.value = sender.value.rounded()
let row = Int(sender.value)
numberLabel.text = "\(row)"
for i in 1...row {
for _ in 1...i {
content.append(emoji[i])
}
content.append("\n")
}
appleLabel.text = content
}
b. 正方形
let emoji = ["","🧛♀️","👻","🎅","🧙♀️","🦸♀️"]
@IBAction func changeApple(_ sender: UISlider) {
var content = ""
sender.value = sender.value.rounded()
let row = Int(sender.value)
numberLabel.text = "\(row)"
for i in 1...row {
for _ in 1...row {
content.append(emoji[i])
}
content.append("\n")
}
appleLabel.text = content
}