文字列内の母音・子音・数字・空白の数をカウントするC++プログラム
文字列内の各要素を数えるとは
C++における文字列は、ヌル文字('\0')で終端された1次元の文字配列です。1つの文字列の中には、複数の母音(vowels)、子音(consonants)、数字(digits)、そして空白文字(white spaces)が含まれていることがあります。
例えば、次のような文字列を考えてみましょう。
String: There are 7 colours in the rainbow Vowels: 12 Consonants: 15 Digits: 1 White spaces: 6
このように、文字列を解析することで、それぞれの種類の文字が何回出現するかを求めることができます。以下では、文字列内の母音・子音・数字・空白の数をカウントするC++プログラムを紹介します。
サンプルプログラム
#include <iostream>
using namespace std;
int main() {
char str[] = {"Abracadabra 123"};
int vowels, consonants, digits, spaces;
vowels = consonants = digits = spaces = 0;
for(int i = 0; str[i]!='\0'; ++i) {
if(str[i]=='a' || str[i]=='e' || str[i]=='i' ||
str[i]=='o' || str[i]=='u' || str[i]=='A' ||
str[i]=='E' || str[i]=='I' || str[i]=='O' ||
str[i]=='U') {
++vowels;
} else if((str[i]>='a'&& str[i]<='z') || (str[i]>='A'&& str[i]<='Z')) {
++consonants;
} else if(str[i]>='0' && str[i]<='9') {
++digits;
} else if (str[i]==' ') {
++spaces;
}
}
cout << "The string is: " << str << endl;
cout << "Vowels: " << vowels << endl;
cout << "Consonants: " << consonants << endl;
cout << "Digits: " << digits << endl;
cout << "White spaces: " << spaces << endl;
return 0;
}
実行結果
The string is: Abracadabra 123 Vowels: 5 Consonants: 6 Digits: 3 White spaces: 1
プログラムの解説
このプログラムでは、まず vowels(母音)、consonants(子音)、digits(数字)、spaces(空白)という4つの整数型変数を宣言し、すべて0で初期化しています。これらの変数は、それぞれの文字の出現回数を格納するために使われます。
次に、forループを使って文字列の先頭から終端のヌル文字に達するまで、1文字ずつ順番に調べていきます。判定の流れは以下のとおりです。
- 文字が a、e、i、o、u のいずれか(大文字・小文字両方)であれば、
vowelsを1増やします。 - そうでなく、文字が英字(a〜z または A〜Z)であれば、
consonantsを1増やします。 - そうでなく、文字が数字(0〜9)であれば、
digitsを1増やします。 - そうでなく、文字が半角スペースであれば、
spacesを1増やします。
この処理を行っている部分のコードは次のようになります。
for(int i = 0; str[i]!='\0'; ++i) {
if(str[i]=='a' || str[i]=='e' || str[i]=='i' ||
str[i]=='o' || str[i]=='u' || str[i]=='A' ||
str[i]=='E' || str[i]=='I' || str[i]=='O' ||
str[i]=='U') {
++vowels;
} else if((str[i]>='a'&& str[i]<='z') || (str[i]>='A'&& str[i]<='Z')) {
++consonants;
} else if(str[i]>='0' && str[i]<='9') {
++digits;
} else if (str[i]==' ') {
++spaces;
}
}
if-else if文による分岐では、条件は上から順に評価されるため、母音以外の英字だけが子音としてカウントされ、英字でも数字でもないものだけが空白として判定されます。この仕組みにより、同じ文字が重複して数えられることはありません。
結果の表示
すべての文字の走査が終わったら、cout文を使って元の文字列と、カウントした母音・子音・数字・空白の数を出力します。実行結果は以下のとおりです。
The string is: Abracadabra 123 Vowels: 5 Consonants: 6 Digits: 3 White spaces: 1
このように、単純なループと条件分岐を組み合わせるだけで、文字列に含まれる各種文字の数を簡単に集計することができます。
-
C++で指定した桁数と桁の合計を満たす最大の数を求める方法
問題の概要 この問題では、2つの整数値が与えられます。1つは数値の桁数を表す N、もう1つは桁の合計を表す sum です。目的は、指定された桁数と桁の合計を満たす最大の数を見つけることです。 具体例で問題を確認しましょう。 入力 : N = 3, sum = 15 出力 : 960 3桁の数のうち、桁の合計が15になる最大の数は 960 です(9 + 6 + 0 = 15)。 解法1: 全探索(ブルートフォース) 最も単純なアプローチは、N桁のすべての数を大きい方から小さい方へ順に走査し、桁の合計を計算して、sum と一致した時点でその数を返す方法です。 実装例 #include <io
-
C++で文字列の部分文字列の総数を求める方法を解説
この記事では、与えられた文字列から作成できる空でない部分文字列の個数を求める方法について解説します。入力 : string = "moon" 出力 : 10 説明 : 部分文字列は m、o、o、n、mo、oo、on、moo、oon、moon の 10 個です。 入力 : string = "yellow" 出力 : 21解法のアプローチ文字列の長さを n とします。上の例からも分かるように、考えられるすべての部分文字列の個数を求めるには、長さ n、(n-1)、(n-2)、(n-3)、……2、1 の部分文字列の個数を順に加算していく必要があります。部分文