# C++の基礎1
## 内容
* 環境構築
* 基本的なコマンド
* 入出力
* if文、else文、else if文
## 環境構築・基本的なコマンド
<a href="https://hackmd.io/fa39YPT-Q9-Gp3yu2877ow">去年の講義資料</a>
## まず最初に
ターミナルに次のコマンドを打ち込み、l_cppというディレクトリを作成してください
```
mkdir l_cpp
```
これからは、この中にソースファイル(プログラムの書かれたファイル)を保存していきます。
## プログラムの実行までの流れ
まずl_cppに移動してください
```
cd l_cpp
```
次に、ソースファイルを作成します。名前はtestとでもしましょうか。
拡張子は.cppです。
```
touch test.cpp
```
次にエディタ(俺らはvscode)でtest.cppを開いて、次のようにプログラムを書き込みます。コンピュータへの命令書みたいなものを書いていくと思ってください。
(次のプログラムはまだ分からなくてオーケーです)
```cpp=
#include <iostream>
int main() {
int p;
std::cout << "整数を入力してください:";
std::cin >> p;
if(p % 2 == 0) {
std::cout << "偶数ですね" << std::endl;
}
else {
std::cout << "奇数ですね" << std::endl;
}
return 0;
}
```
これを書き終わったらcommmand + s でファイルを保存します。
このままではコンピュータがプログラムを理解してくれないので、次のコマンドで
コンピュータが分かる言葉(機械語)に プログラムを変換(**コンパイル**)します。
```
clang++ test.cpp
```
できました。
さあ、実行してみましょう!!
```
./a.out
```
上のコマンドを打って実行すると、次の表示が出るでしょう。
```
整数を入力してください:
```
352と入力してみましょう
```
整数を入力してください:352
```
そしてEnterキーを押すと、
```
偶数ですね
```
が出てくるでしょう!
以上が、プログラムの実行の一連の流れになります。
## 最小のプログラム
エディタに下のコードを書いて実行して見ましょう
```cpp
int main() {}
```
実行すると、何も起こりません。C/C++のプログラムの実行はmain関数からスタートします。==この{}の中にコンピューターにやってもらいたい処理を書いていきます==。上の例では、{}の中に何も書いてないので何も起こりません。
## コメント
プログラム中にメモ書きする方法は、`/* ~ */`、`// ~`の二通りがある
```cpp
/* ここにメモをかく */
// ここにメモをかく
```
## 画面(ターミナル)に文字や数字を表示する
`std::cout`を使って画面に表示します。std::みたいなやつはおまじないと思ってください。```<<```は演算子(+みたいなやつ)です。
使い方は次のとおり
```cpp
std::cout << "わーい"; //文字列は""で挟む
std::cout << 34; //数値は""いらない
std::cout << 2.45;//数値は""いらない
```
ではHello, World!を画面に表示して見ましょう!
```cpp=
int main() {
std::cout << "Hello, World!";
}
```
これを実行しようとすると、
```
test.cpp:2:5: error: use of undeclared identifier 'std'
std::cout << "Hello, World"
^
1 error generated.
```
ありゃ、エラーが出ましたね。std::coutを使うためには、**iostreamライブラリ**という、入出力の機能をまとめた辞書みたいなやつを読み込まないといけません。次のように書き直します。
```cpp=
#include <iostream> //#includeを使って読み込む!
int main() {
std::cout << "Hello, World!";
}
```
実行すると、
```
Hello, World!
```
と出てきたと思います。でもちょっと見にくいですね。改行して見やすくしたいところです。`std::endl`というやつを使います。これを使って書き直すと、
```cpp=
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;//endlで改行。セミコロンを忘れず。<<は+のようなものだからa+b+cみたいにa<<b<<cってことができる。
}
```
これを実行すると、文末が改行されて見やすくなった結果が得られるでしょう。
また、文の区切りはセミコロンを書くことを忘れずに。
## 数
**整数**と、**浮動小数点数**があります。整数は==文字どうり1とか4とかの数値==、浮動小数点数は==3.14みたいな数値==のことです。
次のように今まで慣れ親しんだ四則演算が定義されています。
```cpp=
#include <iostream>
int main() {
std::cout << 1 + 3 << std::endl;
std::cout << 2 - 3 << std::endl;
std::cout << 1.4 * 2.5 << std::endl;
std::cout << 3.0 / 2.0 << std::endl;
std::cout << (1.3 + 2.4) * 2.0 << std::endl;
}
```
実行すると
```
4
-1
3.5
1.5
7.4
```
%を使えば余りの計算もできます
```cpp
3 % 2 // %は剰余演算。3を2で割った余りが出てくる。整数同士でのみ使用可能。
```
注意事項は以下のとおり
```cpp
1 / 2 //0となる。整数同士の割り算の値は小数点以下が切り捨てられる。
1.0 * 2 //2ではなく2.0。浮動小数点数が入った演算の結果は浮動小数点数(+,-,/でもそうなる)。
2 / 4 * 8 //0となる。演算子の優先順位が同じ場合は左から計算する。()を使えば優先順位を変えられる。
1/0 //0で割る行為は禁止です。気をつけましょう。
```
## 変数
変数とは値をもつ箱のようなものです。

変数は次の2段階を踏んで使用します
<ol>
<li>箱の種類、その名前 を「<strong>宣言</strong>」する</li>
<li>宣言した箱を使えるように「<strong>定義</strong>」する</li>
</ol>
<strong>型</strong>・・・箱の種類のことで、どんな値を入れることができるか示したものです。
C++の基本型には以下のようなものがあります。
|型|どんな値が入るのか|
|:---:|:---:|
|bool|論理値。falseかtrueのいずれかの値。|
|int|整数|
|short|intよりサイズの小さい整数|
|char|文字(文字列ではない)|
|float|浮動小数点数|
|double|精度が高い(桁数が多い)浮動小数点数|
では実際にその使い方を見ていきましょう。
宣言と定義は次のように行います。
```cpp
//(型) (変数名); で宣言と定義を同時に行う。
int a;
char b;
double c;
bool d;
```
この変数の定義が終わると、変数にはよくわからない値(不定値)が入っているので代入という操作が必要です。次のように行います。
```cpp
a = 123;
b = 'A';
c = 1.2;
d = true;
```
ここでの```=```は**代入演算子**と呼ばれ、==左辺の変数の箱に右辺で計算した値を入れる操作==を行なっています。
>普段私たちが使う```=```とは違うことに注意!
実は変数の宣言(と定義)と同時に値を与えることもできます。
```cpp
int k = 100;
double t = 0.5;
```
この行為を**初期化**といい、与える値を**初期値**と言います。
また,
```cpp
int a = 0;
int l = a;
```
のように他の変数を初期値に指定することができます。
## 複合代入演算子
例えばint型の変数aにaの値に3を足したものを代入したいときはどうすればよいのでしょうか。
まずは単純な方法です。
```cpp
int a = 1;
a = a + 3;
```
こうすれば右辺で計算した値が左辺に代入されるので、aは4となります。
でもこれは次のように書き直せます。
```cpp
int a = 1;
a += 3;
```
やっていることは何も変わりません。
この```+=```は通常の演算(足し算)と代入演算を1つの演算子で実行することから、<strong>複合代入演算子</strong>と呼びます。
/, %, *. - でも同じことができます。
```cpp
a -= 3; //aから3引いた値を変数aに代入。
a *= 3; //aに3かけたものを変数aに代入。
a /= 3; //aを3で割った値を変数aに代入。
a %= 3; //aを3で割ったあまりを変数aに代入。
```
## キーボードから入力を受け取ってみよう。
実行中にキーボードで変数の値を入力したい時はどうすれば良いのでしょうか。
`std::cin`というやつを使います。
書式は
```cpp
std::cin >> v; //vは値を入力したい変数
```
これもstd::coutやstd::endlと同じようにiostreamライブラリを読み込む必要があります。ターミナルで数字を入力して、それを二乗した数をターミナルに表示するプログラムを作って見ましょう。
```cpp=
#include <iostream>
int main() {
int a; //変数の宣言、定義
std::cin >> a; //キーボードでaに値を入力
std::cout << a*a << std::endl; //ターミナルに表示
}
```
実行すると入力を待った状態になるので、適当に15を入力してみましょう。
すると
```
225
```
が画面に表示されました。目的どうりですね。
std::cout では << でしたが、 ==std::cin では >> となる==ことに注意しましょう。
### (補足) printf, scanf
C言語ではstd::cinと同じ機能を持った関数としてscanfがあり,std::coutと同じ機能を持った関数としてprintfがあります。
printfの使い方は、
```cpp
#include <stdio.h>
int main() {
int a = 4;
double b = 2.38;
printf("%d\n",a);//aはint型なので書式指定子はd。\nは改行
printf("%lf\n",b);//bはdouble型なので書式指定子はlf,\nは改行
}
```
実行すると,
```
4
2.380000
```
scanfの使い方は,
```cpp=
#include <stdio.h>
int main() {
int a;
double b;
scanf("%d",&a); //int型の書式指定子はd。aの前に&を置くことを忘れずに
scanf("%lf",&b); //double型の書式指定子はlf。bの前に&を置くことを忘れずに
//一度にまとめて scanf("%d%lf",&a,&b); でもOK
printf("%d\n",a);
printf("%lf\n",b);
}
```
実行してaに3, bに4.56を入れると,
```
3
4.560000
```
printfとscanfはiostreamかstdio.hをincludeする必要があります。
>printfとscanfはOSの授業ではよく出てくると思うので、個別に勉強しとくと良いでしょう。この講義では軽く触れるだけなので。
## 条件分岐

色々な条件ごとに処理を分ける方法を学びましょう。
その条件を記述するために、知るべきいくつかのことがあります。
### bool型
ブール型は真と偽のいずれかの値をとる型です。bool型の変数は真であれば、値は1となり、偽であれば値は0となります。真を表すtrue、偽を表すfalseが定義されています。
```cpp=
#include <iostream>
int main() {
bool a = false; // 0でもOK
bool b = true; // 1でもOK
std::cout << a << std::endl;
std::cout << b << std::endl;
}
```
実行すると
```
0
1
```
### 関係演算子
|関係演算子|意味|
|:---:|:---:|
|a < b|a小なりb|
|a <= b|a大なりイコールb|
|a > b|a大なりb|
|a >= b|a大なりイコールb|
### 等価演算子
|等価演算子|意味|
|:---:|:---:|
|a == b|値の一致|
|a != b|値の不一致|
### 論理演算子
|論理演算子|意味|
|:---:|:---:|
| !式|式の否定|
|式 && 式|式かつ式|
| 式 \|\| 式 | 式または式 |
これらを組み合わせると一つの条件式を作ることができます。
その条件式の値は、ブール型となります(真か偽かのどちらかであるということ)。
```cpp=
#include <iostream>
int main() {
int a = 3;
int b = 4;
int c = 5;
bool i = a < b && b < c;
std::cout << i << std::endl;
}
```
実行すると
```
1
```
が表示されます。a < b && b < c が真になるので、iは真、つまり1となるので、1が表示されます。
### if文,else文,else if文
ここまでくれば、条件ごとに処理を変えていくプログラムが書けるようになります。
それを実現するのが if, else, else if です。
次のような構造になっています。
```cpp
if(条件式1) {
条件式1が真である 時に実行する
}
else if (条件式2){
条件式1が偽 かつ 条件式2が真 である時に実行する
}
else {
条件式1が偽 かつ 条件式2が偽 である時に実行する
}
```
### 例題
入力した2文字の実数a, bが a < b , a = b, a > b のどれになるのか判定するプログラムを書いて見よう。
#### 解答例
```cpp=
#include <iostream>
int main() {
double a,b; //一度に宣言できる。便利だから覚えとこう。
std::cout << "aの値を入力してください:";
std::cin >> a; //aに入力
std::cout << "bの値を入力してください:";
std::cin >> b; //bに入力
if(a < b) {
std::cout << "a < b" << std::endl;
}
else if(a == b) {
std::cout << "a = b" << std::endl;
}
else {
std::cout << "a > b" << std::endl;
}
}
```
実行して、aの値を34、bの値を18にすると、```a > b```が表示される。
>C++の基礎1はこれで終了です。