首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

HDU 2090 算菜價:C++ 標準輸入流與累加求和實戰

     編輯:關於C語言

題目背景

HDU 2090「算菜價」是一道經典的輸入處理練習題。任務為讀取多組「菜名、數量、單價」,計算總價並保留一位小數輸出。重點考察 scanf 循環讀取直到 EOF 的模式與浮點數累加精度控制。

核心解法邏輯

  1. 定義 char name[20] 存儲菜名(不參與計算)、double num, price 存儲數量與單價、double sum = 0 累加總價。
  2. 使用 while (scanf("%s %lf %lf", name, &num, &price) != EOF) 循環讀取,直到輸入結束。
  3. 每輪累加 sum += num * price。
  4. 最終 printf("%.1lf\n", sum) 輸出,%.1lf 強制保留一位小數。

C++ 完整代碼

#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 時也會進入循環,導致錯誤累加。
  • 輸出格式不符:未保留一位小數、多輸出空格或換行,導致 Presentation Error。

擴展思考

  • 若輸入行包含空格菜名(如 "Spicy Beef"),需改用 fgets + sscanf 或 cin.getline 處理。
  • C++ iostream 寫法: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 系列輸入輸出題的基礎功力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved