課題レポート1: print()関数と変数の利用、用語整理。
目次
課題レポート1: print()関数と変数の利用、用語整理。¶
取り組み方¶
ここでは具体的にコードを書く手順は指定しない。思い通りに書いてみよう。
その過程で、書いたコードが想定通りに動かないなら、そのコードと結果(エラーの場合はエラーも含めた結果)を示し、その理由を考察せよ。
もし一発で想定通りに動いたのなら、正解コードと結果を示し、考察では好きなことを考察せよ。
友人らと話し合って取り組んで構わないが、考察は自分自身の言葉で述べること。試して分かったこと、自身で解決できなかった部分等についてどう取り組んだか、といった過程がわかるように示すこと。考えを図表や文章を駆使して表現して報告する練習です。
ある事象について妥当と思われる表現が思い浮かばないのなら、そのことを先輩らに尋ねてみよう。
レベル1「print()関数で出力せよ」¶
課題
以下のように文字列を出力するプログラムを作成せよ。なお
yourname
はレポート作成者自身の名前にすること。
補足
レポートには コードと実行結果 をそのまま掲載すること。コードを間違えた場合でも、そのまま掲載して構わない。(最後には正しい結果となるコードと、その実行結果を示すこと)
yournameさん、プログラミング1の授業へようこそ!
レベル2「変数を使おう1」¶
背景
レベル1では、例えばレポート作成者が naltoma である場合には
print('naltomaさん、プログラミング1の授業へようこそ!')
のように書くことで指定された文字列を出力することができる。これはこれで良いが、名前の部分を直接コードに含む形で書いてしまうと次のような状況では困ってしまう。例えばログインが必要なアプリを作成しているとしよう。ログイン後に「**さん、おはようございます!」のようにログインしたユーザの名前を含むメッセージを出力したい場合を想像しよう。もしコードに直接氏名を埋め込む形を取るのであれば、ユーザ毎に異なるコードを持つプログラム、即ちユーザごとに異なるプログラムを開発せざるを得ない。これは無駄だし、そもそも全利用者の氏名を予め把握することは事実上不可能である。つまり、コードに直接埋め込む形で文字列を作成するのは不適切である。
これを避けるため、「まず名前を変数に保存する。次にその変数を使って文字列を用意する。最後にその文字列を出力する。」という手順で出力することにしたとしよう。
課題
(1) 名前を保存する変数名を検討せよ。
(2) 検討した変数名を使い、
牧瀬紅莉栖
を保存するコードを書け。(3) 保存した変数名を使い、
牧瀬紅莉栖さん、プログラミング1の授業へようこそ!
という文字列を用意し、変数 message に保存するコードを書け。(文字列を保存するだけで良い)(4) (3)で用意した変数を用いてprint関数で出力するコードを書け。
補足
レポートには(2)〜(4)のコードと、その際の実行結果を掲載すること。
レベル3「変数を使おう2」¶
(飛ばしても良い)背景
予想外にも牧瀬紅莉栖の乱入により授業は混迷の渦に巻き込まれた。どうにかして受講を回避すべく単位の話をしはじめた。
牧瀬紅莉栖は既に大学で必要な単位数(130)を超える単位を取得済みだとする。具体的には200単位取得済みだとしよう。
背景
牧瀬紅莉栖が取得済みの単位数を変数
got_unit
に保存したとする。レベル2の(2)で用いた変数(仮にhogeとする)と、変数got_unitを用いて次の文字列を作成したいとしよう。
作成したい文字列:
牧瀬紅莉栖さん、いえDr.牧瀬。あなたは既に200単位も取得済みですが、、
このつもりで
hoge + 'さん、いえDr.牧瀬。あなたは既に' + got_unit + 'も取得済みですが、、'
というコードを書いて、実行したとしよう。すると次のような結果が得られる。(実際に確認しよう)
>>> hoge = '牧瀬紅莉栖'
>>> got_unit = 200
>>> hoge + 'さん、いえDr.牧瀬。あなたは既に' + got_unit + 'も取得済みですが、、'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
Pythonインタプリタからの応答は3行に跨っており、それぞれ以下のような意味である。
1行目の
Traceback
から始まる行は、「直前の命令文を実行した際に問題が生じたので、何が問題だったかを追跡する(=traceback)」という報告である。2行目の
File "<stdin>"
から始まる行は、「モジュールの1行目で問題が生じた」ということを示している。ここでいう1行目とは、単に直前の行を指しているため、行番号自体には意味はない。(モジュールは後日説明します)3行目の
TypeError
から始まる行は、Type、すなわち「型」に関するエラーが発生したことを報告している。具体的な内容は「can」以下で示しており、「str型をstr型に結合することだけできる(int型は結合できない)」と述べている。これは例えば、1 + "テスト"
のようにint型とstr型を直接 + 演算子により足し算しようとしても、プログラマがコンピュータに対してどのような結果を求めているかが分からないため、「暗黙的に処理することはできない」と報告している。
課題
(1) 上記で実行したコードには、+演算子が3つ含まれている。このうち、どの部分で今回のエラーが生じたのかを調べたい。どのように調べたらよいだろうか。
レポートには調べ方を報告せよ。
なお、ここでの「調べ方」には検索エンジンの利用を含めても構わないが、それだけでは「どの部分で今回のエラーが生じたのか」は分からない点に注意すること。これは、例えば目の前に手作り1点ものの玩具がある場合、それがどこか故障しているときに検索しても(1点ものだから)直接的な回答はどこにも存在せず、玩具自体をどうにかして調べる必要がある状況を意図している。
(2) (1)で検討した方法で調査し、調査結果を報告せよ。
レポートには取り組んだ過程が分かるように、(a)プログラムとその実行結果を掲載しつつ、(b)何番目の+演算子により今回のエラーが生じたのかを報告せよ。
補足
今回のエラーは「TypeError」である箇所全てを報告すること。
レベル4「用語を整理しよう」¶
教科書2.1節〜2.1.2節に出てくる以下の用語(Glossary)について、関連の深い用語同士をまとめることでいくつかのグループに分類、もしくは紐付けよ。
例えば、英単語の car, plane は「移動するための機械」という点で類似している。また mobile phone, iPhone は上位下位関係もしくは包含関係(iPhoneはmobile phoneの一種)にある。他にも「こう関連している」という理由は様々考えられるだろう。自由で構わない(正解である必要はない)ので、現時点での自分なりの解釈で分類してみよう。後日誤りに気づいたらその時点で更新すると良いだろう。
補足
グループ数は2個以上10個以内とする。用語を1個しか含まないグループがあっても良い。
レポートには、分類結果とそのように分類した理由(グループごとの共通項等)について報告すること。分類結果の記載方法は問わないが、見やすくなるよう工夫すること。
用語
program
script
shell
command
statement
objects
type
scalar objects
non-scalar objects
literals
int (integers)
float (floating point numbers)
bool (Boolean values)
operators
expressions
value
shell prompt
variables
reserved words
comments
課題ではないが押さえておきたいポイント¶
Note
学びの竜巻
受け身で情報を吸収するだけでは、効果的な学びにはつながらない。
与えられた知識は、すでに自分がもっている他の知識と結びつくことで、初めて「わかった」と実感できる。
自らの興味・関心の「竜巻」に絡め取るように、情報をつかみ、自分がもつ知識と混ぜ合わせ、関係づける。
得られた知識を単に溜め込むのではなく、自分のもっていた知識と混ぜ合わせ、関係づけていく。ノートや本の余白に、自分が考えたことを書き込むとよい。
提出方法¶
提出物は「レポート」だけで良い。レポートはgoogleドキュメントで作成すること。
レポートは電子ファイルで提出するものとする。
レポートのファイル名を「report1」とする。
提出先&〆切: 授業ページを参照。