本文提供《C++ Primer》第 6 章(函數)所有程式設計習題的完整可編譯原始碼,涵蓋函數定義、參數傳遞、遞迴、預設參數、函數重載、函數指標等核心觀念。
#include <iostream>
using namespace std;
int fact(int val) {
if (val < 0) return -1;
int ret = 1;
for (int i = 1; i != val + 1; ++i) ret *= i;
return ret;
}
int main() {
int num;
cout << "請輸入一個整數: ";
cin >> num;
cout << num << " 的階乘是: " << fact(num) << endl;
return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
double myABS(double val) {
return (val < 0) ? -val : val;
}
double myABS2(double val) { return abs(val); }
int main() {
double num;
cout << "請輸入一個數: ";
cin >> num;
cout << num << " 的絕對值是: " << myABS(num) << endl;
cout << num << " 的絕對值是: " << myABS2(num) << endl;
return 0;
}
#include <iostream>
using namespace std;
double myADD(double val1, double val2) {
static unsigned iCnt = 0;
++iCnt;
cout << "該函數已累計執行 " << iCnt << " 次" << endl;
return val1 + val2;
}
int main() {
double num1, num2;
cout << "請輸入兩個整數: ";
while (cin >> num1 >> num2) {
cout << num1 << " 與 " << num2 << " 的和: " << myADD(num1, num2) << endl;
}
return 0;
}
Chapter6.h
#ifndef CHAPTER6_H_INCLUDED
#define CHAPTER6_H_INCLUDED
int fact(int);
double myABS(double);
#endif
Chapter6.cpp
#include "Chapter6.h"
#include <cmath>
using namespace std;
double myABS(double val) { return (val < 0) ? -val : val; }
int fact(int val) {
if (val < 0) return -1;
int ret = 1;
for (int i = 1; i != val + 1; ++i) ret *= i;
return ret;
}
main.cpp
#include <iostream>
#include "Chapter6.h"
using namespace std;
int main() {
int num;
cout << "請輸入一個整數: ";
cin >> num;
cout << num << " 的階乘是: " << fact(num) << endl;
return 0;
}
#include <iostream>
using namespace std;
void mySWAP(int *p, int *q) {
int tmp = *p; *p = *q; *q = tmp;
}
int main() {
int a = 5, b = 10;
cout << "交換前: a=" << a << ", b=" << b << endl;
mySWAP(&a, &b);
cout << "交換後: a=" << a << ", b=" << b << endl;
return 0;
}
#include <iostream>
using namespace std;
void reset(int &i) { i = 0; }
int main() {
int num = 10;
cout << "重置前: num=" << num << endl;
reset(num);
cout << "重置後: num=" << num << endl;
return 0;
}
#include <iostream>
using namespace std;
void mySWAP(int &i, int &j) {
int tmp = i; i = j; j = tmp;
}
int main() {
int a = 5, b = 10;
cout << "交換前: a=" << a << ", b=" << b << endl;
mySWAP(a, b);
cout << "交換後: a=" << a << ", b=" << b << endl;
return 0;
}
#include <iostream>
using namespace std;
void a(int i) { ++i; cout << i << endl; }
void b(int &j) { ++j; cout << j << endl; }
int main() {
int s = 0, t = 10;
a(s); cout << s << endl; // s 不變
b(t); cout << t << endl; // t 變為 11
return 0;
}
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
bool HasUpper(const string& str) {
for (char c : str) if (isupper(c)) return true;
return false;
}
void ChangeToLower(string& str) {
for (char &c : str) c = tolower(c);
}
int main() {
string str;
cout << "請輸入字串: "; cin >> str;
if (HasUpper(str)) {
ChangeToLower(str);
cout << "轉換後: " << str << endl;
} else {
cout << "無大寫字母" << endl;
}
return 0;
}
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int myCompare(int val, const int *p) {
return (val > *p) ? val : *p;
}
int main() {
srand((unsigned)time(nullptr));
int a[10];
for (auto &i : a) i = rand() % 100;
int j; cout << "請輸入一個數: "; cin >> j;
cout << "較大值: " << myCompare(j, a) << endl;
return 0;
}
#include <iostream>
using namespace std;
void SwapPointer1(int *p, int *q) { // 值傳遞指標:無法交換呼叫端指標
int *temp = p; p = q; q = temp;
}
void SwapPointer2(int *p, int *q) { // 交換指向的值
int temp = *p; *p = *q; *q = temp;
}
void SwapPointer3(int *&p, int *&q) { // 引用傳遞指標:可交換呼叫端指標
int *temp = p; p = q; q = temp;
}
int main() {
int a = 5, b = 10;
int *p = &a, *q = &b;
// 測試 1
SwapPointer1(p, q);
cout << "方式1: p=" << p << " q=" << q << " *p=" << *p << " *q=" << *q << endl;
a=5; b=10; p=&a; q=&b;
// 測試 2
SwapPointer2(p, q);
cout << "方式2: p=" << p << " q=" << q << " *p=" << *p << " *q=" << *q << endl;
a=5; b=10; p=&a; q=&b;
// 測試 3
SwapPointer3(p, q);
cout << "方式3: p=" << p << " q=" << q << " *p=" << *p << " *q=" << *q << endl;
return 0;
}
#include <iostream>
#include <iterator>
using namespace std;
void print1(const int *p) { cout << *p << endl; }
void print2(const int *p, const int sz) {
for (int i = 0; i != sz; ++i) cout << p[i] << endl;
}
void print3(const int *b, const int *e) {
for (auto q = b; q != e; ++q) cout << *q << endl;
}
int main() {
int i = 0;
int j[2] = {0, 1};
print1(&i); print1(j);
print2(&i, 1); print2(j, 2);
print3(begin(j), end(j));
return 0;
}
// 6.25 串接所有參數
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char **argv) {
string str;
for (int i = 0; i != argc; ++i) str += argv[i];
cout << str << endl; return 0;
}
// 6.26 逐一列印參數
int main(int argc, char **argv) {
for (int i = 0; i != argc; ++i)
cout << "argv[" << i << "]: " << argv[i] << endl;
return 0;
}
#include <iostream>
#include <initializer_list>
using namespace std;
int iSum(initializer_list<int> il) {
int sum = 0;
for (int v : il) sum += v;
return sum;
}
int main() {
cout << iSum({1,6,9}) << endl; // 16
cout << iSum({4,5,9,18}) << endl; // 36
cout << iSum({10,10,10,10,10,10,10,10,10}) << endl; // 90
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
void print(const vector<int>& v, unsigned idx) {
unsigned sz = v.size();
#ifndef NDEBUG
cout << "[DEBUG] size=" << sz << endl;
#endif
if (!v.empty() && idx < sz) {
cout << v[idx] << endl;
print(v, idx + 1);
}
}
int main() {
vector<int> v = {1,3,5,7,9,11,13,15};
print(v, 0);
return 0;
}
#include <iostream>
#include <string>
using namespace std;
string make_plural(size_t ctr, const string& word, const string& ending = "s") {
return (ctr > 1) ? word + ending : word;
}
int main() {
cout << make_plural(1, "success", "es") << endl; // success
cout << make_plural(2, "success", "es") << endl; // successes
cout << make_plural(1, "failure") << endl; // failure
cout << make_plural(2, "failure") << endl; // failures
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
int func1(int a, int b) { return a + b; }
int func2(int a, int b) { return a - b; }
int func3(int a, int b) { return a * b; }
int func4(int a, int b) { return a / b; }
void Compute(int a, int b, int(*p)(int, int)) {
cout << p(a, b) << endl;
}
int main() {
using FuncPtr = int(*)(int, int);
vector<FuncPtr> vF = {func1, func2, func3, func4};
int i = 5, j = 10;
for (auto p : vF) Compute(i, j, p);
// 輸出: 15, -5, 50, 0
return 0;
}
using FuncPtr = int(*)(int,int); 簡化宣告(習題 6.55-6.56)。