タートルグラフィックスで学ぶ Python のキホン 第 9 章
教材コード
第 9 章

はじめての CUI プログラム

絵を描かずに,入力と計算と表示だけでプログラムを作ります.

ここまでの章では,ずっとかめに絵を描かせてきました. 今回はかめを休ませて,タートルを 1 行も使わないプログラムを書きます. 画面に出るのは文字だけ,操作はキーボードだけ. このようなプログラムをCUI プログラムといいます.

絵がない代わりに,仕様(しよう)があります. どの課題にも「どんな入力を受け取り,何を計算し,何を表示するのか」が 文章で書いてあります.その文章を読んで,自分でプログラムに翻訳する ——これが,今回の中心になる練習です.実際の仕事では,こうして 「日本語で書かれた注文」からプログラムを起こします.

もう 1 つ,今回は変数の型をきちんと意識します. 絵を描くときは「数」でひとまとめにしていられましたが, 入力と計算だけのプログラムでは, 整数なのか,小数なのか,文字列なのかを取り違えると, そのまま結果が狂います.

この章でできるようになること
  • CUI プログラムとは何かを説明できる
  • input() と print() だけで,「入力 → 処理 → 出力」の形のプログラムが書ける
  • 整数(int)・小数(float)・文字列(str)・真偽値(bool)の4 つの型を区別できる
  • int()・float()・str() で型を変えてから計算・表示できる.型変換に失敗したときのエラーも読める
  • モジュールとは何かを説明できる.random で乱数を作り,毎回結果の変わるプログラムが書ける
  • 仕様書を読んで,「入力」「処理」「出力」に分けて整理できる
  • 仕様どおりに動く CUI プログラムを,自分で組み立てられる
この章の進め方
  • 課題は「概要」「機能」「エラー処理」「プログラム設計条件」の4 つに分けて書いてあります.まず全部読んでから,書き始めてください.
  • 「▶ この課題を開く」を押すと,右側に出発点のプログラムが読み込まれます.入力を受け取るところまでは書いてあるので,計算と表示を自分で書き足してください.
  • input() を使う課題には,右下のコンソールの入力行にあらかじめ値が入っています.値を書き換えて,何度も実行して確かめてください.
  • コンソールの入力行を空にして実行すると,実行中に画面で 1 つずつ聞かれます.
  • できあがったら「⤓ 保存」で .py ファイルとして手元に保存します.
繰り返しの注意 この教材はブラウザの中で Python を動かしています. while True:(ずっと繰り返す)は書かないでください. 止める手立てがないので,ブラウザごと固まります. 「何回か繰り返す」ときは for i in range(10): のように 回数を決めてください. 「どうなるまで繰り返す」ときは, while 残高 > 0 and 年 < 50: のように 必ず終わる条件をもう 1 つ付け足してください.

9.1 文字だけで作るプログラム

CUI(Character User Interface)とは, ユーザへの情報の表示を文字だけで行い, すべての操作をキーボードで行うユーザインタフェースのことです. ここまでの回でずっと使ってきた input() と print() が, そのまま CUI プログラムの道具になります.

タートルのプログラムCUI のプログラム
出力画面に絵を描く(fd・lt)コンソールに文字を出す(print)
入力キーやマウス(第 12 章)キーボードから 1 行(input)
使う道具from turtle import * が要る何も読み込まなくてよい(乱数のときだけ import random)
向いていること形・模様・動き計算・判定・集計

まずは,いちばん短い CUI プログラムです. 入力を受け取って,そのまま返すだけの「おうむ返し」です.

echo.py
# おうむ返しのプログラム

print("開始しました")

text = input("好きな言葉を入力してください > ")
print(f"あなたが入力したのは「{text}」ですね")

print("終了しました")
「開始しました」「終了しました」 最初と最後の print に注目してください. 今回の課題では,どれも 「開始しました」で始め,「終了しました」で終えることになっています. 絵が出ないプログラムでは,動いたのかどうかが見た目で分かりません. 始まりと終わりを自分で知らせるのは,CUI プログラムの作法です.

このおうむ返しは短いですが,CUI プログラムの骨組みがそのまま入っています. どんなに長い CUI プログラムも,結局は次の 3 つでできています.

  1. 入力:input() で,人から値を受け取る
  2. 処理:受け取った値を使って,計算したり条件で分けたりする
  3. 出力:print() で,結果を文字にして見せる

おうむ返しには「処理」がほとんどありません. ここに計算や if を書き足していけば, BMI 計算にも,占いにも,数あてゲームにもなります. 今回の課題は,すべてこの 3 つを埋める作業だと思ってください.

9.2 ここまでの道具のおさらい

今回の課題で使うのは,第 3 章から第 6 章までに習ったものだけです. 忘れていたら,ここで思い出してください.

書き方すること出てくる回
input("案内 > ")キーボードから 1 行受け取る.結果は必ず文字列第 3 章
int(input(…))入力を整数として受け取る第 3 章
float(input(…))入力を小数として受け取る第 3 章
f"…{x}…"文字と数をまぜて表示する第 3 章
// %割った商と余り.お金・個数の計算に使う第 3 章
int(x * 10 + 0.5) / 10小数第 2 位で四捨五入する第 3 章
random.randint(a, b)a 以上 b 以下の整数を 1 つ第 3 章
if elif else条件で処理を分ける第 5 章
and or not条件を組み合わせる第 5 章
for i in range(n):n 回繰り返す第 6 章
break繰り返しを途中でやめる(課題 6 で使う.使い方は課題 6 のヒント,詳しくは第 17 章)この章
第 3 章にある課題 0.1 を 10 回足す・0.125 を 8 回足す・ 四捨五入・割り勘計算機は, すでに第 3 章で扱っています. まだ解いていない人は,先にそちらを済ませてください.

9.2.1 変数の型 — 整数・小数・文字列・真偽値

絵を描いているうちは,変数の中身はほとんど「数」でした. CUI プログラムでは,ここをはっきり区別する必要があります. 変数に入っているデータの種類のことを 型(かた)といいます.

型読み何を表すか書き方の例
intイント整数.人数・個数・年・点数7 -3 2026
floatフロート小数.身長・体重・利率・平均1.72 0.05 3.0
strストリング文字列.名前・メッセージ"ももたろう" "開始しました"
boolブール真偽値.条件が成り立つかどうかTrue False

4 つめの bool は,第 5 章で習ったものです. True と False の2 つしか値がありません. if bmi < 18.5: と書いたときの bmi < 18.5 の部分は, 計算すると True か False になります. つまり if は,bool 型の値を見て分かれているのです.

型がずれていると,見た目は似ていても結果がまったく違います. "3" + "4" は "34"(文字をつなげる)ですが, 3 + 4 は 7(足し算)です.

types.py
# 型を確かめるプログラム

print("開始しました")

a = 7            # 整数
b = 1.72         # 小数
c = "ももたろう"  # 文字列
d = (a > 5)      # 真偽値(条件を計算した結果)

print(a, type(a))
print(b, type(b))
print(c, type(c))
print(d, type(d))

print("3 + 4 は", 3 + 4)          # 足し算になる
print('"3" + "4" は', "3" + "4")  # つながってしまう

print("終了しました")
input() の結果は必ず文字列 いちばんつまずくのがここです. input() が返すのは,いつでも文字列(str)です. 数を打ち込んだつもりでも,受け取った時点では "170" という文字の並びでしかありません. そのまま足し算をすると,つながってしまうか,エラーになります.

そこで,受け取ったあとに型を変えてから使います. 型を変えたいときは,型の名前をそのまま命令として使います.

書き方すること例
int(x)整数に直す.小数部分は切り捨てint("170") → 170,int(3.9) → 3
float(x)小数に直すfloat("1.72") → 1.72
str(x)文字列に直す.つなげて表示するときに使うstr(7) → "7"
入力を受け取る定型.型に合わせて int / float で包む
sei = int(input("身長を cm で入力してください > "))     # 整数として受け取る
taiju = float(input("体重を kg で入力してください > "))  # 小数として受け取る
namae = input("名前を入力してください > ")               # 文字列はそのまま

ただし,どんな文字列でも数に直せるわけではありません. int() に渡せるのは数として読める文字列だけです. 次の例題は,わざと失敗させてエラーを見るためのものです.

cast_error.py
# 型変換が失敗する様子を見るプログラム

print("開始しました")

print(int("170"))       # 170    数として読める文字列は整数に直せる
print(float("1.72"))    # 1.72   小数も同じ

# ここから下は,わざと失敗させています
# エラーが出るとそこで止まるので,1 行ずつ # を付けたり外したりして試してください
print(int("3.5"))       # ← エラー.小数の文字列は int では読めない
print(int("abc"))       # ← エラー.数として読めない
print("1" + 1)          # ← エラー.文字列と整数は足せない

print("終了しました")
ValueError と TypeError int("3.5") と int("abc") は ValueError(値がおかしい), "1" + 1 は TypeError(型がおかしい)になります. エラーが出ると,プログラムはその行で止まります. 下の行も見たいときは,上の行を # でコメントにしてから実行してください. エラーの名前は,どこを直せばよいかの手がかりです. ValueError なら入力された中身を, TypeError なら変数の型を疑ってください. "3.5" のような小数の文字列を整数にしたいときは, int(float("3.5")) と 2 段階で直します.
仕様書の「エラー処理」とのつながり 今回の課題の仕様書には,どれも 「文字など処理不可能な値が入力されたときの処理は行っていない」 と書いてあります.つまり,上のようなエラーが出る入力は 考えなくてよいということです. そのかわり,動かすときは入力欄に素直に数を書いてください. 変な入力に備える書き方(try)は第 20 章で扱います.
int() は切り捨て int() は四捨五入ではなく切り捨てです. int(3.9) は 4 ではなく 3 になります. 四捨五入したいときは,先に 0.5 を足してから切り捨てます. 小数第 1 位までにしたいなら int(x * 10 + 0.5) / 10 です.
小数には誤差がある 小数(float)には誤差があります. 0.1 を 10 回足しても,ぴったり 1.0 にはなりません. コンピュータが 2 進法で計算しているためで,Python に限った話ではありません. お金や個数は整数で扱う, 小数どうしを == で比べないと覚えておいてください.
くわしくは第 3 章に 型・型変換・小数の誤差については, 第 3 章の 3.6 節・3.7 節でくわしく説明しています. ここではもう一度必要になったので,要点だけをまとめました. 忘れていたら,そちらに戻って確かめてください.

9.2.2 乱数を出す

10 から 20 までの整数を,実行するたびに違う値で出します. 乱数を使うときは,プログラムの先頭に import random と書きます.

モジュールとは random のように,便利な命令をひとまとめにした箱を モジュールといいます. Python には初めからたくさんのモジュールが用意されていて, import モジュール名 と書くとその箱が使えるようになります. 箱の中の命令を呼ぶときは random.randint(…) のように, 「箱の名前.命令の名前」と書きます. random. を書き忘れると NameError(そんな名前は知りません)になるので気をつけてください.
random のほかの道具 random の箱には randint 以外の道具も入っています. random.random() は 0.0 以上 1.0 未満の小数を返すので, if random.random() < 0.3: と書けば 「30% の確率で起こること」が作れます. いくつか並べたものから 1 つ選ぶ random.choice や, 順番をまぜる random.shuffle もありますが, これらはリストを習ってから使うので,第 16 章で扱います. import の 3 つの書き方(from ○○ import △△ など)は 第 20 章で整理します.
random_generator.py
# 乱数を出すプログラム

import random

print("開始しました")

d1 = random.randint(10, 20)        # 10 以上 20 以下
print(f"1 つめの数は {d1} です")

d2 = random.randint(0, 10) + 10    # こう書いても同じ範囲になる
print(f"2 つめの数は {d2} です")

print("終了しました")
範囲の両端に注意 random.randint(10, 20) は 10 以上 20 以下(両端を含む)ですが, random.randrange(10, 20) は 10 以上 20 未満(20 を含まない)です. 端をどこまで含むかは命令によって違うので, そのつど確かめる習慣をつけてください.

9.2.3 数を数えながら判定する

for と % を組み合わせると, 「3 の倍数のときだけ何かする」といったことができます. このあとの課題 7「世界の○○」のもとになる例題です.

count15.py
# 3 の倍数と 5 の倍数に印をつけながら数える

print("開始しました")

for i in range(1, 16):
    kotae = str(i)               # 数を文字列にする

    if i % 3 == 0:
        kotae = kotae + " バカ"

    if i % 5 == 0:
        kotae = kotae + " 犬っぽく"

    print(kotae)

print("終了しました")
if を並べるか elif にするか if を 2 つ並べて書いているところがみそです. elif にしてしまうと,15 のように 3 の倍数でも 5 の倍数でもある数のときに, 片方しか付きません. 「どちらも起こりうる」ときは if を並べ, 「どれか 1 つだけ」のときは elif を使います.
虫食い虫食い 9-A 小数で入力を受け取る

身長と体重を受け取ります.どちらも 170.5 のような 小数で入力されます. ____ に入る命令は int・float・str のどれでしょうか.

fill_a_input.py
print("開始しました")

# 身長は cm,体重は kg.どちらも小数で受け取る
height = ____(input("身長を cm で入力してください > "))
weight = ____(input("体重を kg で入力してください > "))

print(f"身長 {height} cm,体重 {weight} kg ですね")

print("終了しました")
虫食い虫食い 9-A2 小数の文字列を読む

入力欄の 12.5 を受け取って,いろいろな形で表示します. 実行する前に,各行が何を表示するかを紙に書いて予想してください. そのうえで ____ に int・float・str のどれかを入れて, コメントに書いた表示になるようにしてください.

エラーも確かめる 埋め終わったら,3 行目の int(____(a)) を int(a) に書き換えて実行し, 出たエラーの名前が ValueError か TypeError かを確かめてください. エラーの名前から,「中身がおかしい」のか「型がおかしい」のかを説明できるようにします.
fill_a2_type.py
a = input("数を入力してください > ")   # 12.5 が入る

print(a + a)                       # 12.512.5(文字列どうしはつながる)
print(____(a) * 2)                 # 25.0
print(int(____(a)))                # 12(小数に直してから,整数に切り捨てる)
print(type(float(a) > 10))         # <class 'bool'>(比べた結果は真偽値)
虫食い虫食い 9-B 範囲で判定する

BMI 指数の値で,体型を 4 つに分けます. 18.5 未満=やせ,18.5 以上 25 未満=標準, 25 以上 35 未満=肥満,35 以上=高度肥満です. ____ を埋めてください. bmi >= 18.5 and bmi < 25 と書かなくてよい理由も考えてみましょう.

fill_b_elif.py
bmi = float(input("BMI 指数を入力してください > "))

if bmi ____ 18.5:
    print("やせています")
____ bmi < 25:
    print("標準的です")
____ bmi < 35:
    print("肥満です")
____:
    print("高度肥満です")
虫食い虫食い 9-C 入力された数まで数える

入力された数まで数え,3 の倍数のときだけ印をつけます. ____ を埋めてください. range の終わりの値に注意してください. range(1, n) では n が出てきません.

fill_c_count.py
print("開始しました")

n = int(input("いくつまで数えますか > "))

for i in range(1, ____):        # n まで数えたい
    kotae = str(i)

    if i ____ 3 == 0:           # 3 で割った余りが 0 なら 3 の倍数
        kotae = kotae + " バカ"

    print(kotae)

print("終了しました")
虫食い虫食い 9-D さいころの当たりはずれ

さいころを 1 回振り,出た目が 1・2・3 のときは「当たり」, それ以外のときは「はずれ」と表示します. ____ を埋めてください. 目は 1 から 6 までです.me == 1 or me == 2 or me == 3 と 書かなくても済む条件を考えてみましょう.

fill_d_dice.py
import random

print("開始しました")

me = random.____(1, 6)       # 1 以上 6 以下の整数を 1 つ
print(f"さいころの目は {me} です")

if me ____ 3:                # 1・2・3 なら当たり
    print("当たり")
else:
    print("はずれ")

print("終了しました")
乱数を使ったら何度も動かす この虫食いは,実行するたびに結果が変わります. 1 回動かしただけでは正しいかどうか分かりません. 何度も実行して,当たりとはずれが両方出ること, 目が 1 より小さくならず 6 より大きくならないことを確かめてください. 乱数を使ったプログラムは,こうして何度も動かして確かめます.

9.2.4 文字列を数に変える

名前などの文字列から数を作ると,占いのプログラムが書けます. Python では ord() という命令で, 1 文字を数(文字コード)に変えることができます. for c in 文字列: と書くと, 文字列の中身を1 文字ずつ取り出せます.

ord で文字を数にする
print(ord("A"))      # 65
print(ord("a"))      # 97
print(ord("あ"))     # 12354

for c in "かめ":
    print(c, ord(c))
hash() は占いに使えない Python には hash() という似た命令がありますが, 文字列に対する hash() は 実行するたびに違う値を返すことがあります (セキュリティ上の理由でそうなっています). 占いは同じ名前なら必ず同じ結果でなければ興ざめですから, 今回は hash() ではなく ord() を使います.
虫食い虫食い 9-E 名前を数にする

入力された名前を 1 文字ずつ数に直して足し合わせ, 最後に 0 〜 99 の範囲に収めます. ____ を埋めてください. 「ある範囲に収める」ときに使う演算子は何でしたか.

fill_d_ord.py
name = input("名前を入力してください > ")

value = 0
for c in name:
    value = value + ____(c)     # 1 文字を数に直して足す

print(f"{name} の数は {value} です")
print(f"0 〜 99 に収めると {value ____ 100} です")

9.3 仕様書の読み方

ここから先の課題は,すべて仕様書の形で書いてあります. 4 つの見出しには,それぞれ役割があります.

見出し何が書いてあるか読むときに考えること
概要そのプログラムが何をするものか,一言で誰が,どんなときに使うのか
機能入力・処理・出力の中身.いちばん大事受け取るのは何個か.どの型か.何を計算するのか
エラー処理変な入力が来たときにどうするか「行っていない」と書いてあれば,考えなくてよい
プログラム設計条件作り方の約束ごと使う命令が指定されていないか
仕様からプログラムへ 仕様を読んだら,いきなり書き始めずに,まず 「入力」「処理」「出力」の 3 つに分けて紙に書き出すとうまくいきます.
  1. 入力:何を,いくつ,どの型で受け取るか(int? float? 文字列?)
  2. 処理:受け取った値から何をどう計算するか(式を日本語で書いてみる)
  3. 出力:何を,どんな文で表示するか
この 3 つが決まれば,あとは Python に翻訳するだけです. 出発点のプログラムには,「入力」の部分だけが書いてあります.

9.4 基本課題

入力を受け取り,計算し,条件で分けて表示する——という CUI プログラムの基本形を身につけます.

課題課題 1 体型評価プログラム

■ 概要

このプログラムは,身長と体重の入力を実数で受け付け, その入力をもとに BMI 指数と, その値から評価されたコメントを出力します.

■ 機能

  1. プログラムの起動時および終了時に,その旨をユーザに伝えるメッセージを出力する.起動時出力:「開始しました」,終了時出力:「終了しました」(適宜変えてよい).
  2. 身長と体重の入力を受け取り,BMI 指数と,その値から評価されたコメントを出力する.
    入力:体重(kg) と身長(cm) の実数値
    出力:BMI 指数(小数第 2 位で四捨五入する),およびコメント
  3. BMI 指数は体重(kg) を身長(m) の 2 乗で割った数値である(身長の単位に注意.入力は cm なので,100 で割って m に直す).
  4. BMI 指数から体型を次のように評価し,コメントとする(18.5 未満=やせ,18.5 以上 25 未満=標準,25 以上 35 未満=肥満,35 以上=高度肥満).評価には四捨五入して表示した BMI の値を使う(身長 170・体重 53.4 では BMI が 18.48… なので 18.5 と表示し,「標準」とする).
  5. これもやりましょう:標準体重(BMI がちょうど 22 になる体重.22 × 身長(m) × 身長(m))も小数第 2 位で四捨五入して表示し,今の体重が標準体重より何 kg 多いか(少ないか)を表示する.差は表示した標準体重と今の体重との差とし,小数第 2 位で四捨五入して,正の数で「○ kg 多い」「○ kg 少ない」と書く(ちょうど同じなら「ちょうど標準体重です」).
  6. 入力例と出力:身長 170,体重 58 を入れると,BMI は 20.1(標準),標準体重は 63.6 kg,「標準体重より 5.6 kg 少ない」となる.

■ エラー処理

文字など処理不可能な値が入力されたときの処理は,行っていない.入力欄には素直に数を書くこと.

■ プログラム設計条件

  • 入出力は起動したコンソールから行う(CUI プログラムである).
  • 身長と体重の入力には float(input(…)) を使用する.
  • コメントの文面は各自工夫してよい.
ヒント 四捨五入は第 3 章の復習です. int() が切り捨てであることを利用して, int(bmi * 10 + 0.5) / 10 と書くと小数第 2 位で四捨五入できます. 条件の分け方は虫食い 9-B が答えそのものです. int() は 0 に近いほうへ切り捨てるので, 負の数にこの四捨五入を使うとずれます. 体重の差は,大きいほうから小さいほうを引いて正の数にしてから四捨五入してください.
評価の目安(10 段階)

必須(すべて満たして正しく動けば 8)

  1. 身長・体重を float(input(…)) で受け取り,170.5 のような小数を入れても動く
  2. 身長を m に直して BMI を計算し,小数第 2 位で四捨五入して表示する(170・58 で 20.1)
  3. BMI の値で 4 段階(やせ・標準・肥満・高度肥満)のコメントを if・elif・else で出し分ける
  4. 標準体重と,それより何 kg 多いか・少ないかを正の数で表示する(170・58 で 63.6 kg,5.6 kg 少ない)
  5. 「開始しました」「終了しました」を表示する

発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)

  • 身長に 0 以下が入ったら計算せずに注意を出す
  • 「やせ」「肥満」の境目(BMI 18.5・25)になる体重も表示する
  • 身長を cm のまま計算すると BMI がどうなるかを確かめ,コメントに書く

必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6

課題課題 2 恋愛占いプログラム

■ 概要

このプログラムは,男女の名前を入力すると, その恋愛成就確率を百分率で判定し,コメント付きで出力します.

■ 機能

  1. プログラムの起動時および終了時に,その旨をユーザに伝えるメッセージを出力する.起動時出力:「開始しました」,終了時出力:「終了しました」(適宜変えてよい).
  2. 男女の名前の入力を受け取り,恋愛成就確率をコメント付きで出力する.
    入力:男女の名前(姓名をつなげたもの)
    出力:恋愛成就確率(0 〜 100%.実数でも整数でもよい),コメント
  3. 成就確率を求める手順は自由でよいが,必ず 0 〜 100 の範囲に収まるようにする.
  4. コメントも自由でよいが,確率の範囲に応じて 3 段階以上に出し分ける.楽しめるように工夫すること.
  5. 同じ名前を入れたら,何度実行しても同じ結果になること(乱数で決めてはいけない.占いにならないため).
  6. これもやりましょう:確率をハートの列でも表示する.10% ごとに ♥ を 1 個(10 で割った商の数),残りを ♡ にして,合わせて 10 個並べる(49% なら ♥♥♥♥♡♡♡♡♡♡,100% なら ♥ が 10 個).for で 1 文字ずつ文字列につなげて作ること.
  7. 入力例と出力:2 人の名前の文字コードをすべて足して % 101 する方法なら,「ももたろう」「かぐやひめ」で合計は 123976,確率は 49% になり,ハートは ♥♥♥♥♡♡♡♡♡♡ となる.

■ エラー処理

文字など処理不可能な値が入力されたときの処理は,行っていない.入力欄には素直に数を書くこと.

■ プログラム設計条件

  • 入出力は起動したコンソールから行う(CUI プログラムである).
  • 男女の名前の入力には input(…) を使用する.
  • 文字列を数に直すには ord() を使う(9.2.4 を参照).
ヒント 0 〜 100 に収めるのがこの課題の山場です. 文字コードを足し合わせた数は,名前が長いほど大きくなります. % 101 とすれば,どんなに大きな数でも 0 〜 100 になります. 「100 より大きい間,10 で割り続ける」といった手もありますが, % を使えば 1 行で済みます. ハートの列は,空の文字列 heart = "" から始めて, for i in range(10): の中で 「i が ♥ の個数より小さければ ♥,そうでなければ ♡」をつなげていきます.
評価の目安(10 段階)

必須(すべて満たして正しく動けば 8)

  1. 2 人の名前を for c in 名前: と ord(c) で 1 文字ずつ数に直して使う(乱数を使わない)
  2. 確率が必ず 0 〜 100 に収まる(% などを使う.同じ名前なら何度実行しても同じ結果)
  3. 確率の範囲に応じて 3 段階以上のコメントを出し分ける
  4. ♥ と ♡ を合わせて 10 個のハートの列を for で作り,49% なら ♥♥♥♥♡♡♡♡♡♡ と表示する

発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)

  • 名前の文字数も for で数えて,計算に混ぜる
  • 2 人の名前に同じ文字が含まれていたら確率を上げる
  • 名前が空(何も入力しない)ときや,2 人の名前を入れかえたときにどうなるかを確かめ,扱いを決めて作る(境目の扱い)

必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6

課題課題 3 単位取得状況評価プログラム

■ 概要

このプログラムは,あなたの単位取得状況の入力を受け取り, それを評価し,卒業するためのコメントを出力します.

■ 機能

  1. プログラムの起動時および終了時に,その旨をユーザに伝えるメッセージを出力する.起動時出力:「開始しました」,終了時出力:「終了しました」(適宜変えてよい).
  2. 取得済みの単位数と経過した学期数の入力を受け取り,その値から評価されたコメントを出力する.
    入力:取得済みの単位数の整数値,経過した学期数(0 〜 7)の整数値
    出力:今後 1 学期あたりにとらねばならない単位数(CPS:Credit Per Semester),およびコメント
  3. 最終的に取得すべき単位数などの規則は学則に従うものとする(自分の学科の卒業要件単位数を調べて書くこと.分からなければ 124 単位としてよい).卒業に必要な単位数は変数にして先頭に書く.
  4. CPS =(卒業に必要な単位数 − 取得済みの単位数)÷(残りの学期数).4 年間の学期数は 8 とする.CPS は小数第 2 位で四捨五入して表示する.
  5. コメントは自由に考えてよいが,CPS の大きさに応じて 3 段階以上に分ける.
  6. これもやりましょう:1 学期にとれる単位数には履修登録の上限がある.上限を 24 単位(変数にして先頭に書く)とし,CPS が 24 を超えたら「このままでは卒業できません」と警告する.また,取得済みの単位数が卒業要件以上のときは CPS を計算せず,「卒業に必要な単位はそろっています」と表示する.さらに,経過した学期数に 8 が入ったとき(残りの学期が 0)は,CPS を計算せずに「残りの学期がありません」と表示し,ZeroDivisionError にならないようにする.
  7. 入力例と出力(卒業要件 124 単位のとき):62 単位・4 学期 → CPS は 15.5.20 単位・6 学期 → CPS は 52.0 で,警告が出る.130 単位・7 学期 → 「そろっています」.100 単位・8 学期 → 「残りの学期がありません」.

■ エラー処理

文字など処理不可能な値が入力されたときの処理は,行っていない.入力欄には素直に数を書くこと.

■ プログラム設計条件

  • 入出力は起動したコンソールから行う(CUI プログラムである).
  • 単位数・学期数の入力には int(input(…)) を使用する.
ヒント 卒業要件単位数を sotsugyo = 124 のように 変数にして先頭に書いておくと, 学科によって数が違っても 1 か所直すだけで済みます.第 3 章でやったとおりです.
0 で割らないように 経過した学期数に 8 を入れると,残りの学期数が 0 になり, 0 で割ることになってエラー(ZeroDivisionError)になります. 「これもやりましょう」にあるとおり, if で先に確かめて「残りの学期がありません」と出してください.
評価の目安(10 段階)

必須(すべて満たして正しく動けば 8)

  1. 単位数・学期数を int(input(…)) で受け取り,卒業要件単位数と履修登録の上限(24)を変数にして先頭に置く
  2. CPS =(必要単位 − 取得単位)÷(8 − 経過学期)を計算し,小数第 2 位で四捨五入して表示する(62・4 で 15.5)
  3. CPS の値に応じて 3 段階以上のコメントを出し分け,24 を超えたら「このままでは卒業できません」と警告する(20・6 で警告)
  4. 取得単位が卒業要件以上なら CPS を計算せずに「そろっています」と表示する(130・7)
  5. 経過した学期数に 8 を入れても ZeroDivisionError にならない

発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)

  • 残りの学期をすべて上限まで取ったら卒業できるかどうかを,具体的な単位数で表示する
  • 1 年あたり(2 学期)の単位数も並べて表示する

必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6

9.5 発展課題

ここからは繰り返しが入ってきます. 仕様も長くなりますが,あわてずに「入力」「処理」「出力」に分けて読んでください.

課題課題 4 脳トレ

■ 概要

ユーザが計算問題を解くことで脳を鍛えるソフトウェアである. このプログラムは,足し算の計算問題を自動生成して 何問か出題し,そのつど答えあわせをします.

■ 機能

  1. プログラムの起動時および終了時に,その旨をユーザに伝えるメッセージを出力する.起動時出力:「開始しました」,終了時出力:「終了しました」(適宜変えてよい).
  2. 足し算の計算問題を生成する.
    出力:問題(例:3 + 4 = ?)
    各数字の桁数は1 桁の整数である(答えは任意の桁数の整数とする).
  3. 出題し,答えあわせをする.
    入力:回答
    出力:答えあわせの結果(正解か,不正解か.不正解のときは正答を添える)
  4. 2) と 3) を連続で 10 回行い,最後に正答率を出力する(10 問なので,正答率(%) = 正解数 × 10).
  5. これもやりましょう:足し算だけでなく,引き算とかけ算も出題する.1 問ごとに random.randint(1, 3) で種類を選び,1 なら足し算(3 + 4 =),2 なら引き算(7 − 2 =),3 ならかけ算(6 × 8 =)とする.引き算は答えが負にならないように,大きいほうから小さいほうを引く.
  6. 正答率に応じて段位を出す(90% 以上=「名人」,60% 以上=「中級」,それ未満=「初級」).

■ エラー処理

文字など処理不可能な値が入力されたときの処理は,行っていない.入力欄には素直に数を書くこと.

■ プログラム設計条件

  • 入出力は起動したコンソールから行う(CUI プログラムである).
  • 回答の入力には int(input(…)) を使用する.
  • 繰り返しには for i in range(10): を使う(while True: は使わないこと).
ヒント 正解の数を数える変数(たとえば seikai)を, 繰り返しの外で 0 にしておくのを忘れないでください. 中で 0 にすると,毎回リセットされてしまいます. 10 問なので,正答率は 正解数 * 10 でパーセントになります. 種類を選んだら,if で分けて 「問題の記号」と「正しい答え」を変数(たとえば kigou と seitou)に入れておくと, input と答えあわせは 1 か所に書くだけで済みます. 引き算で a が b より小さいときは,2 つの値を入れかえてください (tmp = a,a = b,b = tmp).
評価の目安(10 段階)

必須(すべて満たして正しく動けば 8)

  1. random.randint で 1 桁の 2 つの数と問題の種類(1〜3)を選び,足し算・引き算・かけ算が混ざって出る
  2. 引き算の答えが負にならない(大きいほうから小さいほうを引く)
  3. for i in range(10): で 10 問出し,int(input(…)) で受け取った答えを正誤判定する(不正解のときは正答を表示)
  4. 正解数を繰り返しの外で 0 にして数え,最後に正答率(%)と段位(名人・中級・初級)を表示する

発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)

  • 2 桁の数の問題も出す
  • まちがえた問題の番号を最後にまとめて表示する
  • かけ算だけ正答率を別に数えて表示する

必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6

課題課題 5 マイホーム大作戦

■ 概要

マイホームローンの返済計算を行うプログラムである. ユーザは家を買うときに利用することを想定する. 家の値段と利率,月々の返済金額を入力として受け取り, 返済が終わるまでにかかる期間と総返済金額を計算し, コメントとともに出力します.

■ 機能

  1. プログラムの起動時および終了時に,その旨をユーザに伝えるメッセージを出力する.起動時出力:「開始しました」,終了時出力:「終了しました」(適宜変えてよい).
  2. 家の値段,利率,月々の返済金額を入力として受け取り,返済が終わるまでにかかる期間,総返済金額を計算し,コメントとともに出力する.
    入力:家の値段(整数.万円単位だと使いやすい),利率(百分率の実数),月々の返済金額(整数)
    出力:かかる期間(○年),総返済金額,コメント
  3. 返済方法は元利均等方式(借入元金と借入利息を合わせて,月々同じ金額を返済する方式)とし,利息は年単位で複利計算を行う.
    たとえば 10000 円を利率 5% で借り,月々の返済金額が 100 円の場合,1 年目の返済が終了すると 10000 + 500 − 1200 = 9300 円の借入元金が残る.
  4. 1 円未満は切り捨てとする(利息は小数で計算して,1 年ごとに int() で切り捨てる).
    1 年の計算は「利息をつける → 1 年ぶん(月々の返済金額 × 12)を返す」の順とし,最後の年は残っている金額だけを払う(総返済金額には,実際に払った金額を足していく).
  5. これもやりましょう:5 年ごと(5 年目,10 年目,…)に,その年の返済が終わった時点の残高を「5 年目の残高:○ 円」の形で表示する.
  6. 入力例と出力:家の値段 3000 万円,年利 1.5%,月々 10 万円なら,5 年目の残高は 26135799 円,30 年目は 1845972 円で,返済期間は 32 年,総返済金額は 37883765 円になる.月々 3 万円にすると,1 年目の利息(450000 円)が 1 年の返済額(360000 円)以上なので返せない.
  7. コメントは各自工夫してよい(100 万円:ちょっと安すぎる家では? 50 年:長すぎるのでは? など).

■ エラー処理

文字など処理不可能な値が入力されたときの処理は,行っていない.入力欄には素直に数を書くこと.

■ プログラム設計条件

  • 入出力は起動したコンソールから行う(CUI プログラムである).
  • 家の値段・月々の返済金額の入力には int(input(…)),利率の入力には float(input(…)) を使用する.
  • 返せない場合は繰り返しが終わらなくなるので,事前に確かめること.また while には「50 年まで」のような必ず終わる条件を必ず付け足すこと.
考え方 1 年ぶんの計算は,次の 2 行です.
python
zandaka = int(zandaka * (100 + riritsu) / 100)   # 利息がつく(1 円未満切り捨て)
zandaka = zandaka - nenkan                       # 1 年ぶん返す(nenkan は円)
これを残高が 0 以下になるまで繰り返し, その回数が「かかる年数」です. 1 年に返す金額が利息より少ないと,残高は永遠に減りません. だから先に if で確かめておく必要があります. 「5 年ごと」は,数えている年数を 5 で割った余りが 0 かどうか(nen % 5 == 0)で調べられます.
評価の目安(10 段階)

必須(すべて満たして正しく動けば 8)

  1. 家の値段・返済額を int(input(…)),利率を float(input(…)) で受け取る
  2. 1 年ごとに利息をつけて int() で切り捨て,最後の年は残りだけ払う計算を while で繰り返し,返済年数と総返済金額を表示する(3000・1.5・10 で 32 年,37883765 円)
  3. 1 年目の利息が年間返済額以上のときは,繰り返しに入らずにその旨を表示する(月々 3 万円のとき)
  4. while に「50 年まで」の条件を付け,while True: を使わない
  5. 5 年ごとに,その時点の残高を表示する(5 年目 26135799 円)

発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)

  • 月単位で利息と返済を計算する版も作り,年単位の結果と比べる
  • 利率を 0.5% ずつ変えたときの総返済金額を並べて表示する

必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6

課題課題 6 ザ・バイナリサーチ

■ 概要

このプログラムは「数あてゲーム」である. システムはまず,1 〜 1000 までの整数をランダムに選ぶ(表示しない). ユーザはこの数をなるべく少ない回答で当てるのが目的である. ユーザは推測した数を入力し,システムは数が当たっていたら 当たったことを知らせて終了,外れていたら 大きすぎるのか,小さすぎるのかを知らせて再入力を求めます.

■ 機能

  1. プログラムの起動時および終了時に,その旨をユーザに伝えるメッセージを出力する.起動時出力:「開始しました」,終了時出力:「終了しました」(適宜変えてよい).
  2. 整数をランダムに選ぶ.
    1 〜 1000 までのランダムな整数を 1 つ選び,画面には出さない.
  3. 回答の入力を受けつけ,答えあわせをする.
    プロンプト:「私が選んだ数を当ててみてね」
    入力:回答(整数)
    正解時:「正解です.おめでとう!」と出力して終了する.
    不正解時:「ちがいます」の後,大きすぎるか,小さすぎるかを出力する.
  4. 回答は10 回までとし,10 回で当たらなければ正解を教えて終わる.
  5. これもやりましょう:入力が範囲の外(1 より小さいか,1000 より大きい)だったら,大きすぎ・小さすぎの代わりに「1 から 1000 までの数を入れてください」と注意する(その回も 1 回に数える).
  6. これもやりましょう:当たったら,何回で当てたかで評価を出す(7 回以内=「天才」,8〜9 回=「なかなか」,10 回=「ぎりぎり」).

■ エラー処理

文字など処理不可能な値が入力されたときの処理は,行っていない.入力欄には素直に数を書くこと.

■ プログラム設計条件

  • 入出力は起動したコンソールから行う(CUI プログラムである).
  • 回答の入力には int(input(…)) を使用する.
  • while True: は使わないこと.for i in range(10): で 10 回に限り,正解したら break で抜ける.
なぜ「バイナリサーチ」なのか この課題の名前は「バイナリサーチ(二分探索)」です. 1 〜 1000 の中から数を当てるとき, まん中の 500 を答えるのが最善手です. 「大きすぎる」と言われたら 1 〜 499 に, 「小さすぎる」と言われたら 501 〜 1000 に, 候補が半分に減るからです. 1000 → 500 → 250 → 125 → … と半分にしていけば, 10 回で必ず当たります(2 の 10 乗が 1024 だから). 作ったら,自分で遊んで確かめてください. アルゴリズムの威力が実感できます.これは第 17 章で改めて習います.
ヒント 何回目かは i + 1 で分かります. 範囲の外かどうかは kotae < 1 or kotae > 1000 で調べられます. これをいちばん先に調べ,elif で当たり・大きすぎ・小さすぎを続けてください.
break は,それが入っている繰り返し(ここでは for)をその場で抜ける命令です. for のあとの行から続きを実行します. 当たって抜けたのか 10 回使い切ったのかは,for の前に atatta = False を作り, 当たったときに atatta = True にしておけば,for のあとの if で見分けられます.
評価の目安(10 段階)

必須(すべて満たして正しく動けば 8)

  1. random.randint(1, 1000) で選んだ数を表示せずに当てさせ,外れたときに「大きすぎ」「小さすぎ」を表示する
  2. for i in range(10): で 10 回までにし,当たったら break で抜ける.10 回で当たらなかったときだけ正解を表示する
  3. 0 や 1001 を入れると,範囲の外だと注意する
  4. 当てた回数で「天才」(7 回以内)・「なかなか」(8〜9 回)・「ぎりぎり」(10 回)を表示する

発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)

  • 毎回「残りあと何回」を表示する
  • 範囲(1 〜 1000)を最初に入力してもらう
  • それまでの回答から分かる「候補の範囲」(例:251 〜 499)を毎回表示する

必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6

課題課題 7 世界の○○

■ 概要

このプログラムは,芸人のマネをするソフトウェアである. 任意の自然数を受け取り,その数だけ数を数える.

■ 機能

  1. プログラムの起動時および終了時に,その旨をユーザに伝えるメッセージを出力する.起動時出力:「開始しました」,終了時出力:「終了しました」(適宜変えてよい).
  2. 自然数の入力を受け取り,その数まで数える.3 の倍数のときにバカになり,5 の倍数のときには犬っぽくなる(数えるごとに改行すること).
  3. 出力例:
    1
    2
    3(;.゚Д゚.;)ノ
    4
    5^U)┬┬~
    6(;.゚Д゚.;)ノ
    7
  4. これもやりましょう:1 の位か 10 の位に 3 がつく数(3, 13, 23, 30 〜 39, 43 など)のときもバカになる.3 の倍数でもあり 3 もつく数(33 など)でも,顔は 1 つだけ付ける.
  5. 入力例と出力:35 を入れたときの終わりのほうは
    31(;.゚Д゚.;)ノ
    32(;.゚Д゚.;)ノ
    33(;.゚Д゚.;)ノ
    34(;.゚Д゚.;)ノ
    35(;.゚Д゚.;)ノ^U)┬┬~
    となる(13 と 23 もバカになり,15 と 30 は両方が付く).

■ エラー処理

文字など処理不可能な値が入力されたときの処理は,行っていない.入力欄には素直に数を書くこと.

■ プログラム設計条件

  • 入出力は起動したコンソールから行う(CUI プログラムである).
  • 入力には int(input(…)) を使用する.
  • 繰り返しには for i in range(1, n + 1): を使う.
ヒント 3 の倍数でも 5 の倍数でもある数(15 や 30)のときは, 両方が起こります.elif ではなく, if を2 つ並べて書いてください(例題 T-5 を参照). 「3 がつく数」は,1 の位だけなら i % 10 == 3 で調べられます. 10 の位なら i // 10 % 10 == 3 です. 「3 の倍数」「1 の位が 3」「10 の位が 3」は or で 1 つの if にまとめると, 顔が 2 つ付いてしまうことがありません.
評価の目安(10 段階)

必須(すべて満たして正しく動けば 8)

  1. int(input(…)) で受け取った数まで,for i in range(1, n + 1): で 1 行ずつ数える
  2. 3 の倍数で (;.゚Д゚.;)ノ,5 の倍数で ^U)┬┬~ を付ける
  3. 15 のように両方の倍数のときは,両方が付く(if を 2 つ並べる)
  4. 13・23・31 のように 1 の位か 10 の位に 3 がつく数でもバカになり,33 でも顔は 1 つだけ

発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)

  • 何回バカになったかを最後に表示する
  • 7 の倍数では別のことをする
  • 100 以上(130 など)でも,どの位に 3 があってもバカになるようにする

必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6

課題課題 8 素因数分解プログラム

■ 概要

このプログラムは,入力された整数を素因数分解し, 得られた素因数をすべて出力します. 60 と入力したら 60 = 2 × 2 × 3 × 5 と表示する, というものです.

■ 機能

  1. プログラムの起動時および終了時に,その旨をユーザに伝えるメッセージを出力する.起動時出力:「開始しました」,終了時出力:「終了しました」(適宜変えてよい).
  2. 整数の入力を受け取り,その数の素因数をすべて出力する.
    入力:2 以上の整数
    出力:素因数を小さい順に並べたもの
  3. 同じ素因数が何回も出てくるときは,その回数だけ出力する(8 なら 2 × 2 × 2,12 なら 2 × 2 × 3).
  4. 出力の形は 60 = 2 × 2 × 3 × 5 とする(入力した数,=,素因数を × でつないだもの).
  5. 入力された数が素数のときは,その数自身が 1 つだけ出力される(13 なら 13 = 13).
  6. これもやりましょう:見つけた素因数の個数を数え,1 個だけだったら(=素数だったら)続けて「13 は素数です」と表示する.
  7. 入力例と出力:60 → 60 = 2 × 2 × 3 × 5,360 → 360 = 2 × 2 × 2 × 3 × 3 × 5,13 → 13 = 13 と「13 は素数です」.

■ エラー処理

文字など処理不可能な値が入力されたときの処理は,行っていない.入力欄には素直に数を書くこと.

■ プログラム設計条件

  • 入出力は起動したコンソールから行う(CUI プログラムである).
  • 入力には int(input(…)) を使用する.
  • 割る数を 2 から 1 つずつ大きくしていき,割り切れるあいだは同じ数で割り続けること.
  • 繰り返しには while を使う.while True: は使わないこと.割る数が残りの数を超えたら終わる,という条件にする.
考え方 「小さい数に分解する」のですから, 2 から順に割ってみるのが素直なやり方です.
  1. 割る数 waru を 2 から始める.
  2. 割り切れたら,その waru は素因数なので書きとめ,残りの数を waru で割った値に更新する(割る数はそのまま.同じ数で何度でも割れるから).
  3. 割り切れなかったら,割る数を 1 つ大きくする.
  4. 割る数が残りの数より大きくなったら終わり.
60 でたどってみましょう. 60 ÷ 2 = 30,30 ÷ 2 = 15, 15 は 2 で割れないので割る数を 3 にして 15 ÷ 3 = 5, 5 は 3 でも 4 でも割れず,割る数が 5 になって 5 ÷ 5 = 1. こうして 2, 2, 3, 5 が得られます. 割り算は //(商)を使ってください. / だと答えが小数になってしまいます.
なぜ必ず終わるのか この繰り返しは,必ず終わります. 割り切れたときは残りの数が小さくなり, 割り切れなかったときは割る数が大きくなるので, どちらに転んでも 2 つの数は近づいていくからです. while True: を使わなくてよいのは,このためです. ただし,大きすぎる数を入れると時間がかかります. 2 から順に試していくので,7 桁の素数などを入れると待たされます. はじめは 60 や 360 のような 2 〜 3 桁で試してください.
ヒント 最初の素因数の前には × を付けません. kotae がまだ空(kotae == "")かどうかで,付けるか付けないかを分けてください.
評価の目安(10 段階)

必須(すべて満たして正しく動けば 8)

  1. 60 を入れると 60 = 2 × 2 × 3 × 5 の形で,素因数を小さい順に表示する(先頭に余分な × がない)
  2. 割り切れるあいだは同じ数で割り続け,割り算には // を使う
  3. while True: を使わず,「割る数が残りの数以下のあいだ」繰り返す
  4. 13 を入れると 13 = 13 と「13 は素数です」が表示され,60 では素数と表示されない

発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)

  • 2 の 3 乗 のように,同じ素因数をまとめて表示する
  • 2 から 30 までの数を順に素因数分解して並べる
  • 2 より小さい数が入ったら注意を出す

必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6

自由課題 9 独自の観点で CUI プログラムを作ろう

■ 概要

独自の観点で,CUI プログラムを作りなさい. 何を作るかは自由です. ただし,自分で仕様書を書いてから作ること.

■ 機能

  1. プログラムの起動時および終了時に,その旨をユーザに伝えるメッセージを出力する.起動時出力:「開始しました」,終了時出力:「終了しました」(適宜変えてよい).
  2. 入力・処理・出力がそろっていること.入力を 1 つ以上受け取り,それを使って何かを計算し,結果を表示する.
  3. 条件分岐(if)か繰り返し(for)のどちらかを必ず使うこと.
  4. プログラムの先頭に,自分で書いた仕様書をコメントで入れること(概要・機能・エラー処理・設計条件の 4 つ).

■ エラー処理

処理不可能な値が入力されたときの処理を行うかどうかは,各自で決めて仕様書に書くこと.

■ プログラム設計条件

  • 入出力は起動したコンソールから行う(CUI プログラムである).
  • 入力には input(…)・int(input(…))・float(input(…)) のいずれかを使用する.
  • while True: は使わないこと.
  • ファイルの先頭のコメントに,題名・氏名・日付を書くこと.
題材のヒント
  • おつり計算機:代金と預かり金から,硬貨の枚数を // と % で求める(出発点のプログラムはこれです)
  • おみくじ:名前を入れると運勢が出る(ord を使えば同じ名前で同じ結果になる)
  • 西暦・和暦の変換:西暦を入れると和暦を返す
  • 九九の練習:乱数で問題を出して,10 問答えあわせ(課題 4 の応用)
  • 身長から適正体重:いくつかの計算式で比べて表示する(課題 1 の応用)
  • アルバイト代の計算:時給と時間と深夜割増から給料を求める
  • カロリー計算:食べたものを何個か入力して,合計と運動時間に換算する
  • 暦の計算:西暦を入れると,うるう年かどうかを判定する(4 で割り切れ,かつ 100 で割り切れない.ただし 400 で割り切れればうるう年)
いきなり書き始めない 先に仕様書を書いてください. 「作りながら考える」と,たいてい途中で行き詰まります. 「何を入力し」「何を計算し」「何を出すのか」を日本語で書き切ってから, Python に翻訳するほうが,結局は速く終わります.
評価の目安(10 段階)

必須(すべて満たして正しく動けば 8)

  1. 先頭のコメントに,題名・氏名・日付と,自分で書いた仕様書(概要・機能・エラー処理・設計条件)がある
  2. 入力を int(input(…))・float(input(…))・input(…) のうち,値に合った型で 1 つ以上受け取る
  3. 受け取った値を使って計算し,if か for を使って結果を表示する
  4. 仕様書に書いたとおりに動き,「開始しました」「終了しました」を表示する

発展(必須に加えて 1 つ以上で 9,学んだ範囲を大きく超える作り込みで 10)

  • random や ord を使って,結果が変わる・名前で決まる仕掛けを入れる
  • 処理できない値(足りない金額,0 以下など)への対応を仕様書に書き,そのとおりに作る
  • 仕様書に入力例と期待される出力を書き,そのとおりになることを確かめている

必須が 1〜2 つ足りない → 7 / 動かない・未着手が複数 → 6

9.6 作品にするときのきまりと見直しの観点

どの課題も,仕様を満たしていることがいちばん大事です. そのうえで,次の点を見ます.

観点見るところ
仕様の充足「機能」に書かれたことが,すべてできているか
入力の型整数は int(input(…)),小数は float(input(…)) になっているか
変数名a・x ではなく,意味の分かる名前がついているか
コメント先頭に題名・氏名・日付があり,処理の区切りに説明があるか
表示f 文字列を使い,読んで意味の分かる文になっているか
独自の工夫仕様にない工夫(コメントの文面,追加の表示,発展課題)があるか
よくある減点 「開始しました」「終了しました」を忘れないでください. これは仕様に書いてある機能の 1 つです. 仕様書に書いてあることを 1 つでも落とすと, 実際の仕事では「できていない」ことになります. 仕様書を最後にもう一度読み返して,指さし確認をしてから仕上げてください.

まとめ

  • CUI プログラムは,文字だけで入出力するプログラム.input() と print() があれば作れる.
  • 課題は仕様書の形で与えられる.「概要」「機能」「エラー処理」「プログラム設計条件」を全部読んでから書き始める.
  • 仕様を読んだら,「入力」「処理」「出力」の 3 つに分けて整理する.
  • 変数の型は int(整数)・float(小数)・str(文字列)・bool(真偽値)の 4 つ.int()・float()・str() で型を変えられる.
  • 数として読めない文字列を int() に渡すと ValueError,型の違うものを + でつなぐと TypeError になる.
  • input() が返すのは必ず文字列.入力の型を間違えないこと.整数は int(input(…)),小数は float(input(…)).
  • int() は切り捨て.小数には誤差があるので,お金や個数は整数で扱う.
  • モジュールは,便利な命令をまとめた箱.import random で箱を開け,random.randint(a, b) のように「箱の名前.命令の名前」で呼ぶ.
  • 割り切れるあいだ同じ数で割り続けると,素因数分解ができる.割る数か残りの数のどちらかが必ず近づくので,繰り返しはいつか終わる.
  • 範囲で分けるときは if・elif・else.両方起こりうるときは if を並べる.
  • ある範囲に収めたいときは % が使える.x % 101 は必ず 0 〜 100 になる.
  • while True: は書かない.回数を決めた for か,必ず終わる条件を付けた while にする.
  • 始まりと終わりを print で知らせるのは,CUI プログラムの作法.

今回の課題は,絵が出ない代わりに, 「書いてあるとおりに作る」「自分で仕様を決める」という, プログラミングのもう一つの側面を練習するものです. タートルの回で身につけた if・for・変数は, そのままここでも働きます.道具は同じで,使い道が違うだけです.

次の回からは,またタートルに戻ります. 今度は絵を動かします. ontimer という命令を使って 「少し動かして,少し待って,また少し動かす」を繰り返させると, 第 8 章までに描いた絵がアニメーションになります.

復習:虫食いで確かめる

コードの ____ を埋めてください.実行前に結果を予測し,実行後に問題文の条件と照合しましょう.assert は条件が成り立つかを調べ,成り立たないとエラーになります.

虫食い虫食い・復習 1 文字列を数に直して足す

input で受け取った値は文字列です."3" と "4" を数に直して足し,7 と表示されるよう,型を変える命令を補ってください.

fill_review_lec07_1.py
a = "3"
b = "4"
total = ____(a) + ____(b)
print(total)
虫食い虫食い・復習 2 数を文字列につなぐ

「合計は24」と表示します.文字列と数を + でつなぐと TypeError になるので,数を文字列に直す命令を補ってください.

fill_review_lec07_2.py
total = 24
print("合計は" + ____(total))