エンジニア端くれ。

それに所属してはいるが、末に連なるつまらぬ者。末輩。

hello world をやる意味

入門で必ずやる"hello world"

プログラミングの勉強を始めると、必ずやらされるのが"hello world"。
画面に"hello world"と表示させるだけで簡単なプログラムであるが、これをやる意味を初心者が自発的に理解するのは難しい。

私は大学の授業で"hello world"を始めて実行したとき、「入力した文字が出るのだから当然じゃん。意味なくねー?」と思った。

"hello world"をやって何になる?

プログラム、またはプログラムを実装するもの(PC、マイコン、アプリケーション…)は全て次の動作を行う。

  1. プログラムにデータを入力する
  2. データを処理する
  3. 処理したデータを出力する

例えば体重計であれば、以下のような動作になる。

  1. 重さをデータにしてプログラムに入力する
  2. データを計算する
  3. データを表示する

"hello world"はこの流れをもっとも簡単に把握できるプログラムである。
その動作を理解できることに意味があり、授業や入門書で必ず触れるようになっている(と思う)。
ただ、講義や入門書でその説明がない場合があるので、意味を感じにくい。
以下は"hello world"の動作。

  1. "hello world"を入力する *1
  2. "hello world "が表示される

"hello world"の次

"hello world"が出来た。
何かやりたいことがあるのだが…次はどうすればいいか?

入力をデータにすることを考えてみよう。

データにすれば、計算や処理ができるので何とかなる。
重さ、タッチ反応、加速度でも、なんでも。

「入力ってそもそも何よ?」とか「どうやってデータにするんだ?」という知識がないと、プログラム作成で躓いてしまう*2
以下は入力とデータに変換する方式のヒント。参考になれば幸い。

例:「やりたいこと」→「変換方式」→「出力」

  • 温度を数値化して表示したい→温度センサをつかってデータを取得 *3→処理して表示
  • スマホのタッチ反応を感知したい→ライブラリを使ってタッチを感知*4→感知後関数処理
  • twitterを自動で呟きたい→呟き内容を入力してAPIに渡す→自動で呟くように処理

参考文献

汎用的な考えとして、以下の書籍を紹介する。
読むのに中学数学の知識が必要であるが、比例や合同の知識はプログラム作成の上で必修だと思っている。

いかにして問題をとくか

*1:表示するだけなので計算や処理はこの場合無い

*2:データ変換は恒常的な問題と思う

*3:プログラムを使ってセンサと通信しデータを取得する

*4:ライブラリは処理を行ってくれるプログラム

Processing 収縮拡大する円

やりたかったこと

動きがあるクラスを作って描画をする。

描画するもの

円クラスを使って、複数個の円に同じ動きをつける。

動き

  • 広がる/縮む
  • 移動する

インスタンス化した円が広がったり、移動したりする。

f:id:daigakuinnsei:20180708180733g:plain

コード

Circle c1,c2,c3,c4,c5,c6;    //decalation
int clr_back = 255;          //color of background. 255 = white

void setup(){
  size(400,400);
  smooth();
  background(clr_back);
  frameRate(50);
  
  c1 = new Circle();        //making 6 instances
  c2 = new Circle();
  c3 = new Circle();
  c4 = new Circle();
  c5 = new Circle();
  c6 = new Circle();
}


void draw(){
 c1.updateMe(255,0,0);    //calling 6 the method of the instance
 c2.updateMe(0,255,0);
 c3.updateMe(0,0,255);  
 c4.updateMe(255,255,0);
 c5.updateMe(0,255,255);
 c6.updateMe(255,0,255);  
}


class Circle {
  float clr_r,clr_g,clr_b;    //for color
  float x, y;                 //for axis
  float radius;
  int rad;      
 
  Circle () {
    x = random(width);
    y = random(height); 
    rad = 10;
  }
  
  void updateMe(float clr_r,float clr_g,float clr_b){
    noStroke();
    fill(clr_back);                                //paint it white the ellipse before writing
    ellipse(x, y, radius * 1.05, radius * 1.05);
    radius = abs(sq(sin(radians(rad)))) * 200;    //caliculate next radius
    rad = rad + 1;                                //caliculate next radian
    if(rad == 170){                               //return the radian
      rad = 10;
      x = random(width);                          //remove
      y = random(height);
      background(clr_back);
    }
    fill(clr_r,clr_g,clr_b);
    ellipse(x, y, radius, radius);                //paint the ellipse       
  }
}

ソースの流れ

  1. setup(ウィンドウやインスタンスの作成)
  2. draw(インスタンスをアップデートし描画する)
  3. その他(Circleクラスの作成)

個人的ポイント

  • abs(sq(sin(radians(rad)))) * 半径

sinの2乗を円の半径にかけることで、円の収縮動作が弾むようになる。

[普及版]ジェネラティブ・アート―Processingによる実践ガイド

Python __init__ コンストラクタ

コンストラクタ

コンストラクタは、インスタンスを作成したときに実行されるメソッド。
実際にインスタンスを作成したときに、その内容が実施されているかどうかを確かめてみる。

#main_1-1.py
class Parent():
	def __init__(self):
		print("こっちはインスタンスのprint")
	def PrintInfo(self):
		print("こっちはPrintInfoメソッド,print")

	
TEST = Parent()	
TEST.PrintInfo()		

'''
[実行結果]
こっちはインスタンスのprint
こっちはPrintInfoメソッド,print
'''

説明

インスタンスの作成文以外には
TEST.PrintInfo()
の1行しかない。

しかし、出力として
「こっちはインスタンスのprint」
「こっちはPrintInfoメソッド,print」
という具合に2行出力されている。

「こっちはインスタンスのprint」が出力されるのは、インスタンス作成時に
"__init__"がコンストラクタとして動作し、def内のprintが実行されているためである。

このようにコンストラクタはインスタンス作成時に動作する。

このコンストラクタを使って、インスタンスを作成したとき、そのインスタンスの初期値(引数)を設定する。

#main_1-2
class Parent():
	def __init__(self,txt1):
		self.txt1 = txt1
		print(str(txt1))

TEST = Parent("コンストラクタ!")	

'''
[実行結果]
コンストラクタ!
'''

入門 Python 3