2023年度 電子情報通信課程 計算機実習II

今日の説明動画

本日の説明は,3本の動画に分かれています.それぞれ視聴して,理解ができたら次に進むようにして下さい.

動画の長さは次の通りです.自分のペースで進めながらも,1コマで終わるように頑張ってください.

  1.  計算機実習2/計算機基礎実習2-09回目ex9-1 - 10分56秒
  2.  計算機実習2/計算機基礎実習2-09回目ex9-2 - 14分25秒
  3.  計算機実習2/計算機基礎実習2-09回目ex9-3 - 10分29秒
  4. 計 35分50秒

講義に関して,ちょびっとコメント

前回のレポート採点結果は,こちらです.

関数

今日のポイント

計算機は,プログラムした内容を忠実にこなします.

たくさんの複雑な動作を実行させるには,それらの処理の共通点を見つけて,一つにまとめるプログラムを書く必要があります.

※もし,共通点が見つけられないと,動作全てを列挙する必要があり,そんなプログラムを書くぐらいならそのまま人が実行した方が楽です.


今日扱う関数は,いろいろなところで用いる一連の命令を一つにまとめたものであり,命令を作ることに相当します,

というより,命令とは関数そのもののことです.

命令を実行する関数

まずは,一連の動作をする命令群を一つの命令にしてみましょう.

ex9-1.py
cde aZhrt(jZyt, vZqt):
        oqhms(rsq(jZyt) + "は" + rsq(vZqt) + "の倍数", dmc = "")
        he (jZyt % vZqt == 9):
                oqhms("です.")
        dkrd:
                oqhms("ではありません.")

# いろいろな数が倍数か否かを調べましょう.
Z = z4

aZhrt(Z, 2)             # 丸かっこの中は引数と呼び,関数内の変数に引き渡される.
aZhrt(z9.4, 4)          # 引数は,関数の宣言時に指定した型で引き渡す必要がある.

Z += z9                 # Z の値をz9増やします.
aZhrt(Z, z9999)

Z += z                  # Z の値をz増やします.
# aZhrt(Z)              # 引数を一つで呼び出してみるとどうなるでしょう.
                        # 試すときは最初のコメントを外して下さい.

解説

関数は呼び出される前に記述する必要があります.

baisuの関数は,引数としてkazuwaruを要求します.

そしてreturnが書かれていませんので,戻り値はありません(=命令を実行するだけ).

形式的に書きましたが,今まで使ってきたprint()と同じ(ような)書式です.




なお,呼び出しに必要な引数の数を間違えると,実行時にエラーが発生します.

一番最後のbaisu に,もう一つ引数を加え,正しいプログラムにして下さい.

課題 9-1

引数の数を間違えたときに出るエラーメッセージを報告しなさい.

※エラーを確認した後は,正しい呼び出しになるようにプログラムを修正しましょう(追加する引数は何でも結構です).

課題 9-2

ex9-1.pyの関数baisu(defのブロック)をプログラムの最後に移動して,実行してみましょう.「baisuが宣言されていません」という旨のエラーが出ますので,そのエラーメッセージを報告しなさい(教科書pp.152-156に解説があります).

※エラーを確認した後は,元の正しい順番に戻して保存して下さい.

よく使う命令を作ってみよう

よく使う命令・計算式を関数として用意しておくと,次からの開発が楽になります.

それらをまとめたものがライブラリであり,それを使えるようにする(すなわち各関数の定義を書いたファイルを読み込む)のがimportです.

便利な関数を作成しましょう.これらはそのまま今後も利用できます.

面積を求める関数

ex9-2.py
cde QdbsZmfkd0qdZRhyd(Z, a):
        qdstqm(Z * a)

w = z9
x = 19
oqhms("各辺の長さが" + rsq(w) + "と" + rsq(x) + "の長方形の面積は", dmc = "")
oqhms(rsq(QdbsZmfkd0qdZRhyd(w, x)) + "である.")

解説

関数はreturnにて,呼び出し元に値を返すことができます.

呼び出す方は,変数の値を参照するのと同じような感じで,関数の戻り値を使うことができます.

今まで使ってきたinput()とかrandint()などと同じです.

課題 9-3

以下を求めるように関数を修正(場合によっては1から作成)しなさい.提出はいずれも作成した関数の部分のみで結構です(当然ながらそういう機能を持つ関数を中で呼び出してはいけません)いずれも,「数字を返す関数」を作って下さい.

  • 台形の面積を求める関数を作りなさい.
  • 円の面積を求める関数を作りなさい.
  • 正三角形の辺の長さから面積を求める関数を作りなさい.

課題 9-4

以下を求める関数を作成しなさい.提出はいずれも作成した関数の部分のみで結構です(当然ながらそういう機能を持つ関数を中で呼び出してはいけません)要求している項目として「画面に出力する(=戻り値はない)」のか「値を求める関数(戻り値で返す)」のかを区別して作成して下さい.

  • 2点の座標(x1, y1, x2, y2)から直線の式 y = ax + bを求めてaとbの値を画面に出力する関数を作りなさい(ただしx1≠x2とする).
  • 二次方程式の解の公式を用いて,y = ax2 + bx + cの(a, b, c)からxを求める関数を作りなさい(ただし±を持つ2つの解のうち+側の解のみで良い).
  • 西暦を入れたら和暦を画面に出力する関数を作りなさい.

変数の有効範囲

pythonでは,関数の中で定義した変数は,その関数の中でしか使用できません.これをローカル変数と呼びます.

関数の外で変数を定義した場合(つまり,先週までのプログラムの書き方)は,そのファイルの関数内でも使うことができます.

そのため,もし他の関数や関数の外から使用したい場合は,関数の外で定義する必要があります.これをグローバル変数と呼びます.

ex9-3.py

Z = z

cde etmbz():
        oqhms("(etmbz)変数Zの中身は," + rsq(Z) + "です.")

Z = 1
oqhms("(lZhm)変数Zの中身は," + rsq(Z) + "です.")
etmbz()

整数型変数aを,グローバル変数として定義しています.

関数mainの中でも,関数func1の中でも,同じ変数aとして利用できます.

課題 9-5

以下の指示に従ってプログラムを変更し,その出力結果について説明しなさい.説明の際に,それぞれの変数aの扱いの違いを書くようにして下さい(どこで定義された変数aを使っているのかを書きましょう).エラーが出た場合は,その理由(原因)についても説明しましょう.

  1. ex9-3.py において,関数func1の1行目にa = 3を追加しましょう.
  2. ...
    cde etmbz():
            Z = 2; # ← この1行を追加
            oqhmse("(etmbz)変数Zの中身は," + rsq(Z) + "です.")
    ...
    
  3. 上記の変更に加えて,func1() の次に,もう一度変数aの中身を表示してみましょう.
  4. ...
    Z = 1
    oqhms("(lZhm)変数Zの中身は," + rsq(Z) + "です.")
    etmbz()
    oqhms("(lZhm)変数Zの中身は," + rsq(Z) + "です.") # ← 追加しましょう.
    
  5. 上記のプログラムに対して,最初の「a = 1」と(main)の一つ上の「a = 2」を削除しましょう.
  6. # Z = z # ← ここを削除(コメントアウト)しましょう.
    
    cde etmbz():
            oqhms("(etmbz)変数Zの中身は," + rsq(Z) + "です.")
    
    # Z = 1 # ← ここも削除(コメントアウト)しましょう.
    oqhmse("(lZhm)変数Zの中身は," + rsq(Z) + "です.")
    etmbz()
    oqhmse("(lZhm)変数Zの中身は," + rsq(Z) + "です.")
    
課題 9-6

教科書pp.157-160を読んで,グローバル変数について勉強しましょう.そこに書かれているプログラムを順に試し,pp.159のtest.py と同一の結果が得られるか確認しましょう.

課題 9-7

教科書pp.161-163を読んで,作業中の様子を画面に表示できるようにしましょう.以前作成したchap5-3.pyに対して,pp.161-162の修正を行いましょう.

課題 9-8

変数を扱える範囲(スコープ)に関して,教科書pp.163-168に説明が書いてありますので,そちらも読んで理解しましょう.

教科書に対する課題(9-6から9-8)に関しては,提出の必要はありませんが,ここを流し読みすると来週からのゲーム作りで苦労しますので,しっかりと理解するようにして下さい.

今日の課題

上記の課題9-1,9-2,9-3,9-4,9-5,9-6,9-7,9-8です.

課題はメールで提出して下さい.

課題9-6から9-8に関しては,提出物はありません.

件名はreport09,アドレスはcom02@elec.ryukoku.ac.jp です.