Youtube登録者5000人突破!!

【C++】for文・配列 【はじめてのC++プログラミング入門講座 #7】

はじめてのC++プログラミング入門講座では、プログラミングをやったことのない人でも分かるように、C++について解説します。まずは、C++を知るところからはじめて、初心者がつまづきやすい「ポインタ」までをゴールとして進めていきます。全て無料で学べる内容となってますので、ぜひ最後までお付き合いください。

丁寧に学ぶをモットーに、ひとつずつじっくりと理解しけるように解説します。 はじめは少し退屈かもしれませんが、基礎を身に着けておくと、後が楽になります。また、プログラミング学習でよくあるのが、飛ばしすぎて途中で挫折してしまうことです。続けさえすれば力になります。じっくりゆっくり学んでいきましょう。

本講座はC++の開発環境が必要です。環境構築には第1回のVisual Studioの環境構築を参考にしてください。下記からどうぞ。

前回の第6回では、名前空間と入力について解説しました。詳細は下記からどうぞ。

長いプログラムを書くようになると、名前空間を意識する必要が出てきます。また、名前空間を理解することで、スッキリした変数名やライブラリ名を使うことができるようになります。美しいプログラムは価値があります。ぜひ身に付けましょう。

重要なポイントは下記の通りです。特に、using namespace stdは多用されるので覚えておきましょう。また、変数宣言を狭く取るのも多くのプログラマーが息をするように行なえます。初めはどこで変数を宣言すべきか意識してプログラムを修正しましょう。

  • 名前空間(スコープ)を使えば、限定的な範囲で変数や関数を使うことができる
  • 波カッコで囲んだ範囲が名前空間となる
  • using namespace は、名前空間の表記を省略する機能である
  • using namespace std を使えば、標準ライブラリ内のメソッドもstd::表記を省略して使える
  • 変数宣言は可能な範囲で名前空間を狭くとる(if文、for文内に書くなど)
  • iostreamライブラリのcinを使えば、実行時に入力を与えられる

for文・配列

if文の次は、for文について学びましょう。for文は「繰り返し」を行う機能です。プログラマの口癖が「効率化」であるように、プログラマは繰り返し作業を嫌います。for文は、繰り返し作業をまとめてくれて、同じプログラムを書く手間を減らしてくれる機能です。

今回は、配列を使ってfor文の説明をします。配列とは、いくつかの変数をひとまとめで管理できる型です。一列の本棚のようなイメージで、一つの棚に一つの変数が入ると考えてください。

for文自体は書き方さえ覚えてしまえば、かなり簡単です。一方で、配列はつまずくポイントになりやすいです。このあたりは飛ばすと後々困るので、じっくり進めていきましょう。

#include <iostream>
#include <string>

using namespace std;

int main()
{
	for (int i = 1; i <= 10; i++) {
		cout << i << endl;
	}

	const int NUM = 5;

	int IDs[NUM];
	IDs[0] = 10;
	IDs[1] = 20;
	IDs[2] = 30;

	int IDs2[] = { 100,200,300,400,500 };

	cout << IDs[0] << endl;
	cout << IDs[1] << endl;
	cout << IDs[2] << endl;
	cout << IDs[3] << endl;
	cout << IDs[4] << endl;

	for (int i = 0; i <= NUM; i++) {
		cout << IDs[i] << endl;
	}

	for (int i = 0; i <= 10; i++) {
		if (i == 3) continue;
		if (i == 7) break;
		cout << i << endl;
	}
}

出力結果は下記のようになります。

1
2
3
4
5
6
7
8
9
10
10
20
30
-858993460
-858993460
10
20
30
-858993460
-858993460
-858993460
0
1
2
4
5
6

ライブラリとメイン関数

#include <iostream>
#include <string>

using namespace std;

int main()
{
・・・
}

今回もインクルードするライブラリは入出力ライブラリのiostreamと文字列を扱うstringです。

また、前回紹介した using namespace std も使用します。これは、標準ライブラリを使用する際の名前空間を省略することができます。例えば、標準出力の std::cout を cout だけで記述することができ、プログラムがスッキリします。

残りのコードは全てメイン関数の中に書いていきます。

for文

	for (int i = 1; i <= 10; i++) {
		cout << i << endl;
	}

for文は「繰り返し」を行う機能です。プログラマの口癖が「効率化」であるように、プログラマは繰り返し作業を嫌います。for文は、繰り返し作業をまとめてくれて、同じプログラムを書く手間を減らしてくれる機能です。

for文の構成は下記のようになっています。丸括弧内()が繰り返しに関して与える内容で、波カッコ内{}が実行部分です。

	for (初期値; 実行範囲; 実行毎に行う処理) {
		実行部分
	}

上述した実際のプログラムと比較しながら見ていきましょう。

初期値として、 int i = 1; を与えています。今回は i という変数を繰り返し数として使用します。今回は宣言も同時に行っていますが、i を別の部分で宣言してから、ここで i=1; を与えるという書き方もあります。

ただ、第六回の名前空間の章で説明したように、変数の有効範囲は小さいほうが良いです。そのため、for文内でのみ使用する変数 i はfor文を作った際に宣言することが望ましいです。

実行範囲として、 i <= 10 を与えています。これはつまり、iが10以下の場合は繰り返しが実行されることを意味しています。  iが10以下 ということは、i=10 も実行されるので注意しましょう。

実行毎に行う処理として、 i++ を与えています。これはインクリメントというものであり、i=i+1 つまり i に1を足すのと同じ意味です。ループの繰り返し毎に i に1が足されていきます。

実行部分には、 cout << i << endl; として i を画面出力しています。1から10の繰り返しなので、画面には下記のように出力されます。

1
2
3
4
5
6
7
8
9
10

配列

配列とは、いくつかの変数をひとまとめで管理できる型です。一列の本棚のようなイメージで、一つの棚に一つの変数が入ると考えてください。

実際のプログラム例を見ながら理解しましょう。

	const int NUM = 5;

	int IDs[NUM];
	IDs[0] = 10;
	IDs[1] = 20;
	IDs[2] = 30;

const int NUM = 5; の部分でまずNUMという変数を整数型として宣言して、5 を代入しています。NUMは配列の要素数として使用します。まず、ここで初めて出てきた const という修飾子について説明しておきます。

const は constant(一定の)を意味する修飾子です。普通は変数は後で代入操作をすれば中身を変更できますが、const を付けた変数は変更することができません

const で宣言したNUMは配列数として使用します。配列の大きさは基本的にはプログラム中で変更しません。(もし配列の長さをコロコロ変えたい場合は、vector型やlistといった別の機能が使われます)そのため、配列の要素数であるNUMも変更できないように設定してあげる必要があります。

int IDs[NUM]; の部分でIDsという配列を宣言しています。配列の宣言は普通の変数と同じように型を指定します。配列では全ての要素が同じ型になり、今回の例でいうとIDsは全て整数型となります。

IDsの隣についている四角カッコ [ ] は、要素数を入れます。今回は要素数は 5 に設定しており、5つの要素を持つ配列IDsが作成されます。この段階では中身は空です。

IDs[0] = 10; の部分で、配列に値を代入しています。ここでは、配列IDsの0番目の要素に10を代入しています。

ここで注意ですが、配列の番号は0番目から始まります。つまり、5つの要素で構成されている配列IDsは、下記のように0番目から4番目までの要素を持つ配列になります。

初めは要素番号のミスも多いと思うので、配列を扱うときは番号と配列長さを意識してください。

IDs[1] = 20; と IDs[2] = 30; も同様で、1番目の要素と2番目の要素に値を入れています。つまり、今回はIDs

という配列の前から3つの要素に対して値を代入したことになります。

	int IDs2[] = { 100,200,300,400,500 };

配列は宣言と同時に代入を行うことも可能です。上記の部分では、IDsという配列の宣言と代入を同時に行っています。

代入を同時に行うときは、宣言時の配列の要素数は不要です。代入する要素の数に応じて勝手に配列の長さが決まります。上記では、整数型の配列IDsに対して、100,200,300,400,500という5つの要素を格納しています。

	//int IDs[NUM];
	//IDs[0] = 10;
	//IDs[1] = 20;
	//IDs[2] = 30;	

  cout << IDs[0] << endl;
	cout << IDs[1] << endl;
	cout << IDs[2] << endl;
	cout << IDs[3] << endl;
	cout << IDs[4] << endl;

次は配列の画面出力です。ここでは先に宣言したIDsを使用しますので、わかりやすいようにプログラムに宣言と代入操作をコメントで記入しています。

IDsは5つの要素が入る配列として宣言し、0番目と1番目と2番目に値を代入しました。つまり、3番目と4番目は空です。これを画面に出力してみましょう。

各要素の指定は、代入操作と同様です。四角カッコ [ ] に番号を入れて要素を指定します。出力結果は下記のようになります。

10
20
30
-858993460
-858993460

0番目と1番目と2番目 は代入した値が出力されていますが、3番目と4番目は意図していない数値が入っています。

実は、配列は代入操作をしない空の状態でも何かしらの値が既に入っています。そのため、エラーとして現れずに意図しない結果を出力するバグになります。

そのため、配列の宣言と代入を別々で扱うときは、初期化を忘れないように注意してください。これは配列に限らず変数の操作において共通する事ですが、可能であれば宣言と代入を同時に行うようにしましょう。

配列とfor文の組み合わせ

配列とfor文は非常に相性が良いです。配列はたくさんの要素をまとめた変数であり、for文は繰り返しによってたくさんの要素を扱うことができるからです。

	//int IDs[NUM];
	//IDs[0] = 10;
	//IDs[1] = 20;
	//IDs[2] = 30;	

	for (int i = 0; i <= NUM; i++) {
		cout << IDs[i] << endl;
	}

出力結果は下記のようになります。

10
20
30
-858993460
-858993460

for文を使うことで、配列内の全ての要素を画面出力するプログラム部分が5行から3行まで圧縮できました。(NUMの宣言を除く)

for文で宣言した変数 i は、ループ一回ごとに1が足されていきます。そのため、配列とループ回数を両方同じ変数であるNUMに合わせてやると、全ての要素を出力するfor文を作ることができます。

coutを5回繰り返すよりもスマートであり、配列の大きさが100個や200個になってもプログラムが大きくならないのが大きな利点です。そして何より、NUMという変数を変えるだけで配列の大きさも出力のループ回数も変えられるので、プログラムの修正が簡単です。

今回は小さい配列でしたが、for文は途方もない繰り返しも行えます。プログラムを書く際には、今後大きなプロジェクトになる可能性も考えて、できる限りfor文を活用しましょう

for文とif文の組み合わせ

for文とif文を組み合わせることで、更に色々なことができるようになります。可能性は無限大です。

	for (int i = 0; i <= 10; i++) {
		if (i == 3) continue;
		if (i == 7) break;
		cout << i << endl;
	}

このプログラムでは、forループ内で繰り返し回数に応じて特別な処理をしています。

for文としては0から10までのループとしていますが、i=3とi=7のときに特別な処理をすることで下記のような出力結果が得られます。

0
1
2
4
5
6

for文の内容は初めに紹介した通りです。ここでは、i=0を初期値として、i<=10(i が10未満)の範囲で、i++(i を 1 ずつ足していく)というforループを行っています。

ただ、ループ内で if文の処理を行っています。i==3(i が3に等しい時)と i==7(i が7に等しい時)にだけ処理されるような分岐を与えています。

i==3 (i が3に等しい時) のときは、continue という命令を与えています。continue はfor文の一回分のループを飛ばす処理です。そのため、i が 3 のときにはfor文が飛ばされて、画面出力の行が実行されていません。

i==7 (i が7に等しい時) のときは、break という命令を与えています。 break はfor文から抜け出す処理です。そのため、i が 7 になったタイミングで強制的にループから抜け出します。

break では for文の残りループ回数には関係なく強制的にループから抜けます。そのため、例外的な値となった場合(例えばfor文内でユーザーからの入力を受け取って、それが例外な値だった場合など)に適しています。

おわりに

今回はfor文と配列について解説しました。

プログラミングでは大規模なデータを扱うのが基本です。そもそも人間が扱えないような途方も無い処理をするためにPCを使うので、繰り返しと配列は避けて通れません。

逆に言えば、繰り返しと配列をマスターしてやれば、面倒な作業が一気に簡単になるわけです。for文と配列は初心者にとってはちょっと難しいですが、多くの分野で使われます。理解できるまで読み直すことをおすすめします。

重要なポイントは下記のとおりです。

  • for文は有限回の繰り返しを行える
  • for文を使うことで、繰り返しを圧縮できてスマートなプログラムが書ける
  • for文はこのように書ける→ for (初期値; 実行範囲; 実行毎に行う処理) {実行部分}
  • 配列は同じ型の要素をまとめて管理する
  • 配列は宣言時に要素数を指定し、各要素に値を代入する(宣言と代入をまとめて行うこともできる)
  • 配列の番号付けは0番目から始まり、(要素数-1)番目で終わる
  • continue はfor文のループ一回分を飛ばす
  • break はfor文を強制的に終了させる

特にfor文の形と配列の宣言と番号の指定の仕方はよく使うので、覚えておきましょう。

for文はずっと使っていれば普通の書き方には慣れます。ただ、for文は実は初期値を省略したりといった結構イレギュラーな書き方に対応しています。基本を理解していればイレギュラーな書き方による動作も大体予想がつくと思うので、基本を固めておきましょう。

配列は初心者にとっては結構難しいと思います。特に配列の要素番号が0番目から始まり、(要素数-1)番目で終わるというのは慣れないとパッとわかりません。もしまだ納得できていない場合は、ひとまず一度納得できるまでプログラムを色々いじって結果を見てみてください。

次回は関数について解説します。関数を使えば、複雑な機能をひとまとめにして使うことができます。例えば今まで使用してきた入出力ライブラリである cout も関数の一種です。関数を使うことで、中身をしっかりと理解しなくて良いので、会社などの大人数でプログラムを開発することもできます。

関数なくしてプログラミングはできないというほどに重要な項目です。ぜひ下記から学んでいきましょう。

youtubeでも解説してます。今回はちょっと難しかったので、動画でイメージを持つのもおすすめです。