剛學完 C++ 基礎語法(變數、迴圈、函式、類別等),許多初學者面臨「無從下手」的困境。製作一個功能完整的計算機專案,能一次串聯起核心觀念:
Calculator 類別,主程式僅負責互動。| 階段 | 目標功能 | 核心練習點 |
|---|---|---|
| 1. 基礎版 | 支援 + - * / 四則運算,整數運算 | 基本語法、switch-case、函式重載 |
| 2. 進階版 | 支援小數、括號、優先序、連續運算 | 堆疊、中序轉後序演算法(Shunting-yard) |
| 3. 工程版 | 新增進位制轉換、科學函數、歷史紀錄 | 位元運算、 |
| 4. GUI 版 | 使用 Qt / wxWidgets 打造圖形介面 | 事件驅動、訊號與槽、跨平台建置 |
#include <iostream>
#include <stack>
#include <string>
#include <cctype>
int precedence(char op) {
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
return 0;
}
double applyOp(double a, double b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return b != 0 ? a / b : throw std::runtime_error("Division by zero");
}
return 0;
}
double evaluate(const std::string& tokens) {
std::stack<double> values;
std::stack<char> ops;
for (size_t i = 0; i < tokens.length(); ++i) {
if (tokens[i] == ' ') continue;
if (tokens[i] == '(') {
ops.push(tokens[i]);
} else if (std::isdigit(tokens[i]) || tokens[i] == '.') {
double val = 0;
bool decimal = false;
double factor = 0.1;
while (i < tokens.length() && (std::isdigit(tokens[i]) || tokens[i] == '.')) {
if (tokens[i] == '.') { decimal = true; }
else if (decimal) { val += (tokens[i] - '0') * factor; factor *= 0.1; }
else { val = val * 10 + (tokens[i] - '0'); }
++i;
}
--i;
values.push(val);
} else if (tokens[i] == ')') {
while (!ops.empty() && ops.top() != '(') {
double b = values.top(); values.pop();
double a = values.top(); values.pop();
char op = ops.top(); ops.pop();
values.push(applyOp(a, b, op));
}
if (!ops.empty()) ops.pop();
} else {
while (!ops.empty() && precedence(ops.top()) >= precedence(tokens[i])) {
double b = values.top(); values.pop();
double a = values.top(); values.pop();
char op = ops.top(); ops.pop();
values.push(applyOp(a, b, op));
}
ops.push(tokens[i]);
}
}
while (!ops.empty()) {
double b = values.top(); values.pop();
double a = values.top(); values.pop();
char op = ops.top(); ops.pop();
values.push(applyOp(a, b, op));
}
return values.top();
}
std::string toBase(long long n, int base) {
if (n == 0) return "0";
const char* digits = "0123456789ABCDEF";
std::string res;
bool neg = n < 0;
if (neg) n = -n;
while (n > 0) {
res.push_back(digits[n % base]);
n /= base;
}
if (neg) res.push_back('-');
std::reverse(res.begin(), res.end());
return res;
}
-Wall -Wextra -pedantic 提高代碼質量。完成計算機專案後,你將擁有可展示的作品集,並對 C++ 的記憶體模型、標準庫、專案結構有具體認知,為後續學習資料結構、演算法、系統程式打下堅實基礎。