while 文と for 文/GHPython で簡易シミュレーション
同じ操作をくり返すのは機械の得意分野です。「制限に達するまで積む」「決まった本数を配る」という建築的な操作を、while と for の 2 つの書き方で表現できるようにします。
1前回の復習
前回は文字列・入出力と条件分岐を扱いました。次の語句を思い出してください。
True もしくは False の値をとるデータの型空欄を埋め、幅・奥行・高さを表示するプログラムを完成させなさい。
# 寸法仕様を入力(例: W:450,D:600,H:720)
spec = ________("寸法仕様を入力してください: ")
# カンマで分割
parts = spec.________(",")
# コロンで分割して数値部分を取り出す
w = parts[0].________(":")[1]
d = parts[1].________(":")[1]
h = parts[2].________(":")[1]
# 結果を表示
________("幅:", w, "mm")
________("奥行:", d, "mm")
________("高さ:", h, "mm")空欄を埋め、椅子の座面高さを入力して評価を表示するプログラムを完成させなさい。
seat_h = int(________("座面高さ (mm): "))
if seat_h >= ________:
________("高め")
elif seat_h < ________:
________("低め")
________:
________("標準的")2反復処理という考え方
プログラムの 3 つの処理型のうち、今回は反復処理を扱います。
建築の操作に置き換えると、次のような使い分けになります。
3while 文による繰り返し
while 文は、条件式が満たされて結果が True である間、
同じ処理を繰り返し実行します。
while 条件式:
処理 1
処理 2counter = 1 # 現在,何回目かを記録する変数
while counter <= 5: # counter の値が 5 以下なら繰り返す
text = input("数字を入力してください:")
number = int(text) # 入力した文字列を数値に変換する
print(counter, "回目:", number * number)
counter = counter + 1 # counter の値に 1 を加算する
print("終了しました")break と continue
ループの途中で抜けたり、やり直したりする命令があります。
counter = 1
while counter <= 5:
text = input("数字を入力してください:")
if text == '999': # 入力された文字が '999' なら
print("中断します")
break # ループを中断する
number = int(text)
print(counter, "回目:", number * number)
counter = counter + 1
print("終了しました")counter = 1
while counter <= 10:
text = input("数字を入力してください")
if text == '': # 入力が空なら
print("入力が無効です")
continue # ループの先頭に戻る
if text == '999':
print("中断します")
break
number = int(text)
print(counter, "回目:", number * number)
counter = counter + 1
print("終了しました")ある建築現場では、1 日あたり 8 枚の合板を使用しています。しかし在庫は有限であり、在庫が尽きた時点で工事を一時停止しなくてはなりません。空欄を埋めて、工事の継続日数を出力するプログラムを完成させなさい。
stock = int(______("合板の初期在庫(枚)を入力してください: ")) # 文字列を入力する関数
days = 0
while True:
stock = stock - ______ # 1 日に使用する建材の枚数
days = days + 1
if ______: # 在庫が尽きたらループ終了
______ # 処理を中断する命令
print("工事の継続日数は", days, "日です。")ヒント
while True: は「ずっと回る」ループ。止めるための break を必ず書きます。在庫が尽きた=
stock <= 0。コンクリートを 1 回ずつ打設し、そのたびに温度を測定します。温度が 5 ℃未満のときは打設をスキップ、40 ℃超のときは工事を中止、それ以外は打設成功となるプログラムを完成させなさい。
count = 0
while True:
temp = int(______("今回のコンクリート温度 (℃):")) # 文字列を入力する関数
if temp < ______ : # 温度を入力
print("※低温のため今回はスキップ")
______ # ループをやり直す命令
if temp ______ : # 比較演算子と値を入力
print("※高温のため工事を中止します")
______ # ループを中断する命令
count = count + 1
print("→ 打設成功!")
print("安全に打設できた回数:", count)ヒント
continue、「中止」= break。標準入力には 12, 3, 25, 45 が入っています。3 は低温スキップ、45 で中止になるはずです。
4for 文による繰り返し
for 文は、in のうしろにある文字列・リスト・辞書などの
要素を 1 つずつ取り出しながら、実行文を繰り返します。
for 変数 in 文字列・リスト・辞書など:
実行文words = ['dog', 'cat', 'mouse'] # [ ] はリスト
for w in words:
print(w, len(w)) # len() は文字列の長さを返す関数
print('finish')
for value in range(5): # range() は特定の回数だけ繰り返す
print(value)空欄を埋め、家具の種類と名前の文字数を表示するプログラムを完成させなさい。
furniture = ["chair", "table", "sofa"]
for item in __________:
print(item, ":", ________(item))ヒント
len()。空欄を埋め、踏面が横に伸びる階段を ASCII アート(文字による図形)で表現するプログラムを完成させなさい。
steps = 5
for i in ________(_____):
print("■" * (i + 1))ヒント
range()。文字列に整数を掛けると、その回数だけ繰り返した文字列になります。空欄を埋め、階段の段数に応じて ASCII アートを描き、段数が多すぎる場合には警告を表示するプログラムを完成させなさい。
steps = int(input("階段の段数を入力してください: "))
for i in ________(_____):
print("■" * (i + 1))
# 段数が 8 段を超える場合は警告を表示
if steps ________ 8:
print("[警告] 段数が多すぎます(安全に配慮してください)")ヒント
> 8。>= 8 ではありません。5GHPython で簡易シミュレーション
反復処理をジオメトリに使うと、「制限に達するまで積む」「決まった本数を配る」という 建築的な操作がそのままコードになります。
同じ階高のスラブ(床)を、全体の高さが制限値 Hmax を超えない範囲で積み上げるプログラムを完成させなさい。1 枚分のスラブをつくる関数 slab(z) は用意してあります。
import Rhino.Geometry as rg
# 高さ z のところに 1 枚のスラブ(矩形カーブ)をつくる関数
def slab(z):
pl = rg.Plane.WorldXY
pl.Origin = rg.Point3d(0, 0, z)
return rg.Rectangle3d(pl,
rg.Interval(-W * 0.5, W * 0.5),
rg.Interval(-D * 0.5, D * 0.5)).ToNurbsCurve()
z = 0
levels = []
while z ______ Hmax:
levels.append( ______ )
z = z + ______
a = levelsヒント
FloorH を小さくすると枚数が増えることを確かめましょう。半径 R の円周上に、等間隔で N 本の柱を配置するプログラムを完成させなさい。
import Rhino.Geometry as rg
import math
pts = []
for i in range( ______ ):
angle = 2 * math.pi * i / ______
x = R * math.cos( ______ )
y = R * math.sin( ______ )
pts.append(rg.Point3d(x, y, 0))
a = ptsヒント
2 * math.pi ラジアン。それを N 等分した角度が angle です。cos と sin にはその angle を渡します。発展
点を出力するだけでは図面になりません。点のかわりに線分を出力すれば、柱が立ちます。
G6 で求めた点に、高さ Hcol の柱(線分)を立ててみましょう。点の代わりに rg.Line を出力します。
import Rhino.Geometry as rg
import math
cols = []
for i in range(N):
angle = 2 * math.pi * i / N
x = R * math.cos(angle)
y = R * math.sin(angle)
p0 = rg.Point3d(x, y, 0)
p1 = rg.Point3d(x, y, Hcol)
cols.append(rg.Line(p0, p1))
a = cols6まとめと課題
本日のまとめ
while文:条件を満たすまで成長・累積する操作に使う。for文:本数・分割数が決まっている形態生成に使う。break/continueでループの流れを制御できる。
次回までのミニ課題
課題 1(Colab):次の条件を満たすプログラムを作成しなさい。
input()を使って、床面積(m²)を数値で入力する- 入力された床面積が 50 未満の場合は「床面積が不足しています」と表示して再入力を求める
- 50 以上になったら「条件を満たしました」と表示して処理を終了する
ヒント:while True:、if area < 50:、break
課題 2(Colab):ある家具配置の検討では、1 回の検討ごとに満足度が +10 点ずつ上がるとします。次の仕様を満たすプログラムを作成しなさい。
- 満足度を表す変数
scoreを 0 で初期化する - 満足度が 80 点以上になるまで検討を繰り返す
- 検討 1 回ごとに満足度を +10 し、「○回目の検討:満足度 = ○点」と表示する
- ループ終了後に「最終的な検討回数は○回です」と表示する
ヒント:回数を数える変数(例:count)を用意する、while score < 80:
参考リンク
7自由制作
本日の学びを踏まえ、穴あきではなく一からコードを書いて提出する課題です。生成AIの助けを借りて構いません。右の演習環境で開いて制作し、完成したら 提出 を押してください。
第12回の学び(while / for・シミュレーション)を踏まえ、ループで柱・床・パネルなどを配置する作品を一から書いてください。規則配列でも、少しずつ変化するパターンでも構いません。
import Rhino.Geometry as rg import math # 一から書いてみましょう。生成AIに相談しながらで構いません。 # スライダ x, y, z, n が使えます。完成したら「提出」を押してください。 a = None