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

C・C++で文字列の英字の出現回数を数える

このレッスンでは、26個の要素を持つ配列を使って、文字列の中で各小文字が何回出てくるかを数えます。

はじめに

度数表は、各文字とカウンターを結び付けます。小文字はaからzまでの26文字しかないので、26個の要素の配列を使えます。0番目の要素がaを、1番目の要素がbを数え、以下同様です。

大切なポイント

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

CとC++のコード例

C
実行 →
main.c
#include <stdio.h>
int main(void) {
    const char *text = "banana"; int counts[26] = {0};
    // Convert each lowercase letter to an array index.
    for (; *text; ++text) ++counts[*text - 'a'];
    for (int i = 0; i < 26; ++i) if (counts[i]) printf("%c=%d\n", 'a' + i, counts[i]);
}
実行結果
a=3
b=1
n=2
C++
実行 →
main.cpp
#include <array>
#include <iostream>
#include <string>
int main() {
    std::string text = "banana"; std::array<int, 26> counts{};
    // Convert each lowercase letter to an array index.
    for (char character : text) ++counts[character - 'a'];
    for (size_t i = 0; i < counts.size(); ++i) if (counts[i]) std::cout << char('a' + i) << '=' << counts[i] << '\n';
}
実行結果
a=3
b=1
n=2

CとC++の比較

英字のコードは連続しているので、式*text - 'a'で英字を0から25のインデックスに変換できます。プログラムはその位置のカウンターを増やし、2つ目のループでカウンターが0でない文字だけを表示します。"banana"なら、結果はa=3、b=1、n=2です。

C

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

C++

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

発展問題

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

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

チャレンジで練習する

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

すべてのチャレンジ