C++で文字列内の最初の大文字を見つける方法(反復処理・再帰処理)
このチュートリアルでは、C++を使って与えられた文字列の中から最初の大文字を見つける方法を解説します。反復処理(ループ)と再帰処理の2つのアプローチを取り上げます。
まずは具体例から見ていきましょう。
入力: Tutorialspoint
出力: T
方法1:反復処理(イテレーティブ)で解く
反復処理を使った解法の手順は以下の通りです。
- 文字列を初期化します。
- 文字列を先頭から順に走査します。
isupper関数を使って、現在の文字が大文字かどうかを判定します。- 大文字が見つかった時点で、その文字を返します。
サンプルコード
#include <bits/stdc++.h>
using namespace std;
char firstUpperCaseChar(string str) {
for (int i = 0; i < str.length(); i++) {
if (isupper(str[i])) {
return str[i];
}
}
return 0; // 大文字が見つからなかった場合
}
int main() {
string str = "Tutorialspoint";
char result = firstUpperCaseChar(str);
if (result == 0) {
cout << "No uppercase letter" << endl;
} else {
cout << result << endl;
}
return 0;
}実行結果
上記のコードを実行すると、次の出力が得られます。
T
このコードでは、文字列「Tutorialspoint」の先頭から1文字ずつチェックし、最初に大文字だった「T」を返しています。大文字が1つも存在しない場合は 0 を返すため、「No uppercase letter」と表示される仕組みです。
方法2:再帰処理(リカーシブ)で解く
次に、再帰処理を使った解法の手順です。
- 文字列を初期化します。
- 文字列とインデックスを引数に取る再帰関数を作成します。
- 現在の文字が文字列の終端(
'\0')であれば0を返します。 - 現在の文字が大文字であれば、その文字を返します。
- それ以外の場合は、インデックスを1つ進めて自分自身を再度呼び出します。
サンプルコード
#include <bits/stdc++.h>
using namespace std;
char firstUpperCaseChar(string str, int i = 0) {
// 文字列の終端に到達した場合
if (str[i] == '\0') {
return 0;
}
// 現在の文字が大文字の場合
if (isupper(str[i])) {
return str[i];
}
// 次の文字へ再帰的に処理を進める
return firstUpperCaseChar(str, i + 1);
}
int main() {
string str = "Tutorialspoint";
char result = firstUpperCaseChar(str);
if (result == 0) {
cout << "No uppercase letter";
} else {
cout << result << endl;
}
return 0;
}実行結果
上記のコードを実行すると、次の出力が得られます。
T
再帰版では、デフォルト引数 i = 0 を使うことで、呼び出し側はインデックスを意識せずに関数を利用できます。条件を満たすまで自分自身を呼び出し続けるシンプルな構造になっています。
まとめ
本記事では、C++で文字列内の最初の大文字を見つける2つの方法——反復処理と再帰処理——を紹介しました。どちらも isupper 関数を活用したシンプルな実装であり、小規模な文字列であればどちらを選んでも問題ありません。ただし、非常に長い文字列を扱う場合は、再帰呼び出しによるスタック消費を考慮して、反復処理の方が安全と言えます。
このチュートリアルについて質問がある場合は、コメント欄でお気軽にお尋ねください。
-
C++で二分木の完全ノードを数える方法(反復法と再帰法)
本記事では、二分木に含まれる「完全ノード(フルノード)」の数を、反復法と再帰法の2つのアプローチで求める方法を解説します。完全ノードとは、左と右の子を両方持ち、どちらの子もNULLでないノードのことです。つまり、ちょうど2つの子を持つノードのみが完全ノードとして扱われます。 二分木はデータの格納に用いられる特殊なデータ構造です。「各ノードが最大2つの子までしか持てない」という制約があり、ソート済み配列並みの高速な検索性能と、連結リスト並みの高速な挿入・削除性能を兼ね備えているのが特徴です。なお、1つ以上の子を持つ非葉ノードは「親ノード」とも呼ばれます。 二分木の基本構造は以下の通りです。
-
C++で二分木の半ノード(ハーフノード)を数える方法【反復・再帰の両アプローチ】
本記事では、二分木(バイナリツリー)に含まれる「半ノード(ハーフノード)」の数を、反復処理と再帰処理の2つのアプローチで求める方法を解説します。半ノードとは?半ノードとは、子を1つだけ持ち、もう片方の子がNULL(空)になっているノードのことです。なお、子をまったく持たない葉ノードは半ノードには含まれない点に注意してください。二分木はデータの格納に使われる特殊なデータ構造です。各ノードが最大2つの子を持つという制約があり、ソート済み配列並みの高速な検索と、連結リスト並みの高速な挿入・削除の両方を実現できるというメリットがあります。二分木の基本的な構造は以下の通りです。具体例入力:出力: カウン