C++の基礎的な内容から関数までを書いていきます
1.C++の文法
次のコードがC++の主な書き方です。
#include <iostream>
using namespace std;
int main(){
// ここにコードを書く
return 0;
}
コードの解説
-
#include <iostream>
これは文字の出力、入力をC++でできるようにする宣言です。 -
using namespace std;
iostream
やvector
、algorithm
(後ろの2つは後で説明します)を使うときに本当はstd::
をつかないといけないところをこれを書くことで省けるという便利な宣言です。 -
int main(){}
入力や出力をするメインの関数で主に競技プログラミングではここにほとんどを書きます。 -
return 0;
これはC++でmain関数の正常終了を意味する文です。
重要なこと
C++ではほとんどの場合文の最後には;
(セミコロン)をつけないとエラーになるので気をつけてください。
2.C++の入出力
次のコードがC++での入出力をするコードです。
#include <iostream>
using namespace std;
int main(){
string S;
cin >> S;
cout << S << endl;
return 0;
}
コードの解説
-
string S;
後で詳しく説明します。今は文字列を表すものと思ってください。 -
cin >> S;
入力をする式です。複数個のときはcin >> A >> B >> C;
のような感じで書きます。 -
cout << S << endl;
cout
というのはC++で出力をする式で、<<
を使って区切ります。
また、後ろについているendl
というものは改行をする関数です。
3.C++での変数
C++では変数を整数や小数、文字列など詳しく分ける静的型付けを採用しています。
型の種類
型 | 種類 | サイズ(byte) | 重要度 |
---|---|---|---|
char | 文字 | 1 | B |
int | 整数 | 4 | A |
long | 整数 | 8 | B |
short | 整数 | 2 | C |
float | 小数 | 4 | C |
double | 小数 | 8 | A |
bool | 論理 | 1 | B |
string | 文字列 | 制限なし | A |
重要度についての説明
A: どれかは1問に1回は出てくる
B: 出てくる確率は少し低いが処理で使うときもある
C: ほとんど出てこない
型の説明
- 文字
'a'
,'A'
など1つの文字を格納できる
文字をシングルクォーテーション'
で囲う - 整数
整数を格納できる
また前にunsigned
をつけることで負の数を入れられなくなる - 小数
小数を格納できる
また前にunsigned
をつけることで負の数を入れられなくなる - 論理
true
(はい)とfalse
(いいえ)を格納できる - 文字列
"Hello!"
などchar型を何個もつなげたような格納ができる。
文字列をダブルクオーテーション"
で囲う
また、すべての場合においてconst
をつけることにより値を変更できなくなります。
変数宣言の仕方
変数を作るときは、(例)int a;
と宣言します。
変数にすぐに値を入力したいときは(例)int a = 10;
と宣言します。
型変換
int型からdouble型に変換したいときは(double)N
のようにして型を変換します。
ただ、小数と整数の変換に主に使い、string型からchar型などできないこともあります。
auto型について
auto方というのはC++11から導入された型で型の推論ができる型です。
ただpythonと違い一回値を入れたら型の種類を変えられなくなります。
4.計算
計算をするための演算子を説明します。
演算子 | 説明 |
---|---|
= | 代入 |
+ | 足し算 |
- | 引き算 |
* | 掛け算 |
/ | 割り算 |
% | 余り |
+= | 足し算して代入 |
-= | 引き算して代入 |
*= | 掛け算して代入 |
/= | 割り算して代入 |
++ | +=1 |
-- | -=1 |
注意 割り算 /
について
例えばC++で6/4を計算すると1と小数部分が切り捨てられてしまいます。
そのため少数で割り算したいときはそれぞれをdouble(N)
のようにしてから計算します。
5.条件分岐
C++で条件分岐を使うにはif文またはswitch文を使います。
またその前に比較演算子、論理演算子について説明します。
比較演算子
演算子 | 説明 |
---|---|
a==b | aとbが等しい |
a!=b | aとbが等しくない |
a<b | aはb未満 |
a<=b | aはb以下 |
a>b | aはbより大きい |
a>=b | aはb以上 |
論理演算子
演算子 | 名前 | 説明 |
---|---|---|
&& | 論理積 | 両方true |
|| | 論理和 | trueが1つでもあったら |
^ | XOR | どちらか1つだけがtrue |
! | 否定 | 逆になる |
if文とswitch文の書き方
#include <iostream>
using namespace std;
int main(){
N = 3;
// 偶数奇数判定
if (N%2 == 0){
cout << "Nは偶数です\n";
}
else {
cout << "Nは奇数です\n";
}
// 2か3か判定する
switch(N){
case 2:
cout << "Nは2です\n";
break;
case 3:
cout << "Nは3です\n";
break;
default:
cout << "Nは2でも3でもないです\n";
break;
}
return 0;
}
if文の解説
if文はif(条件式){処理}
という感じで書きこれを何個もつなげると
if(条件式){処理}
else if (条件式){処理}
else {処理}
のように書きます。
補足
- ネストについて
if文の中にif文を入れるとコードが見にくくなるので論理演算子&&
を使って
if(条件1 && 条件2){}
と書くことで見やすくなります。 -
{}
はつけなくても良い時がある
if文の条件のあとには{}をつけますがif文の処理が1文だけだったら{}
を省いて良いとなっていて見やすく書くことができます。
switch文の解説
switch文は特定の変数の値に応じて複数の選択肢から処理を分岐させるために使われ、特に「条件が整数や文字で限定されるとき」に便利です。
注意 break文を絶対につける
switch文でbreak文を付けないとその後の処理も行われてしまうのでbreak文はつけておきましょう。
補足 三項演算子
三項演算子は条件式? 条件式がtrueだったときにする処理: 条件式がfalseだったときにする処理;
です。
普通のif分に書き換えると
if (条件式){}
else {}
になります。
6.ループ
条件分岐にはfor文とwhile文の主に2つの書き方があります。
それぞれの書き方
#include <iostream>
using namespace std;
int main(){
// for文で九九表
for (int i = 1; i <= 9; i++){
for (int j = 1; j <= 9; j++) cout << i*j << "\t";
cout << endl;
}
cout << endl;
// while文で九九表
int i = 1;
int j = 1;
while (i <= 9){
j = 1;
while (j <= 9){
cout << i*j << "\t";
j++;
}
cout << endl;
i++;
}
return 0;
}
for文の解説
for文はfor(変数定義; 条件式; 変数を変化)
と書きます
for文は決められた回数だけ繰り返したいときに多く使われて、変数の定義では主に整数型が使われます。
while文の解説
while文は
変数定義;
while(ループするための条件)
と書きます。
while文は回数は決まっていないがループをさせたいときに使います。
while文についての注意 while文内で変数の値を変える
例えば
int i = 1;
while (i <= 5){
cout << i << endl;
}
のようなコードを書いたとすると
iの値が1のまま変化しないためwhile文が無限に繰り返されて1が無限に出力されます。
そのためwhile文の中でi++;
のようなiの値を変化させる文が必要になってきます。
そのためwhile文では必ず中に条件の変数を変化させる式を書かないといけません。
while文のついての補足
- 無限ループ
while文で無限ループをするときはwhile(true)
と書きます。
この場合はbreak文を使わない限りループを抜け出せません。 - do-while文
do-while文は最低1回はループをしたいときに使います
書き方はdo{処理}while(条件式)
と書き、while文と同じように条件式がtrueのときにループを繰り返します。
処理の流れの変更について
- break文
break文はbreak;
と書き、ループを抜け出します。 - continue文
continue文はcontinue;
と書き、ループを1度だけ抜け出します - return文
main関数でのreturn文はreturn 数値;
と書き、数値が0なら正常終了、それ以外なら異常終了となり、そのあとの関数の処理をすべて飛ばします。
7.関数
C++の関数に付いて説明します。
関数は主に同じような処理をたくさん使うときに使うことでコードを見やすく、拡張性を高くできます。
C++の関数は戻り値の型 関数名(引数の型 引数の名前){処理}
のように書きます。
関数の例
#include <iostream>
using namespace std;
//累乗をする関数
int pow(int a, unsigned int b){
int ans = 1;
for (int i = 0; i < b; i++) ans *= a;
return ans;
}
//自己紹介関数
void introduce(string name, unsigned int age){
cout << "名前\t" << name << endl;
cout << "年齢\t" << age << endl;
}
int main(){
int base, exponent;
cout << "底と指数を入力してください。\n";
cin >> base >> exponent;
cout << base << "^" << exponent << "=" << pow(base, exponent) << endl;
string name;
int age;
cout << "名前と年齢を入力してください。\n";
cin >> name >> age;
introduce(name, age);
return 0;
}
pow関数についての解説
pow関数はaのb乗を出力する関数で整数型のaと非負整数型のbを引数として持ちます。
これは戻り値がint型でありmain関数内でpow(a, b)
をcout無しで書いてしまうと出力されずまた変数に代入もされていないため意味のない文になってしまいます。
introduce関数についての説明
introduce関数は文字列型のnameと非負整数型のageを引数として持ち、自己紹介をする関数です。
また、変数にはなかったvoid型というのは値を持たない型で関数だけに使える型です。
"入力や出力をするとき"に主に使います
関数についての補足
- 関数プロトタイプ宣言
関数のプロトタイプ宣言とはmain関数の前に関数を
戻り値の型 関数名(引数の型 引数の名前);
と書いておいて
main関数のあとに普通に関数の定義を書けば関数が使えるというもので大規模なプログラムを作るときはよく使います。 - デフォルト引数
関数プロトタイプ宣言ではデフォルト引数を指定することがよくあります。
デフォルト引数を指定していることで指定しておいたデフォルト値が関数に渡されます。
足し算をするadd関数を作るときint add(int x = 10, int y = 10);
と書くことでadd()
をadd(10, 10);
と同じことになります。 - 関数のオーバーロード
足し算をするadd関数を作るとき
int add(int x, int y){ return x+y; }
double add(double x, double y){ return x+y; }
と関数名が同じ関数を2個作りましたがこれは引数の型や数が異なっていれば同じ苗の関数を複数定義できるのでエラーになりません。
またこれのことを関数のオーバーロードといいます。 - 関数テンプレート
オーバーロードのように引数の型が違うが処理が同じときに型をまとめられるもので
template <class T>
と書きます。
基礎編の内容はここまでです。
次は配列編を作ります。