プログラミング入門I
2023.11.06
乱数
今回は様々なトラブルが確認されました.提出の際にはファイルを間違えないよう,慎重にお願いします.また,学生番号の確認も忘れないでください. 以下は問題のあるプログラムの例です.参考にしてください.
実行結果を提出: b2354
エラー: b2311 b2321
解答用紙不使用: pro5
解答用紙の番号氏名間違い: b2333
出力時番号間違い: b2327 b2360
# #############################
#
# プログラミング入門I 宿題 2023.10.23
# 学生番号: s****** <-- Change the number to yours
# 氏名: ****** <--Also rewrite name to yours
#
# #############################
print('Student number: s******') # This number shoud be changed to yours, too.
print('')
# The source shall be written in this space.
# Do not delete any of the pre-written lines.
だ~か~ら~,この前のこれはサンプルだから,使わないでねっ!て書いてあるのに.
# プログラミング入門I 宿題 2023.10.30 # 学生番号: s****** # 氏名:**** **** |
解答用紙の一部改ざんですね.変に消したりしないで,そのまま使ってください.
print('{}+{}={}'.format(m, n, m+n)) print('{}-{}={}'.format(m, n, m-n)) print('{}*{}={}'.format(m, n, m*n)) print('{}/{}={}...{}'.format(m, n, m//n, m%n)) |
上の例は間違ってはいません.ただ,出題の方では数値と演算子の間にはスペースを入れています.これは本来のソースでもやってほしいプログラミングのマナー(常識)です.ですので,スペースが入っていない人は減点しました.
print(f'{num1} / {num2} = {num1//num2:.0f} ... {num1%num2}') |
整数型演算にしたのだから,.0f は不要ですね.
print('{}/{}={}'.format(m,n,m/n)) |
本来の出題意図を完全に無視しています.整数型演算で結果を出すよう指示していますからね.
print(f'{num1} / {num2} = {num1/num.3f}') |
{ } の中の桁数指定などをする部分はコロン : の後に記述します.これではエラーになります.
print(f'The sum of {num1} and {num2} equals to {num1+num2}.') print(f'The sum of {num1} and {num2} equals to {num1-num2}.') print(f'The sum of {num1} and {num2} equals to {num1*num2}.') print(f'The sum of {num1} and {num2} equals to {num1/num2}.') |
自分勝手な思い込みで結果の出力文を変更しないでください.さらに,差も積も商もすべて sum というのはそれはそれでひどいし.
print('m+n: {}'.format(num1)) print('m-n: {}'.format(num2)) print('m*n: {}'.format(num3)) print('m/n: {}'.format(num4)) |
こちらも出力結果が出題どおりになっていません.出力例はきちんと再現してください.
print('Random number with 4 digits: {}'.format(m)) print('Random number with 3 digits: {}'.format(n)) print(m+n) print(m-n) print(m*n) print(m/n) |
上の例も同様ですね.このように出力してください,ということで出力例を載せているので,その通りでお願いします.
print(f'{num1} + {num2} = {num1+num2}\n{num1} - {num2} = {num1-num2}\n{num1} * {num2} = {num1*num2}\n{num1} / {num2} = {num1//num2}...{num1%num2}') |
こちらも間違ってはいません.ただ,このような1行が長くなる表現は推奨しません.非常に見づらいコードとなってしまいますから.
前回は乱数について学習しました.Python にあらかじめ用意してある関数を使用して乱数を発生させることができるようになったので,今後はプログラムの作成においてほぼ毎回使用することになります.整数や実数の乱数を使いこなせるようにしましょう.
関数 | 引数仕様 | 発生する数値 |
---|---|---|
randint() | min, max | min から max の範囲の整数 |
random() | 無し | 0 以上 1 未満の数値 |
randrange() | min, max, step | min から max の範囲の整数で step 刻み |
プログラムの処理の流れは入力された数値や計算結果などにより分岐させて条件ごとの処理を行うことが大半です.そのために処理を条件ごとにわけることを条件分岐と言いますが,そのためにどの言語においても用意されているのが今回取り扱う if 文です.基本的なことは教科書に書いてありますので,それに従って作業していきましょう.
if 文のポイント
単純な if 文 | 条件式が真の場合に処理を行う |
if - else 文 | 条件式が真の場合にある処理を行い,偽の場合に別の処理を行う |
if - elif 文 | 条件式が真の場合にある処理を行い,偽の場合にはさらに別の条件式が真であれば別の処理を行う |
if 文の Tips
例えば変数の値が偶数のときのみ何かの処理をすることを考えてみましょう.その際には,次のような書き方が考えられます.
if num % 2 == 0: Do something |
次に偶数だったらある処理をして,奇数だったら別の処理をすることを考えます.その際に以下のように書くことはお薦めしません.
if num % 2 == 0: Do this if num % 2 == 1: Do that |
プログラムを書いている際にはよくあることですが,ちょっとしたキーの打ち間違いや入力忘れなどでちょっと間違った処理にしてしまったりします.今回は偶数と奇数とどちらの場合も何かの処理を必ず行うので,上のように書いてしまうとどちらも実行しないとか,両方とも実行してしまうという間違いにつながることがあります.
そうならないようにするために,条件分岐の数が何個であろうとも,必ずどれかの処理を実行するという場合には最後に必ず else をつけておいて,何があっても何かを1つだけ実行するという保険をかけておくことが大事です.
if num % 2 == 0: Do this else: Do that |
比較演算子の中の等しいかどうかを判定する記号は == です.ところが,誰でも必ず1回以上はこれを間違えて等号一つの = にしてしまうでしょう.他の言語ではこれは文法的には問題ないものの間違った処理となります.ところが,Python ではこれを文法エラーとしてはじいてくれます.便利ですね.
IDLE で Run module した際のエラーメッセージ
File "Z:\Ubuntu_backup\common\ECS_html\lecture\python1_23\20231106\equal.py", line 3 if a = 2: ^^^^^ SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? |
教科書の p.46 に説明があるように,if 文では処理の構成をインデント(字下げ)によって作ります.インデントの文字幅が間違っているとエラーとなりますので,注意してください.
教科書の補足
値の型として整数型や文字列型などが以前から出てきていますが,if 文の判定などでは真か偽かの2択となる論理型(ブール型)が登場します.ほとんどの言語で値が数値の 0 のときが偽となります.また,文字列の False も偽を意味します.そういったもの以外は大体真として扱われます.
比較演算子を用いて大きい,小さい,等しいなどを if 文では判定しますが,そのような比較を複数まとめて表現する際に論理演算子が使用されます.言葉でいうと,「かつ」や「または」です.他の言語では記号が用意されていることが大半ですが,Python では文字の and や or を使用します.
Python の特徴として論理演算子を省略できる書き方があります.他の言語では認められない以下のような表現が可能です.
if 0 < num < 10:
上の処理は例えばC言語では以下のようになり,論理演算子が必要です.
if(num > 0 && num < 10)
条件式が単純な大小比較などであれば簡単な表現で処理を実現できますが,とびとびの値など比較演算子だけでは長くなる処理などで,教科書 p.61 の List 3-19 にあるような集合(プログラム入門IIで学習予定)を用いた判定が役に立ちます.これも Python の便利なところの一つです.
今回の演習問題です.
教科書の p.46-63 の範囲について学習しました.if 文は以下のように構成されています.
if 式: 文 |
最初のうちは式の後のコロン : を忘れがちなので注意しましょう.また,文はインデント(字下げ)が無いと認識されませんので,注意してください.
宿題が公開されるのは明日火曜日10:00の予定で,締切りは来週の月曜日11月13日の10:00です.レポート提出システムを使用します.
Python は基本的に文字コードがUTF-8のソースしか読み込めませんので,文字コードにUTFを使っている回答用紙もリンクをクリックして表示させると,文字化けします.解答用紙を使用する時には,リンクを右クリックして,「名前を付けてリンク先を保存」を選んで,保存してから使用してください.