C++: 練習:関数

最終更新:2026-08-31

ここまでのレッスンで関数、パラメータ、スコープ、再帰を学んだ。今度はそれらを組み合わせて実際のプログラムを作る。


▶ サンプル 1:数値ライブラリ(難易度 ⭐⭐)

CPP
#include <iostream>
#include <cmath>

int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
int multiply(int a, int b) { return a * b; }
int divide(int a, int b) { return b != 0 ? a / b : 0; }
int power(int base, int exp) {
    int result = 1;
    for (int i = 0; i < exp; i++) result *= base;
    return result;
}
int factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

int main() {
    std::cout << "5 + 3 = " << add(5, 3) << std::endl;
    std::cout << "5 - 3 = " << subtract(5, 3) << std::endl;
    std::cout << "5 * 3 = " << multiply(5, 3) << std::endl;
    std::cout << "5 / 3 = " << divide(5, 3) << std::endl;
    std::cout << "2^10 = " << power(2, 10) << std::endl;
    std::cout << "5! = " << factorial(5) << std::endl;
    return 0;
}
▶ 試してみよう

▶ サンプル 2:テキスト解析ツール(難易度 ⭐⭐⭐)

CPP
#include <iostream>
#include <string>
#include <cctype>

int countWords(const std::string& text) {
    int count = 0;
    bool inWord = false;
    for (char c : text) {
        if (isalpha(c)) {
            if (!inWord) { count++; inWord = true; }
        } else {
            inWord = false;
        }
    }
    return count;
}

int countLetters(const std::string& text) {
    int count = 0;
    for (char c : text) {
        if (isalpha(c)) count++;
    }
    return count;
}

std::string toUpperCase(std::string text) {
    for (char& c : text) c = toupper(c);
    return text;
}

std::string toLowerCase(std::string text) {
    for (char& c : text) c = tolower(c);
    return text;
}

int main() {
    std::string text;
    std::cout << "テキストを入力: ";
    std::getline(std::cin, text);
    
    std::cout << "単語数: " << countWords(text) << std::endl;
    std::cout << "文字数: " << countLetters(text) << std::endl;
    std::cout << "大文字: " << toUpperCase(text) << std::endl;
    std::cout << "小文字: " << toLowerCase(text) << std::endl;
    
    return 0;
}
▶ 試してみよう

▶ サンプル 3:簡易暗号化(難易度 ⭐⭐)

CPP
#include <iostream>
#include <string>

std::string encrypt(std::string text, int shift) {
    for (char& c : text) {
        if (isalpha(c)) {
            char base = isupper(c) ? 'A' : 'a';
            c = (c - base + shift) % 26 + base;
        }
    }
    return text;
}

std::string decrypt(std::string text, int shift) {
    return encrypt(text, 26 - shift);
}

int main() {
    std::string message;
    int shift;
    
    std::cout << "メッセージ: ";
    std::getline(std::cin, message);
    std::cout << "シフト: ";
    std::cin >> shift;
    
    std::string encrypted = encrypt(message, shift);
    std::string decrypted = decrypt(encrypted, shift);
    
    std::cout << "暗号化: " << encrypted << std::endl;
    std::cout << "復号化: " << decrypted << std::endl;
    
    return 0;
}
▶ 試してみよう

▶ サンプル 4:ゲームスコア管理(難易度 ⭐⭐⭐)

CPP
#include <iostream>
#include <string>

struct Player {
    std::string name;
    int score;
};

void addScore(Player players[], int& count, const std::string& name, int score) {
    players[count].name = name;
    players[count].score = score;
    count++;
}

void showLeaderboard(const Player players[], int count) {
    std::cout << "\n=== リーダーボード ===" << std::endl;
    for (int i = 0; i < count; i++) {
        std::cout << i + 1 << ". " << players[i].name << ": " << players[i].score << std::endl;
    }
}

void sortLeaderboard(Player players[], int count) {
    for (int i = 0; i < count - 1; i++) {
        for (int j = i + 1; j < count; j++) {
            if (players[j].score > players[i].score) {
                Player temp = players[i];
                players[i] = players[j];
                players[j] = temp;
            }
        }
    }
}

int main() {
    Player players[10];
    int count = 0;
    
    addScore(players, count, "Alice", 100);
    addScore(players, count, "Bob", 150);
    addScore(players, count, "Charlie", 120);
    
    sortLeaderboard(players, count);
    showLeaderboard(players, count);
    
    return 0;
}
▶ 試してみよう

❓ よくある質問

Q 関数はどのくらい長くできる?
A 「1つのこと」を「1画面」に収める。関数が長すぎるなら分割。
Q 再帰とループはどちらが良い?
A 問題による。再帰はコードをシンプルにできるが、パフォーマンスが悪い場合がある。
Q どうやって関数をテストする?
A 各関数を単独でテスト——異なる入力で呼び出し、期待する出力を確認。

📖 まとめ


📝 練習問題

  1. 初級(難易度 ⭐): 数値ライブラリにisPrime関数を追加。

  2. 中級(難易度 ⭐⭐): テキスト解析ツールに「最頻文字」機能を追加。

  3. 上級(難易度 ⭐⭐⭐): ゲームスコア管理に「プレイヤー検索」「スコア更新」機能を追加。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%