C++ で配列と文字列を操作する

C++C++Beginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、C++ で配列と文字列を操作する方法を学びます。この実験では、1次元配列の作成と初期化、配列要素のアクセスと変更、2次元配列の実装、C スタイルの文字列と String クラスの使用、配列要素のソート、線形探索の実行、および getline() を使った文字列入力の処理など、幅広いトピックが扱われます。これらの実践的な演習を通じて、C++ プログラミングにおける基本的な配列と文字列の操作を深く理解するようになります。

1次元配列の作成と初期化

このステップでは、C++ で1次元配列を作成して初期化する方法を学びます。配列は、同じ型の複数の要素を連続したメモリ領域に格納できる基本的なデータ構造です。

WebIDE を開き、~/project ディレクトリに arrays_intro.cpp という新しいファイルを作成します。配列を初期化するさまざまな方法を探りましょう。

touch ~/project/arrays_intro.cpp

arrays_intro.cpp ファイルに以下のコードを追加します。

#include <iostream>

int main() {
    // 方法1: 特定のサイズで配列を宣言して初期化する
    int numbers[5] = {10, 20, 30, 40, 50};

    // 方法2: コンパイラに配列のサイズを決定させる
    int scores[] = {85, 92, 78, 95, 88};

    // 方法3: 初期値をゼロで初期化する
    int zeros[6] = {0};

    // 方法4: 配列を作成して後で初期化する
    int temperatures[4];
    temperatures[0] = 72;
    temperatures[1] = 68;
    temperatures[2] = 75;
    temperatures[3] = 80;

    // 配列要素を表示する
    std::cout << "First method - numbers array:" << std::endl;
    for (int i = 0; i < 5; i++) {
        std::cout << "Element " << i << ": " << numbers[i] << std::endl;
    }

    return 0;
}

配列の初期化を分解してみましょう。

  1. int numbers[5] = {10, 20, 30, 40, 50};: 配列のサイズを明示的に定義し、すべての要素を初期化する
  2. int scores[] = {85, 92, 78, 95, 88};: コンパイラに配列のサイズを決定させる
  3. int zeros[6] = {0};: すべての要素をゼロで初期化する
  4. インデックスを使って値を手動で割り当てる temperatures[index] = value

プログラムをコンパイルして実行します。

g++ arrays_intro.cpp -o arrays_intro
./arrays_intro

出力例:

First method - numbers array:
Element 0: 10
Element 1: 20
Element 2: 30
Element 3: 40
Element 4: 50

配列に関する要点:

  • 配列は宣言すると固定サイズになります
  • 配列のインデックスは0から始まります
  • 配列を複数の方法で初期化できます
  • 常に配列の範囲を超えないようにしてください

インデックスを使った配列要素のアクセスと変更

このステップでは、C++ でインデックスを使って配列要素をアクセスして変更する方法を学びます。前のステップで行った配列の初期化を基に、個々の配列要素とどのようにやり取りするかを探ります。

WebIDE を開き、~/project ディレクトリに array_indexing.cpp という新しいファイルを作成します。

touch ~/project/array_indexing.cpp

array_indexing.cpp ファイルに以下のコードを追加します。

#include <iostream>

int main() {
    // 学生の点数の配列を作成する
    int scores[5] = {85, 92, 78, 95, 88};

    // インデックスを使って配列要素をアクセスする
    std::cout << "First student's score: " << scores[0] << std::endl;
    std::cout << "Third student's score: " << scores[2] << std::endl;

    // 配列要素を変更する
    std::cout << "Original second student's score: " << scores[1] << std::endl;
    scores[1] = 96; // 2番目の学生の点数を更新する
    std::cout << "Updated second student's score: " << scores[1] << std::endl;

    // 配列要素の合計を計算する
    int total_score = 0;
    for (int i = 0; i < 5; i++) {
        total_score += scores[i];
    }
    std::cout << "Total class score: " << total_score << std::endl;

    // 平均点の計算
    double average_score = static_cast<double>(total_score) / 5;
    std::cout << "Average class score: " << average_score << std::endl;

    return 0;
}

配列インデックスに関する要点:

  • 配列のインデックスは0から始まります
  • 要素をアクセスするには角かっこ [] を使います
  • インデックスを使って要素を読み取り、変更することができます
  • 配列の範囲外のインデックスにアクセスしないように注意してください

プログラムをコンパイルして実行します。

g++ array_indexing.cpp -o array_indexing
./array_indexing

出力例:

First student's score: 85
Third student's score: 78
Original second student's score: 92
Updated second student's score: 96
Total class score: 442
Average class score: 88.4

重要なインデックスのルール:

  • 最初の要素はインデックス0にあります
  • 最後の要素はインデックス(配列サイズ - 1)にあります
  • 配列範囲外のインデックスにアクセスすると未定義の動作が起こります

行列用の2次元配列の実装

このステップでは、C++ で2次元配列を作成して操作する方法を学びます。2次元配列は、行と列がある表や行列のようなもので、グリッド状の構造でデータを格納して操作することができます。

WebIDE を開き、~/project ディレクトリに matrix_arrays.cpp という新しいファイルを作成します。

touch ~/project/matrix_arrays.cpp

matrix_arrays.cpp ファイルに以下のコードを追加します。

#include <iostream>

int main() {
    // 方法1: 3x3の行列を宣言して初期化する
    int matrix[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    // 方法2: 行列を宣言して後で初期化する
    int grades[2][4];
    grades[0][0] = 85;
    grades[0][1] = 92;
    grades[0][2] = 78;
    grades[0][3] = 95;
    grades[1][0] = 88;
    grades[1][1] = 90;
    grades[1][2] = 82;
    grades[1][3] = 87;

    // 最初の行列を表示する
    std::cout << "First Matrix:" << std::endl;
    for (int row = 0; row < 3; row++) {
        for (int col = 0; col < 3; col++) {
            std::cout << matrix[row][col] << " ";
        }
        std::cout << std::endl;
    }

    // 点数の行列を表示する
    std::cout << "\nGrades Matrix:" << std::endl;
    for (int row = 0; row < 2; row++) {
        for (int col = 0; col < 4; col++) {
            std::cout << grades[row][col] << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

2次元配列に関する要点:

  • 要素にアクセスするには2つのインデックスを使います: array[row][column]
  • 最初のインデックスは行を表し、2番目のインデックスは列を表します
  • 複数の方法で初期化できます
  • 行と列を反復処理するためには、通常ネストしたループが使われます

プログラムをコンパイルして実行します。

g++ matrix_arrays.cpp -o matrix_arrays
./matrix_arrays

出力例:

First Matrix:
1 2 3
4 5 6
7 8 9

Grades Matrix:
85 92 78 95
88 90 82 87

重要な2次元配列の概念:

  • 配列は2次元以上の次元を持つことができます
  • 各行は異なる列数を持つことができます
  • 常に配列の範囲に注意して、エラーを回避してください

ヌル終端文字でCスタイルの文字列を初期化する

このステップでは、Cスタイルの文字列とC++におけるヌル終端文字の重要性について学びます。Cスタイルの文字列は、文字列の終わりを示す特殊な '\0' 文字で終わる文字配列です。

WebIDEを開き、~/project ディレクトリに c_style_strings.cpp という新しいファイルを作成します。

touch ~/project/c_style_strings.cpp

c_style_strings.cpp ファイルに以下のコードを追加します。

#include <iostream>
#include <cstring>

int main() {
    // 方法1: 明示的なヌル終端文字で文字列を初期化する
    char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
    std::cout << "Greeting: " << greeting << std::endl;

    // 方法2: 文字列リテラルとして初期化する(自動的にヌル終端文字が追加される)
    char name[] = "John Doe";
    std::cout << "Name: " << name << std::endl;

    // 方法3: 固定サイズで宣言して初期化する
    char message[20] = "Welcome to C++!";
    std::cout << "Message: " << message << std::endl;

    // 文字列の長さを示す
    std::cout << "Length of name: " << strlen(name) << std::endl;

    // 手動での文字列の長さの計算
    int length = 0;
    while (name[length]!= '\0') {
        length++;
    }
    std::cout << "Manual length of name: " << length << std::endl;

    return 0;
}

Cスタイルの文字列に関する要点:

  • ヌル終端文字 '\0' は文字列の終わりを示します
  • 常にヌル終端文字用に1文字分余分に割り当てます
  • 文字列リテラルは自動的にヌル終端文字を追加します
  • strlen() 関数はヌル終端文字の前の文字数を数えます

プログラムをコンパイルして実行します。

g++ c_style_strings.cpp -o c_style_strings
./c_style_strings

出力例:

Greeting: Hello
Name: John Doe
Message: Welcome to C++!
Length of name: 8
Manual length of name: 8

重要な文字列初期化の概念:

  • ヌル終端文字は文字列操作にとって重要です
  • 常にヌル終端文字用に十分なスペースを確保してください
  • 文字列バッファのサイズに注意して、オーバーフローを防いでください

文字列クラスのメソッド(length、substr、find)を使用する

このステップでは、C++ における強力な文字列クラスのメソッドについて学びます。これらのメソッドを使うことで、文字列の操作がより簡単で直感的になります。length()substr()find() などの重要なメソッドを調べましょう。

WebIDE を開き、~/project ディレクトリに string_methods.cpp という新しいファイルを作成します。

touch ~/project/string_methods.cpp

string_methods.cpp ファイルに以下のコードを追加します。

#include <iostream>
#include <string>

int main() {
    // 文字列を作成する
    std::string message = "Hello, C++ Programming!";

    // length() メソッドを使用する
    std::cout << "String length: " << message.length() << std::endl;

    // substr() メソッドを使用する
    std::cout << "First 5 characters: " << message.substr(0, 5) << std::endl;
    std::cout << "Substring from index 7: " << message.substr(7) << std::endl;

    // find() メソッドを使用する
    std::string search_word = "Programming";
    size_t position = message.find(search_word);

    if (position!= std::string::npos) {
        std::cout << "'" << search_word << "' found at index: " << position << std::endl;
    } else {
        std::cout << "Word not found" << std::endl;
    }

    // 追加の find() の例
    std::string email = "user@example.com";
    size_t at_symbol = email.find('@');
    size_t dot_symbol = email.find('.');

    std::cout << "Username: " << email.substr(0, at_symbol) << std::endl;
    std::cout << "Domain: " << email.substr(at_symbol + 1, dot_symbol - at_symbol - 1) << std::endl;

    return 0;
}

文字列クラスのメソッドに関する要点:

  • length(): 文字列の文字数を返します
  • substr(): 文字列の一部を抽出します
    • 最初の引数は開始インデックス
    • 2番目の引数(省略可能)は部分文字列の長さ
  • find(): 部分文字列または文字を検索します
    • 最初に見つかったインデックスを返します
    • 見つからない場合は std::string::npos を返します

プログラムをコンパイルして実行します。

g++ string_methods.cpp -o string_methods
./string_methods

出力例:

String length: 23
First 5 characters: Hello
Substring from index 7: C++ Programming!
'Programming' found at index: 11
Username: user
Domain: example

重要な文字列メソッドの概念:

  • 文字列メソッドは強力なテキスト操作を提供します
  • インデックスは0から始まります
  • 潜在的なエラーを処理するために、常に戻り値をチェックしてください

Cスタイルと文字列クラスの間で変換する

このステップでは、Cスタイルの文字列とC++の文字列クラスの間でどのように変換するかを学びます。C++で異なる文字列表現を扱う際、これらの変換は不可欠です。

WebIDEを開き、~/project ディレクトリに string_conversion.cpp という新しいファイルを作成します。

touch ~/project/string_conversion.cpp

string_conversion.cpp ファイルに以下のコードを追加します。

#include <iostream>
#include <string>
#include <cstring>

int main() {
    // Cスタイルの文字列をC++の文字列に変換する
    const char* c_style_str = "Hello, C++ World!";
    std::string cpp_string(c_style_str);
    std::cout << "C++ String: " << cpp_string << std::endl;

    // C++の文字列をCスタイルの文字列に変換する
    std::string message = "Converting strings";
    const char* c_str = message.c_str();
    std::cout << "C-style String: " << c_str << std::endl;

    // strcpyを使った手動変換
    char buffer[50];
    strcpy(buffer, message.c_str());
    std::cout << "Copied to buffer: " << buffer << std::endl;

    // 文字列の長さの比較
    std::cout << "C++ string length: " << message.length() << std::endl;
    std::cout << "C-style string length: " << strlen(c_str) << std::endl;

    return 0;
}

重要な変換メソッド:

  • std::string(c_style_str): Cスタイルの文字列をC++の文字列に変換する
  • .c_str(): C++の文字列をCスタイルの文字列に変換する
  • strcpy(): 文字列を文字配列に手動でコピーする

プログラムをコンパイルして実行します。

g++ string_conversion.cpp -o string_conversion
./string_conversion

出力例:

C++ String: Hello, C++ World!
C-style String: Converting strings
Copied to buffer: Converting strings
C++ string length: 18
C-style string length: 18

重要な変換の概念:

  • .c_str() を使ってC++の文字列から const char* を取得する
  • 変換時のバッファサイズに注意する
  • strlen() はCスタイルの文字列で機能する
  • .length() はC++の文字列で機能する

バブルソートを使って配列要素をソートする

このステップでは、C++ で配列要素をソートするためにバブルソートアルゴリズムを実装する方法を学びます。バブルソートは、リストを繰り返しステップし、隣接する要素を比較し、順序が間違っている場合に交換する、単純なソート方法です。

WebIDE を開き、~/project ディレクトリに bubble_sort.cpp という新しいファイルを作成します。

touch ~/project/bubble_sort.cpp

bubble_sort.cpp ファイルに以下のコードを追加します。

#include <iostream>

int main() {
    // ソートされていない配列を初期化する
    int numbers[5] = {64, 34, 25, 12, 22};
    int size = 5;

    // 元の配列を表示する
    std::cout << "Original Array: ";
    for (int i = 0; i < size; i++) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;

    // バブルソートの実装
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            // 隣接する要素を比較する
            if (numbers[j] > numbers[j + 1]) {
                // 要素を交換する
                int temp = numbers[j];
                numbers[j] = numbers[j + 1];
                numbers[j + 1] = temp;
            }
        }
    }

    // ソートされた配列を表示する
    std::cout << "Sorted Array: ";
    for (int i = 0; i < size; i++) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

バブルソートの重要な概念:

  • 隣接する要素を比較する
  • 順序が間違っている場合に要素を交換する
  • ソートされるまで配列を通過する処理を繰り返す
  • 時間計算量: O(n²)

プログラムをコンパイルして実行します。

g++ bubble_sort.cpp -o bubble_sort
./bubble_sort

出力例:

Original Array: 64 34 25 12 22
Sorted Array: 12 22 25 34 64

重要なソートのメモ:

  • バブルソートは単純ですが、大きな配列に対しては非効率的です
  • 教育目的には適しています
  • 実際のアプリケーションには、より効率的なソートアルゴリズムが存在します

配列における線形探索を実装する

このステップでは、C++ で線形探索アルゴリズムを実装する方法を学びます。線形探索は、配列内の要素を順番にチェックして、目的の要素が見つかるか、配列の末尾に達するまで探索する、単純な方法です。

WebIDE を開き、~/project ディレクトリに linear_search.cpp という新しいファイルを作成します。

touch ~/project/linear_search.cpp

linear_search.cpp ファイルに以下のコードを追加します。

#include <iostream>

int linearSearch(int arr[], int size, int target) {
    // 配列の各要素を反復処理する
    for (int i = 0; i < size; i++) {
        // 現在の要素が目的の要素と一致するかどうかをチェックする
        if (arr[i] == target) {
            return i;  // 見つかった場合はインデックスを返す
        }
    }
    return -1;  // 見つからなかった場合は -1 を返す
}

int main() {
    // 学生の点数の配列を作成する
    int scores[] = {85, 92, 78, 95, 88, 76, 90};
    int size = sizeof(scores) / sizeof(scores[0]);

    // 探索する目的の点数
    int targetScore = 78;

    // 線形探索を実行する
    int result = linearSearch(scores, size, targetScore);

    // 探索結果を表示する
    if (result!= -1) {
        std::cout << "目的の点数 " << targetScore
                  << " はインデックス " << result << " で見つかりました" << std::endl;
    } else {
        std::cout << "目的の点数 " << targetScore
                  << " は配列内に見つかりません" << std::endl;
    }

    // 別の探索を試す
    int missingScore = 100;
    result = linearSearch(scores, size, missingScore);

    if (result!= -1) {
        std::cout << "点数 " << missingScore
                  << " はインデックス " << result << " で見つかりました" << std::endl;
    } else {
        std::cout << "点数 " << missingScore
                  << " は配列内に見つかりません" << std::endl;
    }

    return 0;
}

線形探索の重要な概念:

  • 配列の各要素を順番にチェックする
  • 見つかった場合は目的の要素のインデックスを返す
  • 目的の要素が配列内にない場合は -1 を返す
  • 時間計算量: O(n) - 線形時間
  • 単純で、ソートされていない配列にも対応する

プログラムをコンパイルして実行します。

g++ linear_search.cpp -o linear_search
./linear_search

出力例:

目的の点数 78 はインデックス 2 で見つかりました
点数 100 は配列内に見つかりません

重要な探索のメモ:

  • 線形探索は単純ですが、大きな配列に対しては非効率的です
  • 小さな配列やソートされていないコレクションに適しています
  • ソートされた配列に対しては、より効率的な探索アルゴリズムが存在します

getline() を使って文字列入力を処理する

このステップでは、C++ で getline() を使って完全な1行のテキスト入力を読み取る方法を学びます。cin >> とは異なり、getline() は空白を含む文字列を読み取り、より複雑な入力シナリオを処理することができます。

WebIDE を開き、~/project ディレクトリに getline_input.cpp という新しいファイルを作成します。

touch ~/project/getline_input.cpp

getline_input.cpp ファイルに以下のコードを追加します。

#include <iostream>
#include <string>

int main() {
    // 入力を格納するための文字列を宣言する
    std::string fullName;
    std::string address;

    // フルネームの入力を促す
    std::cout << "Enter your full name: ";
    std::getline(std::cin, fullName);

    // 住所の入力を促す
    std::cout << "Enter your full address: ";
    std::getline(std::cin, address);

    // 追加情報付きで入力を表示する
    std::cout << "\n--- User Information ---" << std::endl;
    std::cout << "Name: " << fullName << std::endl;
    std::cout << "Address: " << address << std::endl;

    // 複数行の読み取りを示す
    std::string multiLineText;
    std::cout << "\nEnter a multi-line description (press Ctrl+D to finish):" << std::endl;

    std::string line;
    while (std::getline(std::cin, line)) {
        multiLineText += line + "\n";
    }

    std::cout << "\nYour description:" << std::endl;
    std::cout << multiLineText;

    return 0;
}

重要な getline() の概念:

  • 空白を含むテキストの完全な1行を読み取る
  • 構文: std::getline(input_stream, string_variable)
  • 複数行の入力を読み取ることができる
  • 空白を含む複雑な入力を処理する
  • フルネーム、住所などの読み取りに便利

プログラムをコンパイルします。

g++ getline_input.cpp -o getline_input
./getline_input

入力例:

Enter your full name: John Michael Smith
Enter your full address: 123 Main Street, Anytown, USA

--- User Information ---
Name: John Michael Smith
Address: 123 Main Street, Anytown, USA

Enter a multi-line description (press Ctrl+D to finish):
This is a sample
multi-line description
with several lines of text.

Your description:
This is a sample
multi-line description
with several lines of text.

重要な入力処理のメモ:

  • getline() は改行文字まで読み取る
  • 完全なテキスト入力をキャプチャするのに便利
  • 他の入力方法と組み合わせることができる

まとめ

この実験では、C++ で一次元配列を作成および初期化する方法、インデックスを使って配列要素にアクセスおよび変更する方法、行列用の二次元配列を実装する方法、null 終端文字付きで C スタイルの文字列を初期化する方法、文字列クラスのメソッドを使用する方法、C スタイルと文字列クラスの間で変換する方法、バブルソートを使って配列要素をソートする方法、配列における線形探索を実装する方法、および getline() を使って文字列入力を処理する方法を学びます。

配列を初期化するさまざまな方法を検討します。これには、サイズを指定してすべての要素を初期化する方法、コンパイラにサイズを決定させる方法、すべての要素をゼロに初期化する方法、およびインデックスを使って値を手動で割り当てる方法が含まれます。また、インデックスを使って配列要素にアクセスおよび変更する方法、およびエラーを回避するために配列の境界を処理する方法も学びます。さらに、二次元配列、C スタイルの文字列、および文字列クラスを扱い、それらの間で変換する方法とさまざまな操作を行う方法を学びます。