他の回の資料
C++とは?
C++は、C言語から派生した言語です。
C言語にいろいろ機能を追加したのがC++っていう認識で大丈夫だと思います。
C++の簡単なコード
#include <iostream>
int main() {
std::cout << "hello world" << std::endl;
return 0;
}
上のコードはコンソールにhello world
と表示するだけの簡単なコードです。
このコードを学内のPCで実際に実行する方法を説明します。
C++コードの実行の仕方
まず、ターミナルを起動して適当なフォルダを作成します。
以下の例ではpandd
というフォルダを作っています。
mkdir pandd
次に、cd
コマンドで作成したフォルダに移動します
cd pandd
そこで、code ディレクトリ名
というコマンドでVSCodeというコードエディタを起動できます。
.
は今いるディレクトリ(カレントディレクトリ)という意味です。
code .
VSCodeが起動したら新規ファイルを作成し、上記のC++のコードをコピペします。
この時拡張子は.cpp
にしてください。
以下の例ではmain.cpp
というファイルを作成しています。
C++のソースファイルの作成ができたら、次にコンパイルという作業をします。
コンパイルとは、C++のコードから、コンピュータが実際に実行可能なファイルに変換する作業です。
以下のコマンドをターミナルで実行してください。
g++ ファイル名.cpp
すると、同じディレクトリにa.out
というファイルが新しく作成されていると思います。
以下のようにすると実行できます。
./a.out
C++の入出力
入出力とは、コンソールに文字列を表示したり、コンソールでの入力を受け取ったりすることです。
入出力は英語でIO
と呼ぶこともあります。
C++の出力
#include <iostream>
int main() {
std::cout << "hello world" << std::endl;
return 0;
}
std::cout << "hello world" << std::endl;
↑ の部分でコンソールに文字列を表示しています。
std::cout
↑ は文字列の出力先を意味しています。今回の場合だとコンソールです。
"hello world"
↑ はコンソールに表示する文字列です。
C++では、コード内で文字列を表現するときはダブルクォーテーションで囲う必要があります。
std::endl
↑ は改行を意味します。
std::cout << "hello world"
↑ で文字列を表示します。
std::cout
という出力先に"hello world"
という文字列を流し込んでいるイメージです。
<<
という記号を使って、<<
の左側に右側の要素を流し込む、という意味になります。
このような書き方を、C++ではストリーム(stream)といいます。
std::cout << "hello world" << std::endl;
std::cout << "hello world"
の後に続けて<< std::endl
と書くことで、同じ出力先に続けて改行も流し込んでいます。
末尾のセミコロン;
は文の終わりに必ず書く必要があります。
std::cout
<< "hello world"
<< std::end;
Python
などの言語では、改行を文の区切りとして扱っていますが、C++では改行ではなく;
を文の区切りとして扱います。
そのため、上記のように文の途中で改行を入れて自分が見やすいように書くことが出来ます。
#include <iostream>
int main() {
std::cout
<< "hello world"
<< std::endl;
return 0;
}
#include<iostream>
の意味
#include <iostream>
int main() {
std::cout << "hello world" << std::endl;
return 0;
}
ここで、#include<iostream>
の意味について説明します。
実は、最初の状態ではstd::cout
やstd::endl
という機能は使用することが出来ません。
int main() {
std::cout << "hello world" << std::endl;
return 0;
}
試しに、↑のようなコードを実行してみようとすると、std::cout
とstd::endl
のところでエラーが出ると思います。
そこで、もとから用意されているiostream
というライブラリを読み込むことで、std::cout
やstd::endl
が使えるようになります。
C++では、他にも色々なライブラリが標準で用意されているので、それらを使うことで様々な機能を使うことが出来ます。
ちなみに、ライブラリは自分で作成することもでき、Siv3Dも有志によって作られたライブラリの一つです。
練習問題
問題1. "hello world"
の部分を変えて、色々な文字列を表示させてみよう
#include <iostream>
int main() {
std::cout << "hello world" << std::endl;
return 0;
}
問題2. 以下の文字列を表示させてみよう
複数行を表示するにはどうすれば良いでしょうか?
begin
1+2=3
end
答え
書き方は何通りかあります。
#include <iostream>
int main() {
std::cout << "begin" << std::endl;
std::cout << "1+2=3" << std::endl;
std::cout << "end" << std::endl;
return 0;
}
#include <iostream>
int main() {
std::cout << "begin" << std::endl << "1+2=3" << std::endl << "end" << std::endl;
return 0;
}
↓文の途中で改行をすると見やすくなります
#include <iostream>
int main() {
std::cout << "begin" << std::endl
<< "1+2=3" << std::endl
<< "end" << std::endl;
return 0;
}
C++の入力
次に、コンソールからの入力を受け取ってみましょう。
#include <iostream>
#include <string>
int main() {
std::string name;
std::cout << "Enter your name: ";
std::cin >> name;
std::cout << "Hello, " << name << "!" << std::endl;
return 0;
}
↑ のコードを実行すると、Enter your name;
とコンソールに出力されたところで、プログラムが停止します。
ここでコンソールに名前を入力すると、Hello, 名前!
と出力されてプログラムが終了します。
std::string name;
↑ の部分ではstd::string
という型のname
という変数を作成しています。
std::string
とは、文字列を表す型です。#include <string>
することで使えるようになります。
変数については後で詳しく説明するので、今はname
という名前の、文字列を入れられる箱を作っていると考えてください。
std::cin >> name;
↑ でコンソールからの入力を受け取って、先程作ったname
という変数に入れています。
std::cin
は入力元を意味しています。今回の場合だとコンソールからの入力です。
>> name
で、std::cin
からの入力をname
変数に流し込んでいます。
std::cout
とは<<
の向きが逆になっていることに注意してください。
std::cout << "Hello, " << name << "!" << std::endl;
↑ でname
変数の中身をHello,
と!
の間に表示しています。
文字列をダブルクォーテーション""
で囲う必要があるのは、変数の中身を表示するか、文字列をそのまま表示するかを区別するためです。
std::cout << "Hello, " << "name" << "!" << std::endl;
試しに、↑のようにname
を""
で囲うと、name
変数の中身ではなく、nameという文字列がそのまま表示されます。
練習問題
以下のように、名前と年齢を受け取れるようにしてみましょう。
Enter your name: ぱんどど
Enter your age: 20
Hello ぱんどど!
You are 20 years old.
答え
#include <iostream>
#include <string>
int main() {
std::string name;
std::string age;
std::cout << "Enter your name: ";
std::cin >> name;
std::cout << "Enter your age: ";
std::cin >> age;
std::cout << "Hello, " << name << "!" << std::endl;
std::cout << "You are " << age << " years old." << std::endl;
return 0;
}
演算子 +
, -
, *
, /
, %
+
, -
, *
, /
, %
などの演算子を使うことで、四則演算を行うことが出来ます。
#include <iostream>
int main() {
std::cout << "4 + 2 = " << 4 + 2 << std::endl;
std::cout << "4 - 2 = " << 4 - 2 << std::endl;
std::cout << "4 * 2 = " << 4 * 2 << std::endl;
std::cout << "4 / 2 = " << 4 / 2 << std::endl;
std::cout << "5 % 2 = " << 5 % 2 << std::endl;
std::cout << std::endl;
std::cout << "(2 + 3) * 4 = " << (2 + 3) * 4 << std::endl;
std::cout << "(3 + 7) / 4.0 = " << (3 + 7) / 4.0 << std::endl;
return 0;
}
実行結果
4 + 2 = 6
4 - 2 = 2
4 * 2 = 8
4 / 2 = 2
5 % 2 = 1
(2 + 3) * 4 = 20
(3 + 7) / 4.0 = 2.5
*
は掛け算、/
は割り算、%
は剰余算です。
計算式をダブルクォーテーション""
で囲わずに、そのまま書くことで、計算結果を表示できます。
型、変数
変数とは、数値や文字列などの値をいれることができる箱のようなものです。
型名 変数名;
と書くことで変数を定義(作成)することが出来ます。
変数名はアルファベット、数字、アンダースコア_
のみ使用できます。
- 大文字と小文字は区別されるので、
abc
とAbc
は別の変数として扱われます。 -
12abc
など数字から始まる変数名は使用できません。 -
int
など、すでにある名前と重複する変数名も使用できません。
型とは、変数の中のデータが何であるかを表すもので、以下のような種類があります。
型名 | 扱えるデータ | 注釈 |
---|---|---|
int | 整数 | |
long | 整数 | intより絶対値が大きな値を扱える |
float | 小数 | |
double | 小数 | floatより精度が高い |
bool | 真理値 | trueかfalse |
void | 無 | 型が無いことを意味する。関数の定義などで使います |
char | 単一の文字 | |
std::string | 文字列 |
#include <string> が必要 |
型が同じ場合、以下のように複数の変数を一度に定義できます
int a, b, c;
変数に値を代入するには=
演算子を使用して↓のように書きます
変数名 = 値;
↓のように、変数の定義と同時に値をいれることも出来ます。
int age = 20;
↓でコンソールからの入力を格納することも出来ます。
std::cin >> 変数名;
↓のように、変数同士で四則演算をすることも出来ます。
#include <iostream>
int main() {
int a = 4;
int b = 2;
int answer = a + b;
std::cout << a << " + " << b << " = " << answer << std::endl;
}
#include <iostream>
int main() {
int a, b, answer;
a = 4;
b = 2;
answer = a * b;
std::cout << a << " * " << b << " = " << answer << std::endl;
}
型の種類による四則演算の結果の違い
以下のコードを実行してみましょう
#include <iostream>
int main() {
std::cout << 5 / 2 << std::endl;
return 0;
}
実行結果は2.5
となるでしょうか?
答えはNoです。実行結果は2
となるはずです。
これは、5 / 2
の5
と2
が整数、すなわちint型として解釈されているからです。
C++の仕様では、四則演算の結果は計算に使われる値の型と同じ型として扱われます。
つまり、5 / 2の答えは2.5ですが、その答えをint型として表すため、小数点以下が切り捨てされて2になります。
この問題は、以下のように計算に使われる値のいずれかを小数型(float
, double
など)にすることで防げます。
#include <iostream>
int main() {
std::cout << 5.0 / 2 << std::endl;
return 0;
}
型の変換(キャスト)
別の型に変換したい、例えばint型の変数をdouble型に変換したい場合、以下のようにかけます。
(型名)変数名
例
int main() {
int a = 3;
double b = (double)a;
}
(double)a
の部分で、変数a
の値をdouble
型に変換しています。このことをキャストといいます。
この例のように、明示的にキャストをする以外にも、プログラムが勝手に(暗黙的に)キャストすることがあります。
それが以下の例です。
int main() {
int a = 3;
double b = a;
}
aをdouble
型に変換せずそのままbに代入しようとしていますが、このコードはエラーになりません。
これは、プログラムが勝手に変数a
をdouble
型にキャストしてしまうためです。
このことを暗黙的なキャストといいます。
練習問題
コンソールから数値を受け取り、掛け算した結果を表示するプログラムを作ってみましょう。
入出力例
Enter a: 2.5
Enter b: 1.5
2.5 * 1.5 = 3.75
コンソールから数値の入力がうまくいかなかったら
小数値で計算できるように、変数の型に気をつける
答え
#include <iostream>
int main() {
double a, b;
std::cout << "Enter a: ";
std::cin >> a;
std::cout << "Enter b: ";
std::cin >> b;
std::cout << a << " * " << b << " = " << a * b << std::endl;
}
コメント
コードの中にコメントを残しておきたい場合、以下のように書きます
#include <iostream>
int main() { // main関数を定義する
std::string name; // 変数nameをstd::string型で定義する
int age; // 変数ageをint型で定義する
/*
コンソールからの名前と年齢の入力を
name, age変数にそれぞれ格納する
*/
std::cin >> name >> age;
std::cout << a << " * " << b << " = " << answer << std::endl;
}
コメントの書き方は2種類あります。
//
はそれ以降の行末までの文字をコメントアウトします。1行だけコメントを書きたいときに使います。
/*
*/
は、囲われた範囲を全てコメントアウトします。複数行コメントを書きたいときに便利です。
コメントアウトされた部分はプログラムとして解釈されなくなります。