はじめに
この実験では、C++ で配列と文字列を操作する方法を学びます。この実験では、1次元配列の作成と初期化、配列要素のアクセスと変更、2次元配列の実装、C スタイルの文字列と String クラスの使用、配列要素のソート、線形探索の実行、および getline() を使った文字列入力の処理など、幅広いトピックが扱われます。これらの実践的な演習を通じて、C++ プログラミングにおける基本的な配列と文字列の操作を深く理解するようになります。
この実験では、C++ で配列と文字列を操作する方法を学びます。この実験では、1次元配列の作成と初期化、配列要素のアクセスと変更、2次元配列の実装、C スタイルの文字列と String クラスの使用、配列要素のソート、線形探索の実行、および getline() を使った文字列入力の処理など、幅広いトピックが扱われます。これらの実践的な演習を通じて、C++ プログラミングにおける基本的な配列と文字列の操作を深く理解するようになります。
このステップでは、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;
}
配列の初期化を分解してみましょう。
int numbers[5] = {10, 20, 30, 40, 50};
: 配列のサイズを明示的に定義し、すべての要素を初期化するint scores[] = {85, 92, 78, 95, 88};
: コンパイラに配列のサイズを決定させるint zeros[6] = {0};
: すべての要素をゼロで初期化する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
配列に関する要点:
このステップでは、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;
}
配列インデックスに関する要点:
[]
を使いますプログラムをコンパイルして実行します。
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
重要なインデックスのルール:
このステップでは、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次元配列に関する要点:
array[row][column]
プログラムをコンパイルして実行します。
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次元配列の概念:
このステップでは、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'
は文字列の終わりを示します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
重要な文字列初期化の概念:
このステップでは、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()
: 文字列の一部を抽出します
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
重要な文字列メソッドの概念:
このステップでは、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;
}
バブルソートの重要な概念:
プログラムをコンパイルして実行します。
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;
}
線形探索の重要な概念:
プログラムをコンパイルして実行します。
g++ linear_search.cpp -o linear_search
./linear_search
出力例:
目的の点数 78 はインデックス 2 で見つかりました
点数 100 は配列内に見つかりません
重要な探索のメモ:
このステップでは、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()
の概念:
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 スタイルの文字列、および文字列クラスを扱い、それらの間で変換する方法とさまざまな操作を行う方法を学びます。