レベルエンター代表山本大のブログ

面白いプログラミング教育を若い人たちに

Javaオブジェクト指向以降の練習問題

研修やってるので覚書

 

課題1 配列

 パッケージ ex_arrayを作成。

 クラス UserSide を作成し、public static void main メソッドで以下を作成

 String配列を作成 String member = new String[3];

 member[0] = "山田花子";

 member[1] = "10";

 member[2] = "90";

「社員番号10番山田花子スコア90点」と表示。

 

課題2 インスタンス

 パッケージex_instanceを作成

 クラス Memberを作成

 フィールド String name;

 フィールド int member_no;

 フィールド int score;

を持たせる。

 

クラス UserSide を作成し、public static void main メソッドで以下を作成

Member型の変数memberを作成して、インスタンスを代入。

member.name = "山田花子";

member.member_no = 10;

member.score = 90;

 

各フィールドからデータを取得して

「社員番号10番山田花子スコア90点」

と表示。

 

 課題3 複数のインスタンス

パッケージex_instance

(課題2のクラスMemberを利用する)

 

クラス UserSide を作成し、public static void main メソッドで以下を作成

Member型の変数member1を作成して、インスタンスを代入。

member1.name = "山田花子";

member1.member_no = 10;

member1.score = 90;

 

Member型の変数member2を作成して、インスタンスを代入。

member2.name = "鈴木一郎";

member2.member_no = 9;

member2.score = 100;

 

Member型の変数member3を作成して、インスタンスを代入。

member3.name = "田中三郎";

member3.member_no = 15;

member3.score = 10;

 

各フィールドからデータを取得して

「社員番号10番山田花子スコア90点」

「社員番号9番鈴木一郎スコア100点」

「社員番号15番田中三郎スコア10点」

と表示。

 

課題4 メソッド

パッケージex_instance

(課題2のクラスMemberを利用する)

 フィールド String name;

 フィールド int member_no;

 フィールド int score;

を持たせる。

 

メソッド showNameAndScore()を作成

「社員番号 + member_no + 番 + name + スコア + score + 点」

と表示するように作成

 

クラス UserSide を作成し、public static void main メソッドで以下を作成

Member型の変数member1を作成して、インスタンスを代入。

member1.name = "山田花子";

member1.member_no = 10;

member1.score = 90;

member1.showNameAndScore()を呼び出し

 

課題5 メソッド パターン1(引数なし・戻り値なし)

パッケージex_method

クラス Light

メソッド lightOn を作成。(引数なし、戻り値なし)

 このメソッドでは「ライトをつけました。」と表示する。

メソッド lightOff を作成。(引数なし、戻り値なし)

 このメソッドでは「ライトを消しました。」と表示する。

 

クラス UserSide を作成し、public static void main メソッドで以下を作成

Light型の変数lightを作成して、インスタンスを代入。

lightOnメソッドを呼び出し

lightOffメソッドを呼び出し

 

課題6 メソッド パターン2(引数あり・戻り値なし)

パッケージex_method

課題5のクラス Lightを利用

 Lightにフィールド boolean 型のisLightOn を持つ

 

 Lightにboolean型の引数 isTurnOn を渡すメソッド、戻り値のないメソッドとして、lightSwitchを作成。

 trueを渡して呼び出すと「ライトをつけました。」と表示。

   フィールド isLightOn をtrueにする。

 falseを渡して呼び出すと「ライトを消しました」と表示する。

   フィールド isLightOn をfalseにする。

 

クラス UserSide を作成し、public static void main メソッドで以下を作成

 Light型の変数lightを作成して、インスタンスを代入。

 lightのlightSwitchメソッドにtrueを渡して呼び出す

 lightのlightSwitchメソッドにfalseを渡して呼び出す

 

課題7 メソッド パターン3(引数なし・戻り値あり)

パッケージex_method 

課題6のクラスを利用

 Lightにメソッド reportLightStatus を作成。引数なし、戻り値Stringとする。

 このメソッドを呼び出すと、

 isLightOnのフィールドがtrueなら「現在のライトの状況はONです」と返し

 isLightOnのフィールドがfalseなら「現在のライトの状況はOFFです」と返す。

 

クラス UserSide を作成し、public static void main メソッドで以下を作成

 Light型の変数lightを作成して、インスタンスを代入

 lightのlightSwitchメソッドにtrueを渡して呼び出す

 lightのreportLightStatusメソッドを呼び出す

 lightのlightSwitchメソッドにfalseを渡して呼び出す

 lightのreportLightStatusメソッドを呼び出す

 

課題8 メソッド パターン4(引数あり・戻り値あり)

パッケージex_method

 課題7のクラス Lightを利用

 Lightにフィールド int型の lightness を作成5で初期化

 Lightにメソッド lightnessUpTo を作成

 引数 int型 upを引き渡す。

 引き渡されたupをlightness変数に+した数字でlightnessを更新

 戻り値 更新後のlightnessの数字

 

クラス UserSide を作成し、public static void main メソッドで以下を作成

 Light型の変数lightを作成して、インスタンスを代入

 lightnessUpToメソッドに、3を渡す。

 戻り値を変数 currentLightness に受け取る

 「明るさをあげました。現在の明るさは + currentLightness + です」と表示

 

課題9 コンストラクタ

パッケージex_constructor

 パッケージ「ex_instance」のクラスMemberをコピーする

 

コンストラクタ

 Member(String n, int no, int s)

 を作成。

 name = n

 member_no = no

 score = s

 を処理

 

クラス UserSide を作成し、public static void main メソッドで以下を作成

Member型の変数memberを作成して、コンストラクタによりインスタンス生成。

Member( "山田花子", 10, 90)

「社員番号10番山田花子スコア90点」

と表示。

 

課題10 総合

パッケージ ex_move

クラス MiniRobot

 フィールド String sprite = "A" <-文字はなんでもいいです。

 メソッド

  display():引数なし/戻り値なし

   System.out.print()メソッドを使ってspriteを表示する

クラス Start

 public static void main メソッドで以下を作成

 MiniRobot型の変数roboを作成して、インスタンスを代入。

 roboのdisplay()メソッドを呼び出す

 

課題11総合

課題10のMiniRobotとStartを利用

MiniRobotに以下を追加

 フィールド int x 初期値10;

 フィールド int y 初期値0;

メソッド

 display()を改造

  spriteを表示している行の前に

  x個分のスペースをSystem.out.print()メソッドを使って表示

  

 

課題12総合

課題11のMiniRobotとStartを利用

MiniRobotに以下を追加

 フィールド int windowHight 初期値100;

 フィールド int windowWidth 初期値100;

メソッド

  display()を改造

  x個分のスペースをSystem.out.print()メソッドを使って表示したコードの前に

  windowHeight ぶんの改行コードを出力するコードを追記

 (改行コードの出力はSystem.out.println()を引数なしで呼び出す)

 

課題13総合

課題12のMiniRobotとStartを利用

MiniRobotに以下を追加

メソッド

 moveRight() :戻り値なし/引数なし

   処理:xを+1して、xを上書きする

 inputMoveString(String input):戻り値なし/ 引数 String型のinput

   処理:

   input が"d"だったら、this.moveRight()を呼び出す

 

クラス Start

インポート文 import java.util.Scanner; を追加

 

mainメソッドの処理を以下にする。

 

import java.util.Scanner;

public class Start {
  public static void main(String args) throws Exception{
    Scanner sc = new Scanner(System.in);
    Man m = new Man();
    while(true){
      m.display();
      m.inputMoveString(sc.next());
    }
  }
}

 

 *コンパイルして実行 d + Enter で移動します

 *ストップ  Ctrl + c

 

課題14総合

課題13のMiniRobotとStartを利用

MiniRobotに以下を追加

メソッド

 moveLeft() :戻り値なし/引数なし

   処理:xを-1して、xを上書きする

 

 inputMoveString(String input):戻り値なし/ 引数 String型のinput を修正

   処理:

   input が"d"だったら、this.moveRight()を呼び出す

   input が"a"だったら、this.moveLeft()を呼び出す

 

課題15総合

課題14のMiniRobotとStartを利用

MiniRobotに以下を追加

メソッド

 moveUp() :戻り値なし/引数なし

   処理:yを+1して、yを上書きする

 moveDown() :戻り値なし/引数なし

   処理:yを-1して、yを上書きする 

 

 display()メソッドを改造

  spriteを表示しているコードの後に、

  y個分の改行コードを出力するコードを追記

 (改行コードの出力はSystem.out.println()を引数なしで呼び出す)

 

 inputMoveString(String input):戻り値なし/ 引数 String型のinput を修正

   処理:

   input が"d"だったら、this.moveRight()を呼び出す

   input が"a"だったら、this.moveLeft()を呼び出す

   input が"w"だったら、this.moveUp()を呼び出す

   input が"s"だったら、this.moveDown()を呼び出す

 

 

 

 

 

 

初心者にプログラミングを教える時の例集

 

do while

 テストと追試

  →40点以下再試験。

  テスト1回目は、全員必ず受けるが、40点以下なら再試験。

  再試験でまだ40点以下なら再再試験。40点を超えるまで繰り返し。

 

多次元配列:

 表や立方体を例えに出すと、4次元で詰むので

 リストの中にリストが入っている例として「新幹線の座席」を使う

 ABCDEの列が20列ならんでいることと、そういった配列が

 1−16号車まで並んでいる。

 そういった車両が、のぞみxxxなどと番号づけされている。

 

インスタンス・オブジェクト

 同一型のデータ集合である配列と比較して、

 各データに名前付き・型付きのデータ項目が持てる。

 おまけに、そのデータを専門に扱う処理が書ける。

 

参照型

 フォルダの実体とショートカット。ショートカットで開いて操作したら、

 サーバーの実体が更新される。

 

抽象クラス・インターフェイス

 人事部や学校の先生から配られる、日報フォーマットやテストの回答用紙。

 抽象メソッド部分が記入欄で、配られた側は記入欄のみを記載する。

 抽象メソッドを実装することが強制され、使う側はルールに乗っ取っていることを

 インターフェイスは、抽象メソッドのみの集まり、ルールセット。劣化しにくい

 抽象クラスは、式やマクロ入りのテンプレート。

 マクロ入りや式入りは経年劣化やバグの可能性あり、取扱注意。

 

メソッド

 なんどもやる仕事を名前をつけて定型化

 例えば、日直の仕事の定型化

 ホワイトボードを消す、終業後消灯する。帰宅後チェックリストによるチェック。

 掃除して()

  ぬいぐるみをタンスにしまう。

  ブロックを箱にしまう。

  拭き掃除をする。

 

メソッド引数なし、戻り値なし。

 →消灯する。(メソッド名のみ)

 

定義側

class DayDuty{

  void lightsOff(){

     // 消灯処理

  }

}

 

 

呼び出し側

 DayDuty dd = new DayDuty();

 dd.lightsOff();

 

 

メソッド引数あり、戻り値なし。

 →テスト配って()

class DayDuty{

  void passOut(Test[] tests ){

     // テスト問題を配る

  }  

}

 

メソッド引数なし、戻り値あり。

 →昨日のチェック結果を報告して()

 →テスト答案回収して()

 

メソッド引数あり、戻り値あり

 →300円で、パン買ってきて()

 →テストを配って、回収して()

 

オーバーロード

 コピーしろと命令、渡すものが紙なのかパソコンなのかで、

 仕事をする側は動きが異なる。紙ならコピー機でコピーする

 パソコンならハードディスクをコピーする。

 

カプセル化

 携帯電話の電波の3本線表示を勝手に操作できたとしても意味がない。

 内部処理を反映した結果だから意味がある。

 →操作させないことも大事。

 

インターフェイス(ルールブック)

 日直の仕事とは(ルールブック)

 人事部は、誰が日直だとしてもルールを教えたはずの前提なので、

 ルール通りに命令する。

 → 朝会仕切れ()など

  

インターフェイスの役割

 コンポーネント(再利用可能な独立部品)のつなぎ目。

  つなぎ目を規格化するもの

 

インターフェイスを複数持つ意味

 パソコンだと、USBやHDMIVGAなど複数のインターフェイスの実装を持つことができるようなもの。

 

 ポリモフィズム

 屋台街でくれと言ってまわる

 

 

 

Computational Thinking

プログラミングを学ぶことの上位目的としてComputational ThinkingCT/計算論的思考)という言葉が使われることがあります。

 

CTとは、問題解決や問題分析の手法だと捉えたほうがよく、プログラミングそのものとは切り離してあらゆるシーンで使うことができる考え方です。

プログラミングを子供達に教えることの意義は、色々と言われますがこのCTをしっかり身につけることが良いと考えています。

 

CTの分類は諸説あるながら、以下のブログで解説されている分類がとてもしっくりくるので引用させていただきます。

Computational Thinkingとは何か - 小さなごちそう

 

1. Decomposition(問題の分解)

 複雑な問題を解決可能なレベルまで分解すること。

 

2. Pattern Recognition(パターンの発見)

 周期性や法則性を見抜くこと。

 

3. Abstraction(抽象化)

 枝葉を切り落として重要な要素だけを抜き出すこと。

 

4. Algorithm Design(手順化)

 ステップバイステップで、問題解決の手順を明らかにすること。

 

 

話は少し変わって、コンピューターはちょうど、4歳の子供とそっくりだなと思います。

4歳の子供は「掃除」をしなさいと言われても、何をするべきかピンと来なかったりします。

「木のおもちゃは木箱に入れて、人形はプラスチックケースに入れて」と具体的に分解すること(Decomposition)をやってあげると、理解してきちんと動けるようになります。

 

 

私と仕事どっちが大事なの問題

「仕事と家族」(または若い人にとっては「仕事と恋人」)という2つの優先順位の違う世界をいかに上手く過ごすかという問題はとても大事だ。

 

しかし難しいことに、この2つの価値基準はまったく異なっている。

 

仕事は、利己的。

仕事は、自分の生きがいとして重要。つまり自己実現や承認やらといった、自己肯定のために重要。世のため人のためと言うのは勝手だけれど、家族や恋人と比較すると、どうしても利己的なのだ。それぐらい家族が人にとって重いとも言える。

 

家族や恋人は、社交的。

家族や恋人は、一番近くの社会であり重要。人間は人と関わるからこそ人間であり、その最重要な要素は家族や恋人。

 

これらのバランスをとるために、最も大事なのはバランスを取ろうとすることだと思う。でも完全な50:50は難しいから、51:49ぐらいの比率をもってみるのが良い。

どっちが51かを決めるのは自分。

 

いずれにしても、このバランスを取ろうとすることは両方を高みに登らせる唯一の手段だと思う。

 

バランスというのは、多分それを見ようとすることから始まると思う。

 

自分たちらしい入社誓約書

入社誓約書って、結構会社のカラーが出ると思います。そこで自分たちらしい誓約書を作ってみようかと思います。

まずは僕だけの意見で作ってみて、社員さんたちと相談して更新しながら実際に使っていこうと思います。

 

【入社誓約書】

  1. 上機嫌で仕事をすることを心がけます。機嫌が悪いところを同僚や部下に見せないようにします。
  2. 育てることを仕事にします。対象はお客さんも仲間も自分もです。
  3. 任されたら責任を持ってやり抜きます。仲間には信頼して任せます。
  4. 責任を追求せず、問題を解決します。
  5. 怒ったり叱ったりしません。一緒に問題を解決します。
  6. 失敗をチェンスと考えます。失敗した人にも必ずもう一度チャンスを与えます。
  7. 自分で判断します。
  8. やばかったら助けを求めます。やばそうなら助けます。
  9. 時間や約束は守ります。
  10. 自分と家族と仲間の健康を何より大事にします。
  11. 依頼を受けて仕事をするのではなく、提案して仕事を作ります。
  12. 常に学びます。仕事とは関係ないことを学びます。
  13. 独立心を持ちます。会社に依存せず起業も視野にいれます。
  14. タバコは吸いません。
  15. 退職してからも仲良くします。

それでは。

3期目に向けて

代表取締役の山本です。
7月1日より、レベルエンターは3期目がスタートしています。

 

2期目は、山あり谷ありの1年でしたが、新しい戦力がふえ、仕事も着実に安定してきていて、いろいろと取引の幅も広がりました。
前期は多くの旧知の方々にたすけられました。特に、いろいろな元教え子さんたちが協力してくれているのが本当に心強く嬉しいです。苦しい時に助けてくださった方への恩返しはこれから自分たちの力をつけながら日々忘れずに取り組んで行きます。


新しく知り合えた方々とも、多くは数年来の仕事仲間のような気持ちになれる人ばかりでした。
「おかげさまで」という言葉が心から湧いて出てきます。

3期目はたくさんの希望があり、いまからワクワクしております。

 

弊社では「楽しみながら」「プログラミングを学ぶ」を突き詰めてきました。
・面白い・楽しいとはなんだ?
・プログラミングを学ぶことの意義は?

同じ面白いでも「興味深さ(interst)」と「楽しい(fun)」は異なります。

学びの面白さは、興味深さ(interst)が中心ではあると思います。

 

しかしながら、楽しい(fun)でなければ気持ちが動かされず、
内容が難しくなって来ると気持ちがついていかなくなってしまうのではないでしょうか。

だからまずは楽しさ一辺倒で良くて、やれることのパズルのピースがうまっていくとだんだんと興味が芽生えて来るという、流れが楽しく持続する学びなのではないかと考えています。

 

funをたくさん用意して、interstを掻き立てるところが、後押したいところです。

より興味深くなるような遊び方を教えること
より楽しくなるような遊び方を教えること。

これらのテーマを突き詰めていくことが我々のミッションの一つです。

 

まず小学生に教えることから始めています。
彼らに面白いと思ってもらえて、熱中してもらえて、力にしてもらえたなら
次のステップに導きます。

 

ちょうどいいステップが、初心者には多くは用意されていません。
または途中で急にハードルがあがってしまうステップしかありません。
それでは持続する楽しさは生まれないと思います。
適切なステップを作り出していくことをやっていきたいです。

 

コンピューターテクノロジーの世界は、これから世界そのものになっていくように思います。

コンピューターやそれらを中心とした様々なテクノロジーは、もはや自分たちの生活を取り巻く全てに関わってきています。
だからテクノロジーとの対話の方法を知ることは、とても意義深いと考えています。

 

自転車に乗れるように、やりたいと思った人、だれでもがプログラミングができるようになる世界。そういった世界の実現を目指したいと思います。

そしてその世界が実現したあとにみえてくるのは、テクノロジーで解決するための課題を見つけ出すこと。それも面白いんです。

 

自転車に乗れるようになったら、どこか遠くへ行きたくなりませんか?
隣町に繰り出したら世界が広がります。
プログラミングを学ぶと、そういう世界の広げ方ができます。

 

テクノロジーの世界は、加速度的に広がっていて、重要度がとてつもなく上がっている。だから、広い世界を旅できるように我々は、テクノロジーの世界の語学を教えたいのです。

面白い対象は、人それぞれ異なるでしょうけれど、世界が広がる体験は、とても面白いと思います。

 

「楽みながらプログラミングを学ぶことで、新しい可能性の入り口を開きます」

プログラミング学習で、本当に論理的思考が身につくか?

プログラミングを学ぶことでつく力ということで、「論理的思考」という言葉が使われることがあります。

 

でも論理的ってどういうことでしょうか。私は、はっきり定義をしらべたり教えてもらったりしたことはなく、なんとなく理解しているつもりになっていました。

 

教育の分野では、プログラミングで身につくのは「プログラミング的思考」だとされていますが、ますますよくわからないですね。

 

とりあえず、だれかがとってつけたプログラミング的思考についてはおいといて、「論理的思考」とは何なのかをきちんと自分の言葉にしたいと思います。

 

でも最初の1歩は、Wikipediaの力をかります。

 

論理学 - Wikipedia

ここでいう論理とは、思考形式及び法則である。これに加えて、思考のつながり、推理の仕方や論証のつながりを指す。よく言われる「論理的に話す、書く」という言葉は、つながりを明確にし、論証を過不足なく行うということである。

 

論理的であるというのは「論証」がキーになりそうですね。論証は「正しく説明が出来る」と言い換えてもよいのではないでしょうか。

論理の説明に「推理」も含まれますね。推理とは何でしょうか

 

すいり【推理】の意味 - goo国語辞書

既にある事実をもとにして、まだ知られていない事柄をおしはかること。

 

あてずっぽうの予測ではなく、実験結果や法則性、根拠のある資料などの事実をもとにして、考えるということですね。

 

つまり論理的であるということは、

事実(実験結果や法則性、資料など)を基に説明を過不足なくつなげられることであり、まだ知られていない事柄であっても事実を根拠に推し量って説明ができること

のようです。

 

論理的思考能力という言葉は、ヒトくくりになりすぎていそうですね。

私なりに分解してみます。

 

・事実を導き出す力

・事実を元に考える力

・説明する力

・過不足なく説明をつなげる力

・未知の事柄を、事実を根拠に推し量る力

 

こんなところでしょうか。

 

では、プログラミングで論理的思考は学べるのでしょうか。ひとつずつ考えてみます。

 

  • 事実を導き出す力

プログラミングでは資料や短いコードにより実験によって、そのコードはどのような動きをするべきかを確認しつ組み立てる必要があります。実験的に短いコードを実行してみたり、信憑性の高いドキュメントを確認する癖をつけられれば、「事実を導き出す力」は、プログラミングを学ぶ過程である程度は学べそうですね。

 

  • 事実を元に考える力

プログラミングでは「実現したいこと」は答えが示されているわけではなく、短いコードや機能の組み合わせで作り出します。実験結果やドキュメントの組み合わせを元にどうすれば求めるものが実現できるのか?を考えなくてはプログラミングはできないので、「事実を元に考える力」もプログラミングを学ぶ過程である程度は学べそうですね。

 

  • 説明する力

プログラミングそのものでは、説明する力は身につかないかもしれません。

作ったプログラムのプレゼンテーションなどによって身に着けたいですね。

 

  • 過不足なく説明をつなげる力

作ったプログラムのプレゼンテーションをする際に、論理の飛躍がないように気をつけられればよいのですが、プログラミングを学んだからといって、過不足なく説明がつなげられるとは限りませんね。説明を過不足なくつなげるには、説明をしてみて反応のフィードバックをえることや、そもそも国語の作文などを学ぶ方が近道かもしれません。

 

  • 未知の事柄を、事実を根拠に推し量る力

プログラミングの作業中は作ったもののバグや問題が次々と発生します。それらは学ぶ人にとってはすべてが未知の事項であることでしょう。バグや問題を解決するとき、事実を元に試行錯誤していきますが、当てずっぽうからだんだんと根拠を元に推し測っていけるようになっていきます。「未知の事柄を事実を根拠に推し量る力」は、プログラミングを学ぶことで一番学べそうな領域かなと思います。 

 

それにしても、単にプログラミングが出来るようになるまで学んでも、上記のような論理的な思考が学び取れるかどうかは学び方次第といえそうです。

 

レベルエンターで行っている教育も、現時点では「プログラミングを学んで論理的思考が身につく」とはいえないので、ここを強化したいと思います。