Sárfi BenjáminによるPixabayからの画像
こんにちは。paizaラーニングでコンテンツ制作をしている学生スタッフの兜石です。
オブジェクト指向のプログラミングでは、クラスや構造体を用いることでよりスムーズな開発が可能になります。
しかし、プログラミング学習を始めたばかりの方だけでなく、エンジニアの中にもそれらを使いこなせていない方もいらっしゃいます。皆さんの中にも「苦手意識がある…」という方も多いのではないでしょうか?
そこで今回は、paizaラーニングのレベルアップ問題集に追加された「クラス・構造体メニュー」を使って、クラスの扱いに慣れるための学習法を紹介していきます。
学習の次のステップに進みたいという方も、業務でクラスを使いこなしたいという方もぜひ参考にしていただければと思います!
アンケート:8割が「使いこなせていない」と回答
本題に入る前に、paizaが2021年2月に実施したプログラミング学習に関するアンケート結果から、クラスに対してどのような認識を持っている方が多いか見てみましょう。
当該アンケートでは、「クラスをどの程度使いこなせていますか?」という質問項目を設けていました。
1,034名のpaizaユーザーの皆さまからご回答いただき、その結果「使いこなせていない」が29.7%、「あまり使いこなせていない」が50.4%となり、約80%の方がクラスを使いこなせていないと感じていることが分かりました。
冒頭でもお伝えしたとおり、やはり苦手意識を持っている方が多いみたいですね。
前提:クラス・構造体とは
そもそもプログラミングにおけるクラスや構造体はどのようなもので、どんなときに利用するのか簡単にご説明します。
クラスの概要
ここでは、paizaラーニングで公開している主要なプログラミング言語の基本を学べる入門編講座を参考にします。今回は全編無料の「Python3入門編」から「Python3入門編8: クラスを理解しよう」を使いましょう。
プログラミング言語によって多少異なる点もあるので、ご自分が得意な言語があればそちらの講座をごらんください。入門編講座一覧はこちらから。
クラスを理解するためにはまずオブジェクトを理解する必要があります。
オブジェクトとは、変数とメソッドをセットにしたものです。
クラスからオブジェクトを作って利用します。ちなみにクラスから生成したオブジェクトの実体のことをインスタンスといいます。
イメージとしては…
クラス:オブジェクトの設計図
オブジェクト:クラスから作成したもの
という感じです。
構造体の概要
同様に今度は「C言語入門編」から「C言語入門編8: 構造体を理解しよう」を見ていきましょう。
構造体はデータ型のひとつで、変数をひとまとまりにしたものです。
特徴としては
- 配列と違って、データ型が異なる変数も一緒にまとめることができる
- 構造体の持つそれぞれの変数は「メンバ」と呼ばれる
といったものが挙げられます。
構造体を使うメリットは以下のとおりです。
構造体はクラス同様、設計図のようなもので、宣言しただけでは利用できません。構造体をもとに変数を宣言して利用する必要があります。
ここまで講座の一部を使って説明してきましたが、実際の講座では学習動画と課題を通して、クラスや構造体について実際にコードを書きながら理解できますのでぜひ受講してみてください。
レベルアップ問題集とは
「クラス・構造体メニュー」は、レベルアップ問題集にて公開しています。
レベルアップ問題集とは、プログラミング学習における計算ドリルや漢字ドリルのようなものだと思ってください。
ドリルのようにプログラミング問題を解き進めながら、解答例となるコード(一部言語)や解説文も参照できる*1ため分からないことを理解したり、苦手なポイントを克服したりできるように作られています。
paizaが提供しているスキルチェックとは異なり時間制限がなく、問題文や自分の解答コードを公開することが認められていますので、誰かと協力して取り組むことも可能です。
練習問題集「クラス・構造体メニュー」
今回追加されたクラス・構造体メニューでは、その名の通り、クラスや構造体について学習することができます。なお現在は、C++の解答コード例を公開しています。今後他の言語の解答コード例も追加予定です。
クラス・構造体メニューは、小規模なプログラムであれば自力で書けるようになってきた方に取り組んでいただくことを想定して作成しています。
そのため標準入出力や配列、if文やfor文などの基礎的な文法についてはひと通り理解している必要があります。
標準入力については、言語別で学習講座を公開していますのでこちらの一覧から取り組みたい言語を選択して受講してみてください。合わせてレベルアップ問題集の「標準入力メニュー」「標準出力メニュー」も解いておくとよいでしょう。
基礎文法が理解できているかどうかは、同じく問題集の「配列メニュー」「条件分岐メニュー」を解いて確認してみてください。
出題される問題の特徴
クラス・構造体メニューにはプログラミング問題が全15問用意されています。問題集は3つのセクションに分かれており、各セクションは、1つの「ボス問題」といくつかの「準備問題」によって構成されています。
1つ目のセクションでは「構造体」を、 2つ目のセクションでは「クラス」を扱います。
3つ目は、1つ目と2つ目のセクションで学んだことをもとにクラス・構造体の実践問題を解くセクションとなっています。
クラス・構造体の理解を深めるには、できるだけ多くの問題に触れ、しっかりとした知識を得る必要があります。また問題を解く上では、クラス・構造体のどちらを使うかを自分で考えて欲しいという思いからこの問題構成にしています。
それでは、各セクションで扱われる問題の内容を具体的にみてみましょう。
1:構造体
1つ目のセクションは「構造体」です。
構造体に含まれるひとつひとつの値を「メンバ」といいます。構造体に関する基本的な操作である「メンバの更新」や「メンバの値の比較」などをおこなう問題を用意しました。
このセクションの問題を解けば、構造体の基本的な操作を一通り学ぶことができるようになっています。
2:クラス
2つ目のセクションは「クラス」です。
簡潔に言うと、クラスは構造体に関数を加えたものです。そのためクラスに関連する操作は構造体に関連する操作よりも多いので、クラスの操作を 1 つ 1 つ学ベる問題を用意しました。
「クラスの作成」から、「コンストラクタ」「継承」などのクラス特有の操作や値を扱っています。
このセクションの問題を解けば、クラスの基本的な操作を一通り学ぶことができるようになっています。
3:構造体・クラスの実践問題
3つ目のセクションは「構造体・クラスの実践問題」です。
このセクションでは、前の2つのセクションで学んだことを活用すると綺麗に解くことができる問題を用意しました。
中にはレベルの高い問題もあるので、問題文の「どの部分」を「構造体とクラスのどちらで扱うか」をみなさん自身で考えていただけたら嬉しいです。
例として、このセクションで扱っている問題「ロボットの暴走 (Aランク相当)」をご紹介します。
問題:
paiza 株式会社では、物品の管理のために上の図のような座標系の H * W マスの工場 で 番号 1 〜 N が割り当てられた N 台のロボットを運用していました。ところがある日、全てのロボットが暴走してしまいました。各ロボットは性能ごとにレベル分けされており、次の通り移動距離が決まっています。
Lv1 : 特定の方角に 1 マス進む
Lv2 : 特定の方角に 2 マス進む
Lv3 : 特定の方角に 5 マス進む
Lv4 : 特定の方角に 10 マス進むまた、工場のマスのうち 10 マスには工具箱が置かれており、移動後にそのマスにロボットがぴったり止まっていた場合、そのロボットのレベルが 1 上がってしまいます(最大レベルは 4)。
レベル l のロボットの初期位置が工具箱の置かれているマスであったとしても、そのロボットのレベルは l で始まることに気をつけてください。幸い、工具箱の置かれているマスと各ロボットの位置とレベル、また、どのロボットがどのような順番でどの方角に移動するかの情報はわかっているので、ロボットの移動が K 回終わったときの各ロボットの位置とレベルを推定してください。
入力される値:
H W N K
lx_1 ly_1
...
lx_10 ly_10
x_1 y_1 l_1
...
x_N y_N l_N
r_1 d_1
...
r_K d_K
- 1 行目では工場の南北方向のマス数 H , 東西方向のマス数 W , ロボットの数 N , ロボットの移動回数 K が半角スペース区切りで与えられます。
- 続く 10 行のうち i 行目では、i 個目の工具箱が置かれたマスの x , y 座標 x_i , y_i が与えられます。(1 ≦ i ≦ 10)
- 続く N 行のうち i 行目では、 番号 i のロボットの初期位置の x 座標 x_i , y 座標 y_i , レベル l_i が半角スペース区切りで与えられます。
- 続く K 行のうち i 行目では、 i 回目の移動を行ったロボットの番号 r_i と移動の方角 d_i が与えられます。
期待する出力:
i 番のロボットの最終的な位置 x_i , y_i とレベル l_i を i 行目に出力してください。
x_1 y_1 l_1
...
x_N y_N l_N
条件:
- 5 ≦ H , W , N , K ≦ 10^5
- 0 ≦ lx_i < W , 0 ≦ ly_i < H (1 ≦ i ≦ 10)
- 0 ≦ x_i ≦ W , 0 ≦ y_i ≦ H , 1 ≦ l_i ≦ 4 (1 ≦ i ≦ N)
- 0 ≦ r_i ≦ N-1
- d_i は "N" , "S" , "E" , "W" のいずれか (1 ≦ i ≦ K) で、それぞれ 北・南・東・西 へ移動したことを表す。
- ロボットは工場から出ないことが保証されている
いきなりこの問題文を読もうとすると、「複雑で難しそう……」と億劫になってしまうかもしれませんが、このような大規模なプログラムをわかりやすく整理する際に構造体・クラスはその真価を発揮します。
じっくりと時間をかけて、順番に取り組んでいただけたら嬉しいです。
不安に思った構造体・クラスの操作があった場合は前の2つのセクションに戻ったり、paizaラーニングの各言語の入門編にあるクラスについての講座を振り返ることで学習効果が大きくなります。そちらもぜひ活用してみてください。入門編講座一覧はこちらから。
まとめ
レベルアップ問題集に追加された「クラス・構造体メニュー」について紹介してきました。
今まで苦手意識のあった方はもちろん、さらに理解を深めたい方にもおすすめの問題集となっています。解説や解答コード例も参考にぜひ何度もチャレンジして力をつけていってくださいね。
プログラミングを始めたばかりで問題集の内容が難しいと感じた方は、まずは基礎文法からしっかり身につけるのもよいでしょう。
paizaラーニングでは、Python・PHP・Ruby・Java・C・C#・JavaScriptの7言語の入門講座を公開していますので、ぜひご活用ください。
練習問題をたくさん解いたあと、そろそろ自分のプログラミング力を腕試ししてみたい!という方は、時間制限ありのスキルチェックにもチャレンジしてみてください。
詳しくはこちら
*1:ただし、それらを閲覧するためには学習チケットが必要となります。チケットは毎日初回ログイン時に1枚付与され6枚まで所持できます。(有料会員の場合はチケットの消費なしで閲覧可能です)