その漫画自炊オタクはImageJマクロに恋をする

プログラミングを用いた、自炊漫画の画像処理

【ImageJマクロ超入門】#3 for, whileで繰り返し処理

 

f:id:yu3xx:20210503062040j:plain


皆さまこんにちは。

好きな写真集は°C-ute中島早貴さんの「 N20 」です、yu3xx(ゆーさんちょめちょめ)です。

 

 

 前回のおさらい



前回はフォルダ内全画像自動処理を例にした実践的な内容でした。今回はプログラミングでは避けては通れない繰り返し処理」の話です。 

 

 

 もくじ

 

 

繰り返し処理は2種類ある

 

ImageJでの繰り返し処理は大きく分けて2つあります。

 ① for を使う繰り返し処理

 ② while を使う繰り返し処理

 

前回の内容では「for」の繰り返し処理を使いました。私個人としては「for」を使った繰り返し処理のほうが書きやすいと思っています。

 

どちらの繰り返し処理も多くの場合、書き方次第で同じような処理を実行できます。

 

使い分けとしては、

 ・繰り返す回数がわかっているなら「for」

 ・繰り返す回数がわからないなら「while」

と考えておおよそ問題ないと思います。

 

プログラミングと関係のない話で例えると、「バット素振りを毎日必ず100回!と決まっているならfor」「スイングスピードが150km/hに達するまでひたすら素振り!ならwhile」って感じです。

  

「for」を使った繰り返し処理

 

基本形はこちら。


for(初期値; 繰り返しの条件; 1ループ終了後の増分){ 繰り返し処理 }

 

「初期値; 繰り返しの条件; 1ループ終了後の増分」という、ループに関する設定が基本形に組み込まれているというのが特長です。

 

例えばこんなコードです。

//example 3-1

for(a=0; a<3; a=a+1){
	print(a);
}

「 aを0から、3未満までの条件で、1回ずつ1増やしながら、変数a中身を繰り返し表示する」というループです。実行するとこうなります。

f:id:yu3xx:20210503062916p:plain

つづいての例。 

//example 3-2

for(i=1; i<10; i++){
	print("i = ", i);
}


ここで注目してもらいたいのは「i++」という書き方です。これは「i = i +1」の略で、インクリメントといいます。打ちやすいのでよく使います。

あとはprintの使い方です。「コンマ(,)」で区切ることで、複数の情報を1列で表示できます。ここでは文字列「i =」に続いて、「変数iの中身」を表示しています。 

実行結果

f:id:yu3xx:20210503065759p:plain

「while」を使った繰り返し処理

whileの繰り返し処理には、書き方が2つあります。

 ① while〜


while(条件){
	繰り返し処理
}

 ② do... while〜


do{
	繰り返し処理
}while(条件);

 

違いは「条件に適しているかどうかの判断」「繰り返し処理の前」にあるか「繰り返し処理の後」にあるかです。

 どちらも「ある場合」を除き全く同じ処理をします。「ある場合」についてはのちほど説明します。

 ① while〜

//example 3-3

i = 1;
sum = 0;

while(sum < 100){
	ii = i * i;
	sum = sum + ii;
	print(i,",", sum);
	i++;
}

print("oshimai");

 ② do... while〜

//example 3-4

i = 1;
sum = 0;

do{
	ii = i * i;
	sum = sum + ii;
	print(i,",", sum);
	i++;
}while(sum < 100);

print("oshimai");

実行結果です。両方とも同じ結果を出力します。

f:id:yu3xx:20210503065703p:plain

どちらの書き方も

 ・iの初期値は0

 ・sumの初期値も0

 ・ループ内容(条件は合計sumが100を超えるまで)

   iを二乗したものをiiに格納

   iiの合計をsumに格納

   文字列「i , 」と「変数iの中身」を表示

 という処理を書いています。

 

「for」と違って、ループに関する設定が基本形に組み込まれていないので、自分で準備しないといけないというのが特長です。「i = 0」「i++」のあたりですね。

ちなみにループに関する設定をあえて書かないことで、永遠に続くループ処理なんかも書くこともできます。

 

ちょっとだけ違う「while〜」と「do...while〜」

 

さきほど話題に出た、「while〜」と「do...while〜」が異なる結果を出力する「ある場合」についての話です。

 その「ある場合」とは、「ループの条件を満たすことが一度もない場合」です。

 

感覚的には「一度もループ条件を満たさない = 一度も処理をしない」な気がしますが、「ループの条件判定」が「繰り返し処理の後」にある「do...while〜」の場合は違います。1度だけ繰り返し処理を実行してしまいます。

 

下の例では「sumの合計が-1より小さい」という無理な条件でループを書いています。

 ① while〜

//example 3-5

i = 1;
sum = 0;

while(sum < -1){
	ii = i * i;
	sum = sum + ii;
	print(i,",", sum);
	i++;
}

print("oshimai");

 ② do... while〜

//example 3-6

i = 1;
sum = 0;

do{
	ii = i * i;
	sum = sum + ii;
	print(i,",", sum);
	i++;
}while(sum < -1);

print("oshimai");

 実行結果は

 ① while〜 

f:id:yu3xx:20210503070831p:plain

 ② do... while〜 

f:id:yu3xx:20210503070854p:plain

 このように「do...while〜」のほうは、i = 1の時の繰り返し処理のブロックを実行していることがわかりますね。

whileを使う際には、これを意識しながらコードを書いてみてください。

 

 

 

 

今回の内容は以上です。

 

慣れるまでは、「繰り返し処理」となったらとりあえず「for」で書いてみて、条件の書き方に違和感を感じたら「while」を考える、という流れがやりやすいのかなと思います。 

 

 

 

おしまい 

 

 

次回は「if」を使った条件分岐がテーマです。こちらもチェックしてみて下さい!

imagej-jisui.hatenablog.com

 

 

 

・公開したマクロのまとめ

imagej-jisui.hatenablog.com