HDU 2090「算菜價」是一道經典的輸入處理練習題。任務為讀取多組「菜名、數量、單價」,計算總價並保留一位小數輸出。重點考察 scanf 循環讀取直到 EOF 的模式與浮點數累加精度控制。
char name[20] 存儲菜名(不參與計算)、double num, price 存儲數量與單價、double sum = 0 累加總價。while (scanf("%s %lf %lf", name, &num, &price) != EOF) 循環讀取,直到輸入結束。sum += num * price。printf("%.1lf\n", sum) 輸出,%.1lf 強制保留一位小數。#include <cstdio>
using namespace std;
int main() {
double num, price;
char name[20];
double sum = 0;
while (scanf("%s %lf %lf", name, &num, &price) != EOF) {
sum += num * price;
}
printf("%.1lf\n", sum);
return 0;
}
| 技術點 | 說明 |
|---|---|
scanf 返回值 | 成功讀取返回匹配項數(此處為 3),失敗或 EOF 返回 EOF(通常為 -1),作為循環終止條件最可靠。 |
%lf 格式符 | scanf 讀取 double 必須用 %lf;printf 輸出 double 可用 %f 或 %lf(C99 標準)。 |
| 浮點數精度 | 題目僅涉及加法與乘法,double 精度足夠;若涉及貨幣高精度計算,建議用整數(分為單位)或定點數庫。 |
| 輸入結束 | OJ 系統通常以檔案重定向輸入,Ctrl+D (Linux/Mac) 或 Ctrl+Z (Windows) 模擬 EOF。 |
scanf("%s %lf %lf\n", ...) 末尾 \n 會導致讀取阻塞,應移除。while(scanf(...)) 在讀取失敗返回 0 時也會進入循環,導致錯誤累加。fgets + sscanf 或 cin.getline 處理。while (cin >> name >> num >> price) sum += num * price; 配合 cout << fixed << setprecision(1) << sum << endl;。fast I/O(ios::sync_with_stdio(false); cin.tie(nullptr);)加速。HDU 2090 是「流式輸入處理 + 浮點累加 + 格式化輸出」的標準範本題。熟練掌握 scanf != EOF 循環模式與 printf 精度控制,是解決 OJ 系列輸入輸出題的基礎功力。