我不知道如何表達標題抱歉。基本上,我正在撰寫一個繪制電影院和座位的代碼。該程式要求輸入電影院的行數和座位數,然后回傳: 電影院:
1 2 3 4 5 6 7 8 9
1 S S S S S S S S S
2 S S S S S S S S S
3 S S S S S S S S S
4 S S S S S S S S S
5 S S S S S S S S S
6 S S S S S S S S S
7 S S S S S S S S S
8 S S S S S S S S S
9 S S S S S S S S S
然后程式要求用戶選擇一排和座位,并且應該輸出與上面相同的座位,但用“B”標記他們的座位:
1 2 3 4 5 6 7 8 9
1 S S S S S S S S S
2 S S S S S S S S S
3 S S S S S S S S S
4 S S S B S S S S S
5 S S S S S S S S S
6 S S S S S S S S S
7 S S S S S S S S S
8 S S S S S S S S S
9 S S S S S S S S S
除非用戶選擇第 1 行和第 1 座,否則這是正常作業的,那么這是回傳的座位:
1 2 3 4 5 6 7 8 9
1 B S S S S S S S S
2 B S S S S S S S S
3 B S S S S S S S S
4 B S S S S S S S S
5 B S S S S S S S S
6 B S S S S S S S S
7 B S S S S S S S S
8 B S S S S S S S S
9 B S S S S S S S S
我很肯定這與代碼末尾的 for 和 if 條件有關,但我對為什么它會重復列印“B”感到困惑。我也知道我以一種不好的方式嘗試了這個,但只是想了解我為什么會遇到這個問題。這是整個代碼,因此您可以在您的 IDEA 上進行測驗:
fun main(args: Array<String>) {
println("Enter the number of rows:")
val rows = readln().toInt()
println("Enter the number of seats in each row:")
val seats = readln().toInt()
val total = rows * seats
var s = 'S'
var cinemaLayout = mutableListOf<MutableList<Char>>()
val cinemaSeats = mutableListOf<Char>()
for (x in 1..seats) {
cinemaSeats.add(s)
}
for (x in 1..rows) {
cinemaLayout.add(cinemaSeats.toMutableList())
}
println("Cinema:")
print(" ")
for (x in 1..seats) {
print(x)
print(" ")
}
println()
var cleanLayout1 = " ${cinemaLayout[0].joinToString().replace("]", "\n").replace("[", "").replace(",", "")}"
for (i in 1..rows) {
println("$i$cleanLayout1")
}
println("Enter a row number:")
val selectedRow = readln().toInt()
println("Enter a seat number in that row:")
val selectedSeat = readln().toInt()
if (total < 60) {
println("Ticket price: $10")
} else if (total > 60 && selectedRow % 2 === 0 && selectedRow <= rows / 2) {
println("Ticket price: $10")
} else {
println("Ticket price: $8")
}
var indexRow = selectedRow - 1
var indexSeat = selectedSeat - 1
cinemaLayout[indexRow][indexSeat] = 'B'
println("Cinema:")
print(" ")
for (x in 1..seats) {
print(x)
print(" ")
}
println()
for (i in 0 until rows) {
if (i === indexRow) {
println(
"${i 1} ${
cinemaLayout[indexRow].joinToString().replace("]", "\n").replace("[", "").replace(",", "")
}"
)
} else {
println(
"${i 1} ${
cinemaLayout[0].joinToString().replace("]", "\n").replace("[", "").replace(",", "")
}"
)
}
}
}
uj5u.com熱心網友回復:
這是因為你總是在列印第一行,而不是indexRow
for (i in 0 until rows) {
if (i === indexRow) {
println("...cinemaLayout[indexRow]...")
} else {
println("...cinemaLayout[0]...")
}
}
因此,什么時候i是您的目標行,您列印該行 - 否則您列印第 0 行而不是i當前代表的行號。這意味著當indexRow是第一行時,您只是每次都列印第 0 行,這就是您看到它重復的原因。當它不是第一行時,您仍在為除該行之外的所有內容列印第 0行 - 當第 0 行發生更改時,它會更加明顯。
您應該列印當前行而不是第一行:
} else {
// i not 0
println("...cinemaLayout[i]...")
}
但實際上,您為什么需要關心此時此刻indexRow的情況?您的代碼在這兩種情況下都是相同的,并且您已將其添加'B'到資料中 - 您可以按原樣列印所有內容
for (i in 0 until rows) {
println("${i 1} ${ cinemaLayout[i].joinToString().replace("]", "\n").replace("[", "").replace(",", "") }")
}
或更好
cinemaLayout.forEachIndexed { index, row ->
val seats = row.joinToString()
.replace("]", "\n")
.replace("[", "")
.replace(",", "")
println("${index 1} $seats")
}
(甚至更好的方法來替換標準庫 - 只是向您展示如何更干凈地執行回圈等操作!)
uj5u.com熱心網友回復:
這里的主要問題來自于代碼組織不當。您應該提取功能,并將業務邏輯與列印邏輯分開。
cinemaLayout[0]然后,無論i我們檢查什么,您都可以更容易地注意到最后一行列印的內容。
此外,joinToString接受引數,您不必事后替換事物:joinToString(separator = "", prefix = "", postfix = "\n").
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/513784.html
標籤:科特林for循环if 语句条件语句
下一篇:C中范圍內的反向陣列
