PyPython で学ぶ建築デザインブラウザだけで動く GHPython 演習環境
数理・データサイエンス・AI 入門 第 12 回

while 文と for 文/GHPython で簡易シミュレーション

広島工業大学2025/12/15演習 10 問

同じ操作をくり返すのは機械の得意分野です。「制限に達するまで積む」「決まった本数を配る」という建築的な操作を、while と for の 2 つの書き方で表現できるようにします。

1前回の復習

前回は文字列・入出力と条件分岐を扱いました。次の語句を思い出してください。

文字列名前や文章などの文字からなるデータ
print 関数引数に指定した値を画面に出力する関数
順次処理上から順番に一つずつ実行する処理
ブール型True もしくは False の値をとるデータの型
split 関数文字列を切り分けてリスト化する関数
確認2前回の復習:寸法仕様の分解

空欄を埋め、幅・奥行・高さを表示するプログラムを完成させなさい。

# 寸法仕様を入力(例: 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")
確認3前回の復習:座面高さの評価

空欄を埋め、椅子の座面高さを入力して評価を表示するプログラムを完成させなさい。

seat_h = int(________("座面高さ (mm): "))

if seat_h >= ________:
    ________("高め")
elif seat_h < ________:
    ________("低め")
________:
    ________("標準的")

2反復処理という考え方

プログラムの 3 つの処理型のうち、今回は反復処理を扱います。

順次処理処理を上から順番に一つずつ実行する
分岐処理条件に応じて処理を選択する
反復処理条件が満たされている間、処理を繰り返す

建築の操作に置き換えると、次のような使い分けになります。

while — 条件で回る z <= Hmax ? スラブを 1 枚積む いいえ → 終了 何回まわるかは「やってみるまで分からない」 for — 個数で回る for i in range(N): まわる回数が先に決まっている(柱・パネル・分割)
while は「条件を満たす間ずっと」、for は「決まった回数だけ」。
while 文条件を満たすまで成長・累積する操作(高さ制限・面積制限・在庫)
for 文本数・分割数が決まっている形態生成(柱・パネル・分割)

3while 文による繰り返し

while 文は、条件式が満たされて結果が True である間、 同じ処理を繰り返し実行します。

書き方
while 条件式:
    処理 1
    処理 2
5 回くり返して 2 乗を表示する
counter = 1                 # 現在,何回目かを記録する変数

while counter <= 5:         # counter の値が 5 以下なら繰り返す
    text = input("数字を入力してください:")
    number = int(text)      # 入力した文字列を数値に変換する
    print(counter, "回目:", number * number)
    counter = counter + 1   # counter の値に 1 を加算する

print("終了しました")
無限ループに気をつける条件がいつまでも True のままだとプログラムが止まりません。この演習環境では 5 秒で自動的に打ち切り、「実行中断」と表示します。Colab では自分で停止ボタンを押す必要があります。

break と continue

ループの途中で抜けたり、やり直したりする命令があります。

break — 抜ける if temp > 40: break ループそのものを終了して次へ進む continue — やり直す if temp < 5: continue 残りを飛ばしてループの先頭に戻る
break はループを終える。continue は残りを飛ばして先頭に戻る。
break で中断する
counter = 1

while counter <= 5:
    text = input("数字を入力してください:")

    if text == '999':       # 入力された文字が '999' なら
        print("中断します")
        break               # ループを中断する

    number = int(text)
    print(counter, "回目:", number * number)
    counter = counter + 1

print("終了しました")
continue でやり直す
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("終了しました")
P1建材の在庫量

ある建築現場では、1 日あたり 8 枚の合板を使用しています。しかし在庫は有限であり、在庫が尽きた時点で工事を一時停止しなくてはなりません。空欄を埋めて、工事の継続日数を出力するプログラムを完成させなさい。

stock = int(______("合板の初期在庫(枚)を入力してください: "))  # 文字列を入力する関数

days = 0

while True:
    stock = stock - ______   # 1 日に使用する建材の枚数
    days = days + 1

    if ______:               # 在庫が尽きたらループ終了
        ______               # 処理を中断する命令

print("工事の継続日数は", days, "日です。")
ヒント
while True: は「ずっと回る」ループ。止めるための break を必ず書きます。
在庫が尽きた= stock <= 0
P2コンクリートの打設

コンクリートを 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 文字列・リスト・辞書など:
    実行文
リストと range()
words = ['dog', 'cat', 'mouse']   # [ ] はリスト
for w in words:
    print(w, len(w))              # len() は文字列の長さを返す関数

print('finish')

for value in range(5):            # range() は特定の回数だけ繰り返す
    print(value)
<code>range(5)</code> が返すもの0, 1, 2, 3, 4 の 5 個です。5 は含まれません。「N 個ほしいときは range(N)」と覚えておけば、柱の本数や分割数と一致します。
P3家具リストの確認

空欄を埋め、家具の種類と名前の文字数を表示するプログラムを完成させなさい。

furniture = ["chair", "table", "sofa"]

for item in __________:
    print(item, ":", ________(item))
ヒント
文字数を数える関数は len()
P4ASCII アート(1)

空欄を埋め、踏面が横に伸びる階段を ASCII アート(文字による図形)で表現するプログラムを完成させなさい。

steps = 5

for i in ________(_____):
    print("■" * (i + 1))
ヒント
回数だけ繰り返す関数は range()。文字列に整数を掛けると、その回数だけ繰り返した文字列になります。
P5ASCII アート(2)

空欄を埋め、階段の段数に応じて ASCII アートを描き、段数が多すぎる場合には警告を表示するプログラムを完成させなさい。

steps = int(input("階段の段数を入力してください: "))

for i in ________(_____):
    print("■" * (i + 1))

# 段数が 8 段を超える場合は警告を表示
if steps ________ 8:
    print("[警告] 段数が多すぎます(安全に配慮してください)")
ヒント
「8 を超える」は > 8>= 8 ではありません。

5GHPython で簡易シミュレーション

反復処理をジオメトリに使うと、「制限に達するまで積む」「決まった本数を配る」という 建築的な操作がそのままコードになります。

G5 while — 高さ制限まで積む Hmax FloorH G6 for — 円周に N 本 R
左:高さ制限まで積むので while。右:本数が決まっているので for。
G5スラブの積層

同じ階高のスラブ(床)を、全体の高さが制限値 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
ヒント
3 つの空欄は上から順に「比較演算子」「リストに追加する値」「1 回で増える高さ」。
FloorH を小さくすると枚数が増えることを確かめましょう。
G6円周上の柱の配置

半径 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
ヒント
1 周は 2 * math.pi ラジアン。それを N 等分した角度が angle です。cossin にはその angle を渡します。

発展

点を出力するだけでは図面になりません。点のかわりに線分を出力すれば、柱が立ちます。

発展柱を立ててみる(G6 の発展)

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 = cols

6まとめと課題

本日のまとめ

  • while 文:条件を満たすまで成長・累積する操作に使う。
  • for 文:本数・分割数が決まっている形態生成に使う。
  • break / continue でループの流れを制御できる。

次回までのミニ課題

課題 1(Colab):次の条件を満たすプログラムを作成しなさい。

  1. input() を使って、床面積(m²)を数値で入力する
  2. 入力された床面積が 50 未満の場合は「床面積が不足しています」と表示して再入力を求める
  3. 50 以上になったら「条件を満たしました」と表示して処理を終了する

ヒント:while True:if area < 50:break

課題 2(Colab):ある家具配置の検討では、1 回の検討ごとに満足度が +10 点ずつ上がるとします。次の仕様を満たすプログラムを作成しなさい。

  1. 満足度を表す変数 score を 0 で初期化する
  2. 満足度が 80 点以上になるまで検討を繰り返す
  3. 検討 1 回ごとに満足度を +10 し、「○回目の検討:満足度 = ○点」と表示する
  4. ループ終了後に「最終的な検討回数は○回です」と表示する

ヒント:回数を数える変数(例:count)を用意する、while score < 80:

参考リンク

7自由制作

本日の学びを踏まえ、穴あきではなく一からコードを書いて提出する課題です。生成AIの助けを借りて構いません。右の演習環境で開いて制作し、完成したら 提出 を押してください。

進め方テーマを決める → 生成AIに方針を相談 → 自分で書いて動かす → 提出(何度提出しても最新が残ります)。スライダは + スライダ で追加、各スライダの で削除できます。サンドボックスは 自由制作 ページにもあります。
第12回繰り返しでつくる構造・配置

第12回の学び(while / for・シミュレーション)を踏まえ、ループで柱・床・パネルなどを配置する作品を一から書いてください。規則配列でも、少しずつ変化するパターンでも構いません。

import Rhino.Geometry as rg
import math

# 一から書いてみましょう。生成AIに相談しながらで構いません。
# スライダ x, y, z, n が使えます。完成したら「提出」を押してください。

a = None