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

C++ Primer 第 6 章函數習題完整參考解答(原始碼)

     編輯:關於C++

本文提供《C++ Primer》第 6 章(函數)所有程式設計習題的完整可編譯原始碼,涵蓋函數定義、參數傳遞、遞迴、預設參數、函數重載、函數指標等核心觀念。

習題 6.4:階乘函數

#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;
}

習題 6.5:絕對值函數

#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;
}

習題 6.6:帶計數器的加法函數

#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;
}

習題 6.8-6.9:分離介面與實作

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;
}

習題 6.10:指標參數交換

#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;
}

習題 6.11:引用參數重置

#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;
}

習題 6.12:引用參數交換

#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;
}

習題 6.13:值傳遞 vs 引用傳遞差異

#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;
}

習題 6.17:字串大小寫檢查與轉換

#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;
}

習題 6.21:比較整數與陣列首元素

#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;
}

習題 6.22:三種指標交換方式比較

#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;
}

習題 6.23:指標陣列列印的三種介面

#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-6.26:命令列參數處理

// 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;
}

習題 6.27:initializer_list 可變參數求和

#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;
}

習題 6.33/6.47:遞迴列印 vector(含除錯宏)

#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;
}

習題 6.38:預設參數與複數形式

#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;
}

習題 6.51-6.56:函數指標與 vector 存儲

#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;
}

重點觀念總結

  • static 區域變數:函數呼叫間保持狀態(習題 6.6)。
  • 引用參數 vs 指標參數:引用語法更簡潔,指標可為 nullptr(習題 6.10-6.13, 6.22)。
  • const 引用參數:避免拷貝大型物件,承諾不修改(習題 6.17)。
  • 函數重載解析:引數型別轉換規則(習題 6.51)。
  • 函數指標型別別名:using FuncPtr = int(*)(int,int); 簡化宣告(習題 6.55-6.56)。
  • initializer_list:型別安全的可變長度參數(習題 6.27)。
  • 除錯宏 NDEBUG:發布版自動移除除碼碼(習題 6.47)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved