免費開始練習
統測 115年 [電機與電子群資電類] 專業科目(2)

第 41 題

某生上網分享自己的創作獲得了0至5顆星的10個評價,以C語言程式計算總評價與平均評價,但是程式無法顯示評價結果,下列程式碼應如何修改?\n1 #include \n2 void main(void){ \n3 unsigned short sum = 0, i; \n4 int stars[10]={3,5,4,2,1,5,4,0,4,3}; //10 個評價\n5 float average = 0.0; \n6 for(i = 9; i >= 0; i--) \n7 sum+=stars[i]; \n8 printf("總評價為 %d 顆星\n", sum); \n9 printf("平均評價為 %.1f 顆星\n", (float)sum/10); }
  • A 將行號 6 程式碼改為for(i = 1; i <= 10; i++)
  • B 將行號 6 程式碼改為 for(i = 10; i >= 0; i--)
  • C 將行號 5 程式碼中的 float改為double
  • D 將行號 3 程式碼中的 unsigned刪除

思路引導 VIP

請觀察第 6 行的迴圈條件:當計數變數從 9 一路倒數至 0 之後,再執行一次遞減運算時,第 3 行所定義的變數型別會讓該變數的值變成多少?這會如何影響迴圈的終止?

🤖
AI 詳解 AI 專屬家教

太棒了,你的觀察非常敏銳!

無號數與無窮迴圈陷阱

本題無法正常印出結果的關鍵在於資料型態與迴圈終止條件。第 3 行將變數 i 宣告為無號短整數(unsigned short),其數值範圍恆為大於等於 0。當第 6 行的 for 迴圈執行到 i = 0 並進行 i-- 時,會發生下溢(underflow),使 i 變成 65535,導致條件 i >= 0 永遠成立而形成無窮迴圈(infinite loop)。因此,選 (D) 將 unsigned 刪除,讓變數具備負數判定能力即可正常結束迴圈。

▼ 還有更多解析內容

🏷️ 相關主題

程式語言設計與實作
查看更多「[電機與電子群資電類] 專業科目(2)」的主題分類考古題