初心者向けC/C++演習

C・C++で文字列の母音を数える

このレッスンでは、大文字と小文字の違いを無視して、1行の文章に含まれる母音を数えます。

はじめに

母音を数える問題は、文字列の文字を1つずつたどる、文字を小文字にそろえる、文字が集合に含まれるかを調べる、という3つの技術を組み合わせたものです。英語の母音はa、e、i、o、uです。

大切なポイント

  • コンパイラの警告(compiler warning)を有効にして、すべての警告を直しましょう。
  • それぞれの値のデータ型と寿命(lifetime)をしっかり理解しましょう。
  • 入力データと配列のインデックスの範囲は必ずチェックしましょう。

CとC++のコード例

C
実行 →
main.c
#include <ctype.h>
#include <stdio.h>
#include <string.h>
int main(void) {
    const char *text = "Code Utility"; int count = 0;
    // strchr performs a compact membership check.
    for (; *text; ++text) if (strchr("aeiou", tolower((unsigned char)*text))) ++count;
    printf("vowels=%d\n", count);
}
実行結果
vowels=5
C++
実行 →
main.cpp
#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>
int main() {
    std::string text = "Code Utility";
    // count_if counts characters accepted by the predicate.
    auto vowels = std::count_if(text.begin(), text.end(), [](unsigned char c) {
        return std::string("aeiou").find(std::tolower(c)) != std::string::npos;
    });
    std::cout << "vowels=" << vowels << '\n';
}
実行結果
vowels=5

CとC++の比較

関数tolowerは各文字を小文字にするので、大文字と小文字が同じように扱われます。特殊な文字で問題が起きないよう、tolowerに渡す前に文字をunsigned charに変換しています。strchr("aeiou", ...)は、文字が母音の文字列に含まれていればNULL以外のポインタを返すので、カウンターが増えます。"Code Utility"には母音が5つあります。

C

Cは小さな手続き型の関数を使い、データがメモリ上でどう表されるかをそのまま見せます。

C++

C++は低レベルの操作もできるまま、ライブラリの型やより安全な抽象化を加えます。

発展問題

両方のバージョンを実行し、コードを書き換えて、それぞれの言語がもたらす安全性の違いを観察しましょう。

  • 不正な入力や境界の値で試しましょう。
  • 警告を増やすフラグ-Wall -Wextra -Wpedanticを付けてコンパイルしましょう。
  • 共通の宣言はヘッダーファイルに、実装は別のファイルに分けましょう。

チャレンジで練習する

このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。

すべてのチャレンジ