ループを理解できない作業員の為にループを排除した

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2021/09/28(火) 02:08:21.71ID:y2Bhm/WA
たとえば、九九の2の段を表示したいとする。
手続き型プログラミング言語的な発想でシェルスクリプトを書くと、次のようになる。

for i in 1 2 3 4 5 6 7 8 9; do
echo "2×${i}=$((2 * ${i}))"
done

プログラミングに慣れていない現場の作業員は、繰り返し構文が
でてくると理解が及ばないことがある。

そのため次のように記述することとした

echo "2×1=$((2 * 1))"
echo "2×2=$((2 * 2))"
echo "2×3=$((2 * 3))"
echo "2×4=$((2 * 4))"
echo "2×5=$((2 * 5))"
echo "2×6=$((2 * 6))"
echo "2×7=$((2 * 7))"
echo "2×8=$((2 * 8))"
echo "2×9=$((2 * 9))"

上から下に読めるというメンテナンス性を強く意識している。

0002デフォルトの名無しさん2021/09/28(火) 02:09:10.01ID:y2Bhm/WA
似たような例を考えてみよう。ファイルa1.txt?a10.txtは削除、
b1.txt?b10.txtは大文字にリネーム、c1.txt?c10.txtは新規作成という処理は、
手続き型プログラミング言語的な発想で記述すれば次のようになる。

for i in 1 2 3 4 5 6 7 8 9 10; do
rm a${i}.txt
mv b${i}.txt B${i}.TXT
touch c${i}.txt
done

これは次のようになる。

rm a1.txt ; mv b1.txt B1.TXT ; touch c1.txt
rm a2.txt ; mv b2.txt B2.TXT ; touch c2.txt
rm a3.txt ; mv b3.txt B3.TXT ; touch c3.txt
rm a4.txt ; mv b4.txt B4.TXT ; touch c4.txt
rm a5.txt ; mv b5.txt B5.TXT ; touch c5.txt
rm a6.txt ; mv b6.txt B6.TXT ; touch c6.txt
rm a7.txt ; mv b7.txt B7.TXT ; touch c7.txt
rm a8.txt ; mv b8.txt B8.TXT ; touch c8.txt
rm a9.txt ; mv b9.txt B9.TXT ; touch c9.txt
rm a10.txt; mv b10.txt B10.TXT; touch c10.txt

0003デフォルトの名無しさん2021/09/28(火) 02:10:37.61ID:y2Bhm/WA
ただし、すべてのケースでループ展開すればよいというものではない。
展開したスクリプトがテキストエディアの1画面に収まるかどうかを、
ループ展開するかどうかのひとつの判断基準にしている。
1画面に収まらないようなループ展開は、逆に読みにくくなる。

繰り返し構文を使わなければ記述できない場合には、繰り返しの終了判断をループの最後に記述する。
通常、whileは次のように最初に繰り返し終了判定を記述することが多い。

i=1
while [ $i -le 10 ]; do # 10または10よりも小さければループ継続
echo "${i}周目"
i=$(( $i + 1 ))
done

これは次のように終了判定を繰り返し構文の一番最後に書く。

i=1
while [ 1 ]; do
echo "${i}周目"
i=$(( $i + 1 ))
[ $i -gt 10 ] && break; # 10よりも大きければループ終了
done

繰り返しの終了判定はループの先頭に記述されているよりも、
ループの最後に記述されている方が直感的のようだ。
プログラミングに慣れた方は先頭に条件文を書くことになんの疑問も抱かないが、
業務システムを作ることになる現場の担当者は、先頭に条件を書くという書き方にひどく違和感を覚える方が多い。

0004デフォルトの名無しさん2021/09/28(火) 03:01:59.91ID:MLPs9nz5
プログラミングに慣れてない人に合わせてプログラム変える必要ないやろ

0005デフォルトの名無しさん2021/09/28(火) 03:06:33.26ID:YGhvVDZx
そもそもループさえ理解できないやつにプログラムさせるな

0006デフォルトの名無しさん2021/09/28(火) 16:36:19.28ID:nD0g4rLv
Σやで

0007デフォルトの名無しさん2021/09/28(火) 16:41:08.23ID:MZ6TCgKK
横M字ハゲ?

0008デフォルトの名無しさん2021/09/28(火) 17:35:19.25ID:q3x2SwpM
ループじゃなくて再帰を使えば解決や

0009デフォルトの名無しさん2021/10/03(日) 22:08:35.79ID:l+oYPo4C
マシニングセンタやってるやつはだいたいこれ

0010デフォルトの名無しさん2021/10/04(月) 14:45:53.95ID:v2OwZJLa
ループじゃなくてコピペを使えば解決や

0011デフォルトの名無しさん2021/10/04(月) 21:10:46.37ID:/t8Uhu5j
ばーか

0012デフォルトの名無しさん2021/10/13(水) 22:31:26.27ID:BLGVOBJE
マシニングセンターってループないの?マジ!?
インデックス加工の穴開けとか出来るんじゃ?

0013デフォルトの名無しさん2022/01/22(土) 11:38:24.29ID:qigFyzKc
>>5で終了している

0014デフォルトの名無しさん2022/01/23(日) 21:23:40.89ID:AHdYZ2f+
>>1
ループを理解できない上司に
「じゃあ1から100の段まで作れるよね?よろしく!」
と言われたら詰んでしまうw

0015デフォルトの名無しさん2022/01/23(日) 21:34:26.60ID:Y2XsLhWh
それをループで書き出すことはできる

0016デフォルトの名無しさん2022/01/24(月) 18:35:25.44ID:rXE0khMe
結局ループを使うのかよw

0017デフォルトの名無しさん2022/01/30(日) 12:26:43.65ID:5V9R/BtT
九九?
一番上の奴をコピーして下に80回貼り付ける
その後数字を書き換える
これで完成や!

0018デフォルトの名無しさん2022/02/02(水) 19:59:59.24ID:G7Kq57v4
エクセルで計算して貼り付けろ!

0019デフォルトの名無しさん2022/02/02(水) 21:51:22.08ID:Xe1+J6sR
int i,j;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
printf("printf(\"%%d*%%d=%%d\\n\", %d, %d, %d);\n", i+1, j+1, (i+1)*(j+1));
}
}

■ このスレッドは過去ログ倉庫に格納されています