#45917: Python解題思路與程式碼 (Made by Gemini)


william000000000 (unknown)

學校 : 國立臺灣科技大學
編號 : 191545
來源 : [140.118.204.15]
最後登入時間 :
2025-05-05 14:51:37
b964. 1. 成績指標 -- 2016年3月apcs | From: [118.232.105.6] | 發表日期 : 2025-04-28 18:13

題目分析

本題要求我們處理一個班級的考試成績(人數不固定),完成以下任務:

  1. 讀取成績:讀入全班所有學生的分數。

  2. 排序輸出:將所有分數由小到大排序後輸出。

  3. 找出指標分數

    • 找出所有「不及格」(低於 60 分)學生中的「最高分數」。

    • 找出所有「及格」(等於或高於 60 分)學生中的「最低分數」。

  4. 處理特殊情況

    • 如果所有學生都及格(找不到不及格分數),則輸出 "best case" 而非最高不及格分數。

    • 如果所有學生都不及格(找不到及格分數),則輸出 "worst case" 而非最低及格分數。

程式邏輯說明

程式的執行流程可以分為以下幾個主要步驟:

  1. 初始化

    • 建立三個空的列表(List):

      • N: 用於儲存所有輸入的原始成績。

      • FAIL: 用於儲存所有不及格的成績。

      • PASS: 用於儲存所有及格的成績。

  2. 讀取輸入

    • 程式讀取第一行輸入(學生人數),但在目前的解法中未使用這個值。

    • 程式讀取第二行包含所有成績的文字,使用 input().split() 將這行文字按空格分割,得到一個包含各個成績(以字串形式存在)的列表 grades

  3. 儲存與轉換成績

    • 使用 for 迴圈遍歷 grades 列表中的每一個字串。

    • 在迴圈中,使用 int() 將每個成績字串轉換成整數。

    • 將轉換後的整數成績使用 append() 方法加入到 N 列表中。完成後,N 列表就包含了所有學生的整數成績。

  4. 排序與首次輸出

    • 使用內建函數 sorted(N)N 列表中的所有成績進行升序排序,並將排序結果儲存在新的列表 sort_num 中。sorted() 不會改變原始的 N 列表。

    • 使用 for 迴圈遍歷排序後的 sort_num 列表。

    • 在迴圈中,使用 print(score, end=' ') 輸出每個成績。end=' ' 參數使得輸出時成績之間以空格分隔,而不是預設的換行。

    • 迴圈結束後,使用 print() 輸出一個換行符,確保後續的輸出從新的一行開始,符合題目要求的輸出格式。

  5. 成績分類

    • 再次使用 for 迴圈遍歷排序後的 sort_num 列表。

    • 在迴圈中,使用 if i < 60: 判斷當前成績 i 是否小於 60。

    • 如果小於 60,則將該成績 append()FAIL 列表。

    • 如果不小於 60(即等於或大於 60),則將該成績 append()PASS 列表。

    • 這個步驟完成後,FAIL 列表包含了所有不及格的成績,PASS 列表包含了所有及格的成績。

  6. 輸出最高不及格分數(或 best case)

    • 使用 if FAIL: 來檢查 FAIL 列表是否包含元素。在 Python 中,一個非空列表在布林判斷中被視為 True,空列表則為 False

    • 如果 FAIL 列表不為空(即有不及格學生),則執行 print(max(FAIL))max() 函數會找出列表中的最大值,也就是最高的不及格分數。

    • 如果 FAIL 列表為空(即所有學生都及格),則執行 else 區塊,輸出 "best case"。

  7. 輸出最低及格分數(或 worst case)

    • 使用 if PASS: 來檢查 PASS 列表是否包含元素。

    • 如果 PASS 列表不為空(即有及格學生),則執行 print(min(PASS))min() 函數會找出列表中的最小值,也就是最低的及格分數。

    • 如果 PASS 列表為空(即所有學生都不及格),則執行 else 區塊,輸出 "worst case"。

總結

這個程式透過列表儲存、排序、分類數據,並利用 max()min() 函數以及條件判斷,有效地解決了題目要求,找出了關鍵的成績指標,並正確處理了所有學生都及格或都不及格的特殊情況。程式碼結構清晰,符合題目要求的輸入輸出格式。

----------------------------------------------程式碼----------------------------------------------

# 初始化三個列表:
# N 用於存放所有輸入的成績
# FAIL 用於存放不及格的成績 (小於 60 分)
# PASS 用於存放及格的成績 (大於或等於 60 分)
N = []
FAIL = []
PASS = []

# 讀取第一行輸入:學生人數
# 雖然題目要求讀取學生人數,但在這個解法中此變數實際上並未使用,
# 因為程式是根據讀取的成績數量來處理,而不是預設的人數。
# num = int(input()) # 可以選擇性地保留或移除此行

# 讀取第二行輸入:包含所有學生分數的字串,分數之間以空格分隔
# 使用 input().split() 將輸入的字串按空格分割成一個字串列表
grades = input().split()


# --- 第一階段:讀取、轉換並儲存所有成績 ---
# 遍歷 grades 列表中的每個成績(此時仍為字串格式)
for grade in grades:
  # 將字串格式的成績轉換為整數
  g = int(grade)
  # 將轉換後的整數成績添加到 N 列表中,以收集所有成績
  N.append(g)


# --- 第二階段:排序並輸出所有成績 ---
# 使用 sorted() 函數對 N 列表中的所有成績進行升序排序
# sorted() 會返回一個新的排序後的列表,原始的 N 列表不變
sort_num = sorted(N)

# 遍歷排序後的成績列表 sort_num
for score in sort_num:
  # 輸出每個成績,並設置 end=' '
  # 這會讓每個成績後面接一個空格,而不是預設的換行符
  print(score, end = ' ')
# 在所有成績輸出完畢後,輸出一個換行符,使後續輸出從新的一行開始
print()


# --- 第三階段:區分及格與不及格成績 ---
# 再次遍歷排序後的成績列表 sort_num
for i in sort_num:
  # 判斷成績是否小於 60 (不及格標準)
  if i < 60:
    # 如果是不及格分數,則將其添加到 FAIL 列表中
    FAIL.append(i)
  # 否則 (成績大於或等於 60,即為及格)
  else:
    # 將及格分數添加到 PASS 列表中
    PASS.append(i)


# --- 第四階段:找出並輸出最高不及格分數 (或 "best case") ---
# 判斷 FAIL 列表是否為空。在 Python 中,`if 列表:` 會在列表有元素時判斷為 True
if FAIL: # 若列表不為空,表示存在不及格分數
  # 使用 max() 函數找出 FAIL 列表中的最大值 (即最高的不及格分數) 並輸出
  print(max(FAIL))
else: # 若列表為空,表示所有學生都及格
  # 輸出 "best case"
  print("best case")


# --- 第五階段:找出並輸出最低及格分數 (或 "worst case") ---
# 判斷 PASS 列表是否為空
if PASS: # 若列表不為空,表示存在及格分數
  # 使用 min() 函數找出 PASS 列表中的最小值 (即最低的及格分數) 並輸出
  print(min(PASS))
else: # 若列表為空,表示所有學生都不及格
  # 輸出 "worst case"
  print("worst case")

 
ZeroJudge Forum