この科目を履修し単位を取得する予定の方は, 講義初回に必ず出席してください.
課題
自己紹介をお願いします.
いま興味のある数学・数理科学(の分野)について自由に答えてください. これまで学んだ内容でも, これから勉強したい内容でも何でも構いません.
文章「1.23+4.56は5.79です」を表示するプログラムを, 書式指定を用いて作成しなさい.
print('%.2f+%.2fは%.2fです' % (1.23,4.56,5.79))
※ 指示桁値がないと「1.230000+4.560000は5.790000です」と表示される(今回はこれも正解とした).
123 を 00000123 と出力するための書式指定を答えなさい.
print('%08d' % (123))
「私の名前は****で, 学修番号は****です」と出力するプログラムを, format メソッドを使って書きなさい. ただし****の部分にはあなたの名前と学修番号が入る. なお使用する変数は好きに決めてよい.
a='横山俊一'
b=19850711
print(f'私の名前は{a}で, 学修番号は{b}です')
第2回 (10/14) 演習の回
※ 詳細は 10/7 の講義中に指示します.
課題
以下のプログラムを実行したとき, a および c の値がどのように変化するか説明し, 最後に print 関数によって表示される値を答えなさい.
a=5
b=7
c=2
a -= b/c
c += b-a%c
a = (c-b)*40*a//c
print(a)
実際に1行ずつ実行して確かめればよい(そのための練習問題). なお答えのみ記したものは大幅減点した.
・4行目: a=5-7/2=1.5, cは変わらず2
・5行目: aは変わらず1.5, c=2+7-(1.5を2で割った余り)=7.5
※ スライドの仮定(int型指定)をみたしていないケースだが, この場合はそのまま1.5が残留する.
・6行目:a=(7.5-7)*40*1.5//7.5=30//7.5=4.0, cは変わらず7.5
よって答えは4.0である. 実際, 30÷7.5の商はきっかり4だが, 30がfloat型なのでこれに影響されている.
演算子が複数含まれている場合, 実行される順番が決まっている. 上記問題 1. における実行順序(優先順位)について簡潔に説明しなさい.
これは通常の演算と同じ. 例えば加減より乗除が優先される, ()の内部を優先するなどである.
// についても除算のカテゴリーなので, / と同じ優先順序である.
以下のプログラムはエラーとなり正しく実行できない. その誤りを指摘し, 正しいプログラムに修正しなさい. なお誤りは1ヶ所とは限らない. また, ここで「正しいプログラム」とは, 最終実行結果が「81」となるプログラムのこととする.
a=2: b=9
b=**a
print(b)
1行目の : が ; であることと, 2行目の =** が **= であることの2点(これは簡単).
真偽判定(True / False)は, 例えば以下のようにプログラムすることができる.
print(not True and False)
上を実行すると False が出力される. 同様のプログラムをいくつか試すことで「and」「or」「not」の実行順序(優先順位)を特定し, その根拠を述べなさい. 特定のために実行したプログラムもすべて含めること.
優先順序は not > and > or の順に高い.
上記からまず「(not True) and False」なら「False and False」の意味になるので, 問題文の通り出力は False になる. 一方「not (True and False)」ならば「not False」, つまり True の意味になるので問題文に反する. したがって先に左から先に not を実行していることになるから not が優先されている.
あとは and と or を比較すればよいが, これは例えば「True or True and False」などとすればよい. これを実行すると True となり, これは「True or (True and False)」を意味するので, and が優先されている.
第4回 (10/28) リストとソート ※ スライドは前回を参照
課題
以下のリストを考える:
L = [43,76,23,11,79,54,23,43]
(a) L を数の大きい方から順に並べ替えるためのプログラムを答えなさい.
L.sort(reverse=True)
(b) (a) で得られた(上書きされた)リスト L に対し, 76 と 54 の間に 61 を挿入するプログラムを答えなさい.
L.insert(2,61)
(c) (b) で得られた(上書きされた)リスト L から 23 をすべて削除するプログラムを答えなさい.
注意:スライドでは remove の例が文字列のリストだったが, 今回は整数なので L.remove(23) のように書く(シングルクォーテーションはつけない).
L.remove(23); L.remove(23)(単純に2回実行する)
実は while 文を使えばよりスマートに書ける(次回以降に扱う)
リストに対して, 含まれる値の最大値・最小値・合計を求める関数 max, min, sum がある. 例えば上のリストで
S = sum(L)
を実行すると 352 と出力される. 以上をもとに, オリジナルのプログラムを作成しなさい. ただし以下の条件をすべてみたすこと:
・関数 max, min, sum をすべて用いること.
・プログラムは10行以上とすること.
・何を計算するプログラムであるかを別途明記すること.
並べ替えを行う関数は sort の他に sorted がある. これは以下のように用いる:
Ls = sorted(L)
この関数は sort とは大きく異なる特徴をもつ. それは何か, 自由に探究してみよ.
ヒント: 前回スライドの最後の注意.
sort 関数は, 問題 1. で扱ったように元々のリストを上書きしている. これに対し, sorted 関数は新しくリストを保持するため, 元々のリストを上書きしていない(そのため print(L.sort()) が None を返すと言及した/対して print(sorted(L)) は有効である). なお sort 関数の操作を「破壊的」(インプレース:in-place), sorted 関数の操作を「非破壊的」(ノットインプレース:not in-place)であるという.
11/4 大学祭期間
課題
0以上100以下の整数を変数 p に代入し, 以下のように表示するプログラムを書きなさい. なお p はキーボードから入力できるようにしても, 最初に適当に代入しておいてもよい.
・p が90以上ならば「あなたの成績はAです」と表示される.
・p が80〜89ならば「あなたの成績はBです」と表示される.
・p が70〜79ならば「あなたの成績はCです」と表示される.
・p が60〜69ならば「あなたの成績はDです」と表示される.
・p が59以下ならば「あなたの成績はFです」と表示される.
ただし, p が0以上100以下をみたさない場合はエラーメッセージを返すこと.
エラーを返す場所は最初でも最後でもよいが, 一般的には最初に置いて reject するほうが書きやすい. 以下その例:
if p<0 or p>100:
print("入力値に誤りがあります")
elif p>=90:
print("あなたの成績はAです")
elif p>=80:
print("あなたの成績はBです")
elif p>=70:
print("あなたの成績はCです")
elif p>=60:
print("あなたの成績はDです")
elif p>=0:
print("あなたの成績はFです")
この記法のポイントは, 最初にエラーの範囲を指定することで or 構文を極力減らしているところにある. もちろん elif パートで if p>=80 and p<90 のように書いても構わない(この書き方の方が多かった).
2つのリスト a=[1,2,3,4,5,6,7], b=[ ] を考える(b は空のリストである). このとき, for 文とリスト a を使って, リスト b を
b=[2,5,10,17,26,37,50]
に上書きしたいとき, 下の ( ? ) にあてはまるプログラムを答えなさい.
for x in a:
b.append( ? )
例えば x^2+1 など.
前問2において, 内包表記とリスト a を使って
b=[2,5,10,17,26,37,50]
に上書きするプログラムを答えなさい.
b=[x^2+1 for x in a]
次のプログラムの実行結果を答え, 関数 continue は何を実行する関数か考察しなさい.
for x in range(5):
if x==3:
continue
print(x)
for ループ文において break したくないとき, 特定の条件下のみ処理をスキップする命令である. 実際, これを実行すると 0,1,2,4 が print され, 3はスキップされている.
第6回 (11/18) 条件分岐:応用編 ※ スライドは前回を参照
課題
以下のように, 100 から7ずつ引き算した 自然数 のみを順に表示させるプログラムを while 文を用いて書きなさい.
100
93
86
...
9
2
例えば以下のように書ける:
n=100
while n>0:
print(n)
n-=7
for, if, while を すべて 使って自作のプログラムを書きなさい. ただし以下の条件をみたすこと:
・プログラムは 20行以上 とする.
・プログラムの中に必ず1ヶ所以上 内包表記 を用いること.
・何を計算するプログラムなのか, その説明を完結に添えること.
力作揃いで楽しく拝見しました (^^)
課題
引数を4つ以上もつ 関数を1つ作成しなさい. 何を計算する関数なのかを明記すること.
5つの整数 a,b,c,d,e が入力されたとき, これらを小さい順に並び替えたリストを返す関数 srt を lambda 関数を用いて 書きなさい.
ヒント: 第4回の課題3で登場した sorted 関数を用いるとよい. その際, lambda 関数では1行で書き切るので, 直接 sorted([a,b,c]) のように書けばよい.
前問 2. の関数 srt を callback 関数を用いて 定義し, リスト [23,54,76,22,23] の並び替えを実行しなさい.
ヒント: lambda 関数を用いる. より正確には, 例えば以下のように書ける:
def srt(< 1 >,callback):
print(< 2 >)
srt(23,54,76,22,23,< 3 >)
とくに < 3 > は前問 2. と同様のプログラムになるはず.
第8回 (12/2)
課題
第9回 (12/9)
課題
第10回 (12/16)
課題
第11回 (12/23)
課題
12/30 冬季休業期間
第12回 (1/6) 演習の回
※ 詳細は 12/23 の講義中に指示します.
第13回 (1/13) 総括・最終レポート課題
第14回 (1/20) 最終レポート作成・質問対応回 Part 1
※ 詳細は 1/13 の講義中に指示します.
第15回 (1/27) 最終レポート作成・質問対応回 Part 2
※ 詳細は 1/13 の講義中に指示します.
Contact: s-yokoyama [at] tmu.ac.jp