# 課題レポート1: print()関数と変数の利用、用語整理。

## 課題概要
- Python3のprint()関数に慣れよう。
- 変数の役割を覚えよう。
- 基本的な用語を自分なりに解釈し、整理してみよう。

<hr>

## 取り組み方
- ここでは具体的にコードを書く手順は指定しない。思い通りに書いてみよう。
  - その過程で、書いたコードが想定通りに動かないなら、そのコードと結果（エラーの場合はエラーも含めた結果）を示し、その理由を考察せよ。
  - もし一発で想定通りに動いたのなら、正解コードと結果を示し、考察では好きなことを考察せよ。
- 友人らと話し合って取り組んで構わないが、考察は自分自身の言葉で述べること。試して分かったこと、自身で解決できなかった部分等についてどう取り組んだか、といった過程がわかるように示すこと。考えを図表や文章を駆使して表現して報告する練習です。
  - ある事象について妥当と思われる表現が思い浮かばないのなら、そのことを先輩らに尋ねてみよう。

<hr>

## レベル1「print()関数で出力せよ」
- 課題
  - 以下のように文字列を出力するプログラムを作成せよ。なお ``yourname`` はレポート作成者自身の名前にすること。
- 補足
  - レポートには **コードと実行結果** をそのまま掲載すること。コードを間違えた場合でも、そのまま掲載して構わない。（最後には正しい結果となるコードと、その実行結果を示すこと）
```
yournameさん、プログラミング1の授業へようこそ！
```

<hr>

## レベル2「変数を使おう1」
- 背景
  - レベル1では、例えばレポート作成者が naltoma である場合には ``print('naltomaさん、プログラミング1の授業へようこそ！')`` のように書くことで指定された文字列を出力することができる。これはこれで良いが、名前の部分を直接コードに含む形で書いてしまうと次のような状況では困ってしまう。
  - 例えばログインが必要なアプリを作成しているとしよう。ログイン後に「＊＊さん、おはようございます！」のようにログインしたユーザの名前を含むメッセージを出力したい場合を想像しよう。もしコードに直接氏名を埋め込む形を取るのであれば、ユーザ毎に異なるコードを持つプログラム、即ちユーザごとに異なるプログラムを開発せざるを得ない。これは無駄だし、そもそも全利用者の氏名を予め把握することは事実上不可能である。つまり、コードに直接埋め込む形で文字列を作成するのは不適切である。
  - これを避けるため、「まず名前を変数に保存する。次にその変数を使って文字列を用意する。最後にその文字列を出力する。」という手順で出力することにしたとしよう。
- 課題
  - (1) 名前を保存する変数名を検討せよ。
  - (2) 検討した変数名を使い、``牧瀬紅莉栖`` を保存するコードを書け。
  - (3) 保存した変数名を使い、``牧瀬紅莉栖さん、プログラミング1の授業へようこそ！`` という文字列を用意し、変数 message に保存するコードを書け。（文字列を保存するだけで良い）
  - (4) (3)で用意した変数を用いてprint関数で出力するコードを書け。
- 補足
  - レポートには(2)〜(4)のコードと、その際の実行結果を掲載すること。

<hr>

## レベル3「変数を使おう2」
- （飛ばしても良い）背景
  - 予想外にも牧瀬紅莉栖の乱入により授業は混迷の渦に巻き込まれた。どうにかして受講を回避すべく単位の話をしはじめた。
  - 牧瀬紅莉栖は既に大学で必要な単位数（130）を超える単位を取得済みだとする。具体的には200単位取得済みだとしよう。
- 背景
  - 牧瀬紅莉栖が取得済みの単位数を変数 ``got_unit`` に保存したとする。
  - レベル2の(2)で用いた変数（仮にhogeとする）と、変数got_unitを用いて次の文字列を作成したいとしよう。
    - 作成したい文字列: ``牧瀬紅莉栖さん、いえDr.牧瀬。あなたは既に200単位も取得済みですが、、``
    - このつもりで ``hoge + 'さん、いえDr.牧瀬。あなたは既に' + got_unit + 'も取得済みですが、、'`` というコードを書いて、実行したとしよう。すると次のような結果が得られる。（実際に確認しよう）

```Python
>>> 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」である箇所全てを報告すること。

<hr>

## レベル4「用語を説明しよう」
- 教科書2.1節〜2.1.2節に出てくる以下の用語（Glossary）について、教科書や授業資料、その他の資料を参照した上で説明せよ。ただし以下の条件を守ること。
  - 条件1: 全てについて調査する必要はないが、最低でも10個選ぶこと。
  - 条件2: 「教科書と授業資料」以外を参照した際には出典を示すこと。
    - 参考: [情報リテラシーガイドブック](https://www.lib.u-ryukyu.ac.jp/support/literacy/)の「3. レポートを書くときの注意点 -著作権と引用-」
- 用語候補
  1. プログラム (program)
  1. スクリプト (script)
  1. シェル (shell)
  1. 命令 (command)
  1. 文またはステートメント (statement)
  1. オブジェクト (object)
  1. 型 (type)
  1. スカラ (scalar)
  1. 非スカラ (non-scalar)
  1. リテラル (literal)
  1. 整数型, 整数, int (integers)
  1. 実数型, 実数または浮動小数点, float (floating point numbers)
  1. ブール型, 真偽値, bool (Boolean values)
  1. 演算子 (operator)
  1. 式 (expression)
  1. 値 (value)
  1. シェルプロンプト (shell prompt)
  1. 変数 (variable)
  1. 代入 (assignment)
  1. 予約語 (reserved word)
  1. コメント (comment)

<hr>

## 課題ではないが押さえておきたいポイント
```{note}
> 学びの竜巻
>
> 受け身で情報を吸収するだけでは、効果的な学びにはつながらない。
> - 与えられた知識は、すでに自分がもっている他の知識と結びつくことで、初めて「わかった」と実感できる。
>
> 自らの興味・関心の「竜巻」に絡め取るように、情報をつかみ、自分がもつ知識と混ぜ合わせ、関係づける。
> - 得られた知識を単に溜め込むのではなく、自分のもっていた知識と混ぜ合わせ、関係づけていく。ノートや本の余白に、自分が考えたことを書き込むとよい。
>
> by [ラーニング・パターン, No.10, 学びの竜巻](https://learningpatterns.sfc.keio.ac.jp/No10.html)
```

## 提出方法
- 提出物は「レポート」だけで良い。レポートはgoogleドキュメントで作成すること。
  - レポートは電子ファイルで提出するものとする。
  - レポートのファイル名を「report1」とする。
- 提出先＆〆切: 授業ページを参照。
