三大構造研究コース
第5回目より2つのコースに分かれての講座になります。こちらは三大構造研究コース(復習よりコース)のページです。
すべてこちらのページに記載します。
皆さんがどの程度できるのかこちらも把握しきれていないので,出来によってある程度内容を変更していく予定です。
Python標準のIDLEで作業している方は,出来れば何かしらのエディタ・IDE(統合開発環境)を使用して頂けると作業がはかどります。(強制ではありません)⇒開発環境 Pythonが出来るようになるのはもちろんですが,Pythonを通じてプログラミング全体に通じるものを学ぶことを目標とします。
あくまでも皆さんの知識を補充するための講義なので,課題等を出す予定は現在のところはありませんが,進度等によっては軽いものは出すかもしれません。
画像はクリックすると拡大します。見にくい際はぜひ。
table:contents
第5回 基礎と順次構造の確認
第6回 選択構造(条件分岐)と反復構造の確認
第7回 反復構造の確認(つづき)
第8回 模擬試験
各回のスライド
第7回資料もないです。このページでよろしく
第6回資料はないです。このページを見ていこう!
第8回 模擬試験
実際に紙で模擬試験を行っていきます。
前半60分で解答,後半の時間を使って解説していきます。
※実際の試験時間は90分です。
※問題訂正に関してもこちらに記載する予定です。
解説時はこちらのページを使っていきます。
大問1
(1)
code:q1_1.py
result = []
for value in values:
result.append(value * 4)
print("result:{}".format(result))
(2)
code:q1_2.py
total = 0
for x in values:
total = total + x #total += xでも可 print("result:{}".format(total))
(3)問題の解釈が一意でないのでr"../file.txt"の部分はr"file.txt"でも良い。
code:q1_3.py
result = []
with open(r"../file.txt") as file:
for line in file:
result.append(int(line.rstrip("\n")) * 5)
print("result:{}".format(result))
※相対アドレスについて
そのうち授業でも触れることでしょう。ファイルが存在を示すパスの表記には絶対アドレス表記と相対アドレス表記の2種類があります。
前者はc:\file.txtのようにファイルの場所が一意に定まっている表記法です。ようは絶対ここと誰が見てもわかるやつ。
後者は..\file.txtのように表記するもので,自分がいる場所から相対的にどこにあるのかを示す表記法です。..は一つ上のディレクトリ(親ディレクトリ)階層を示します。
大問2
(1)~(4)
code:q2.py
import turtle
def new_inst(command, param):
return {"command":command, "param":param}#(a)
def execute(inst_list):
t = turtle.Pen()
for inst in inst_list :#(d)
if c == "fd":#(e)
t.forward(p)
elif c == "lt":#(f)
t.left(p)
inst_list = []
while True:
i = input("Input order> ")
if i == "":
break
inst = i.split(":")
inst_list.append(new_inst(c, p))
execute(inst_list)
大問3
(1)
[3, 3, 4, 5]:False
[1, 5, 2, 4, 9]:False
[2, 3, 4, 4, 5]:False
(2)
code:q3_2.py
def is_ascending(lists):
for num in Lists:
if num > x:
x = num
else:
return False
return True
(3)
code:q3_3.py
result = []
for x in values:
if is_ascending(x):
result.append(x)
print("result:{}".format(result))
大問4
(1)
(a)
code:q4_1_a.py
def area(circle):
return r * r * math.pi
NWaka.icon「mathライブラリを使用してよいと書かれていた場合は,積極的に使っておきましょう。3.14とするよりも正確です。」
(b)
code:q4_1_b.py
for x in circle_list:
area_total = area_total + area(x) #type1 ls_area_total.append(area(x)) #type2 print("result:{}".format(area_total)) #type1 print("result:{}".format(sum(ls_area_total))) #type2 NWaka.icon「模範解答ではtype1の方式を取っていましたが,わざわざsumを使ってよいと書いてあるのだから使いましょう。」
(2)
code:q4_2.py
def divideByArea(circle_list, v):
small = []
large = []
# (2).(c)---
for circle in circle_list:
if area(circle) < v:
small.append(circle)
else:
large.append(circle)
# ----------
NWaka.icon「書けと言われているのはcの部分のみなので,わざわざ狭いスペースにdefから書き始める必要はありません。」
(3)
code:q4_3.py
def is_intersect(c1, c2):
d = math.sqrt(dx * dx + dy * dy)
if (d <= dr):
return True
return False
NWaka.icon「模範解答では最後の部分がelse:以下に記述されていましたが,上記のようにした方が記述量を減らせますし,なによりマスに納めやすくなります。」
補足
実はPythonも他言語のように1行にif文やfor文などを収められます。
code:ex_1_line_for.py
total = 0
code:c_plus_plus_ex.cpp
int total = 0;
for(int i=1;i<=10;i++){ total += x; }
(4)
code:q4_4.py
count = 0
for x in circle_list:
for y in circle_list:
if (x != y) and is_intersect(x, y):
count = count + 1
print("結果:{}".format(int(count / 2)))
大問5
code:q5.py
import math
from tkinter import *
tk = Tk()
canvas = Canvas(tk, width=500, height=400, bg="white")
canvas.pack()
def new_circle(x, y, r): # 円オブジェクトを作成する。
return {"x": x, "y": y, "r": r}
def is_intersect(c1, c2): # 円c1,円c2が重なっているかどうかを判定する。
d = math.sqrt(dx * dx + dy * dy)
if (d <= dr):
return True
else:
return False
def area(c): # 円cの面積を求める。
return r * r * math.pi
def redraw(c): # 円cを(これまでの円に加えて)画面に描画する。
canvas.create_oval(x1, y1, x2, y2, fill="#000000")
tk.update()
tk.update_idletasks()
def print_score(score): # 点数scoreを表示しなおす。
print("score={}".format(score))
def print_gameover(score): # ゲーム終了時のメッセージを表示する。点数も表示する。
print("ゲーム終了")
print_score(score)
def detect_collision(new_circle, circles):
# (1)---
for each in circles:
if (is_intersect(new_circle, each)):
return True
return False
# ------
r = 20 # 一つ目の円の半径を20とする。
C = 10 # 半径の増加量
circles = []
score = 0
while True:
x = int(input("x.coordinate>"))
y = int(input("y.coordinate>"))
new_c = new_circle(x, y, r)
# (2)---
redraw(new_c)
if (detect_collision(new_c, circles)):
print_gameover(score)
break
circles.append(New_circle)
score = score + area(new_c)
r = r + C
NWaka.icon「正直捨て問では…?」
Dora.icon「なぜ解説したし……」
第7回 反復構造の確認(つづき)
前回から反復構造の続きです。
前回は主に,whileやfor i in range():などを扱いました。
今回,まずはfor e in list:を扱っていきます。
リストの中を取り出していく
前回も多少触れましたが,for e in list:にてeにリストの要素を代入しながらループさせることができます。
※他言語ではforeachという名称の場合が多い。
問題1
int_listの要素を1つずつ出力しましょう。今回は上記の方法で行いましょう。
code:int_list_output.py
for e in int_list:
print(e)
さて,世の中リストの中身だけを見ているだけでは事足りません。インデックス(要素の位置)を知りたくなってきます。
問題2
先ほど使用したint_listの各要素のインデックスと値を両方出力しましょう。
今回はfor e in list:の形以外でも実装してみましょう(2通りで実装せよ)。
出力はprint("int_list[{}]:{}".format(index, element))のようにすると良い。
code:int_list_index_val_output.py
inx = 0
for e in int_list:
print("int_list{}:{}".format(inx, e)) inx += 1
print("--------------------------------") # 見やすくするため
for i in range(len(int_list)):
print("int_list{}:{}".format(i, int_listi)) どちらの方が楽かは個人によるとは思いますが,for e in list:の方はインデックスを格納する変数を用意し,さらにループ処理内で加算していく必要があり面倒です。また,for i in range(len(list)):の方はわざわざリストの大きさ(長さ)をrange()に渡すのが面倒であり,リストの要素を扱っている感覚が薄れます。
そこで,enumerate()というものを使用すると,よりすっきりし何をしているのか明確なコードになります。
code:int_list_enum_output.py
for i, e in enumerate(int_list):
print("int_list{}:{}".format(i, e)) iにはインデックスが,eにはリストの要素が,順に代入されていきます。
おそらく授業では触れないでしょうから,テストには書かない方がいい(最悪×にされなくもない,知らんけど~)とは思いますが,特段方法を制限されていない課題等ではドォンドォン使ってドヤ顔していこう!
せっかく標準で用意されているものを使わないのはもったいないです。
ちなみにインデックスが要らない際はわざわざ上記の方法で行うと,それはそれで冗長なコードになるので素直にfor e in list:を使いましょう。
問題3
それでは恒例のフローチャートからコードのお時間です。
以下の選択・反復構造を含むフローチャートをPythonにて実装しましょう。
ちなみに今回省いていますが,ちゃんと出力して結果を確認しましょう。
https://gyazo.com/fc6e38bdaf5ddac41f2bd776f5851537
code:for_int_list.py
int_list = []
for i in range(10):
int_list.append(i + 1)
for inx, dat in enumerate(int_list):
if (dat % 2 == 0):
elif (dat % 3 == 0):
print(int_list)
さて,世の中リストを1つ見て回るだけでは落ち着かない人もいます。2つのリストを同時に表示していきたい!と思ったりするわけです。
そういった場合にはzip()を使用しましょう。さっそく問題4で使って練習しておきましょう。
問題4
2つのリストint_list0とint_list1の要素を順に,同時に表示していきましょう。
また,int_list1の要素に関しては,自分で好きなものを定義しましょう。
サイズが異なる場合は,小さい方に合わせて出力しましょう。
大きい方の残った要素は表示する必要はありません。
code:sample.py
int_list1 = 2, 3, 65, 4, 8, 7, 2, 9, 1, 9, 2, 9, 2, 8 for i, j in zip(int_list0, int_list1):
print(i, j)
こちらの注意点は小さい方のサイズに合わせて出力するので,大きいリストの残った要素は出力されない点,でしょうか。といっても,大きな方に合わせる場面はそうそうないですし,あっても何かしらの規則を付ける必要があるので,そういった場合に遭遇したら自力で頑張ってください笑
辞書を開こう
Pythonには,リストのほかに辞書が用意されています。
リストは値を保管するもので,インデックス指定で値を取り出しましたね。
辞書はキーとバリュー(値)を組み合わせて保管するもので,キー指定をして値を取り出します。
ある任意のキーに対応する値は1通りに定められます。同じキーに対して複数の値を対応させることはできません。
https://gyazo.com/d156c7fda63a1da675d704dc17ef6c8f
あるカギに対応するドアは1つだけ~
んじゃ,さっそく使っていきましょう。
辞書の要素に対し,ループ処理をする
さて,今まではリストの要素でループしていましたが,もちろん辞書でも使えます。以下のコードを見てみましょう。
code:sample_dict.py
dic = {"a":1, "b":2, "c":3}
for d in dic:
dにはキーが入りますので,dic[d]でキーに対応する値を出力しています。
辞書構造にはインデックスという概念がないのですが,for文で回すと定義した順に示していきます。
もちろん後からdic["d"] = 4とした場合も表示されます。以下のコードを見てみましょう
code:sample_dict2.py
dic = {"a": 1, "b": 2, "c": 3}
for d in dic:
print("--------------------")
for d in dic:
a 1
b 2
c 3
--------------------
a 1
b 2
c 3
d 4
定義した順番でdに代入されるので,あとから定義したキー"d"はキー"c"の後に代入されています。
第6回 選択構造と反復構造の確認
関数宣言の確認
code:define.py
def func(x):
値を返却(return)するかどうか,返す値の型に関係なくdefで定義します。なんなら返す型はintとstringでも問題ないのが凄いところ(下記コードを参照)。
code:define1.py
def g(x):
if (x > 0):
return x
else:
return "xは正の実数にあらず"
if __name__ == '__main__':
for i in range(-5,6):
print(g(i))
# ---------------
# 以下は結果
# ---------------
>xは正の実数にあらず
>xは正の実数にあらず
>xは正の実数にあらず
>xは正の実数にあらず
>xは正の実数にあらず
>xは正の実数にあらず
>1
>2
>3
>4
>5
※C言語などはint func(x){ }と定義した場合,int型しか返却できません。参考までに。以下はC++で上記のコードを実現しようとしたもの。
code:define1_c++.cpp
int func(int x){
if(x>0){
return x;
}
else{
return "正の実数にあらず"; //ここでエラーをはく
}
}
int main() {
for (int i = -5; i<6; i++) {
cout << func(i) << endl;
}
return 0;
}
選択(分岐)構造
選択構造(分岐構造ともいうし,なんならこっちの方が言うかも)とは,とある条件によって処理が分岐する構造のことを言います。
フローチャートでは以下のような構造が選択構造ですね。(正確には,処理1と処理3は含みません。)
https://gyazo.com/b6743518f3a8e2a18367a4784539b356
ひし形内に条件を記述するのが一般的です。
Pythonでは条件分岐には,if,elifとelseの文を使うことができます。
ifだけでは一つの条件分岐しか記述できません。elseやelifを使うことによって,複数の条件分岐を記述することができます。
elseはifで指定した条件以外の場合の処理を記述します。
elifはelse ifの略です。elifはifのほかにも条件を複数追加したいときに記述します。
問題1
以下の選択構造をとったフローチャートをPythonで記述してみましょう。
※あまりにつまらないフローチャートなので,x=1の部分をx=input()として,入力させてもOK。
(Yesが横向きに出ている点に注意・便宜上)
https://gyazo.com/049bfca5de2c9c3fde648a254f5f05a2
code:flowChart_if.py
x = 1
if (x < 0):
x = -x
print(x)
問題2
絶対値を返す関数を選択構造で作ってみましょう。
code:abs.py
def absolution(n):
if (n < 0):
return -n
else:
return n
def absolution_none_else(n):
if (n < 0):
return -n
return n
if __name__ == '__main__': #←要らない for i in range(-5,6):
print("---------------------")
print(absolution(i))
print(absolution_none_else(i))
問題3
法政大学の成績システムを作りましょう!
60点未満:D
60~70未満:C
70~80未満:B
80~90未満:A
90~100点:A+
code:test_point.py
point = int(input("点数を入力してください>>"))
if (point > 100 or point < 0):
print("存在しない点数です")
elif (point < 60):
print("評価はD")
elif (point < 70):
print("評価はC")
elif (point < 80):
print("評価はB")
elif (point < 90):
print("評価はA")
else:
print("評価はA+")
問題4
問題3で,elifをifに変えるとどうなるでしょうか?
ifとelif
ifは条件分岐の開始を意味します。elifはifで開始された条件分岐内でしか使えないため,ifを記述せずにelifを記述することはできません。ifごとに条件分岐ブロックができるので,上記の問題4のようにelifをifに変更すると,動作が変わるわけです。
フローチャートで見るとわかりやすいでしょう。以下のパターン1,2を見てみましょう。
パターン1
https://gyazo.com/4afc48513afebf239e909972083ae8d2
上のフローチャートを(Python風の)疑似コードにすると,以下のようになります(拡張子が.pyなのは便宜上)。
code:if_elif.py
do processing_1
if(conditional_exp):
do processing_2
elif(conditional_exp):
do processing_3
else:
do processing_4
パターン2
https://gyazo.com/56e87a1185621581508e0e60b04ec1d7
上のフローチャートを(Python風の)疑似コードにすると,以下のようになります。
code:if.py
do processing_1
if(conditional_exp):
do processing_2
if(conditional_exp):
do processing_3
else:
do processing_4
いかがでしたが,フローチャートで見るとコードで見るよりは流れが分かりやすいと思います。
反復構造
反復構造とは,ある処理を繰り返し行う構造のことを言います。
フローチャートでは以下のような構造が選択構造ですね。
https://gyazo.com/d9605b2fcfdcd5d7a844d1dfe2387692
角を削られた長方形内に条件を記述するのが一般的です。この条件を満たしている(条件式がTrueである)限り,内部の「処理」を実行し続けます。
ちなみに上フローチャートは先に条件判定をするパターン(前判定型)です。一回は処理を必ずする場合(処理を一回行った後に条件処理)の場合(後判定型)は下側の角削れ長方形に条件を記載します。
ちなみにPythonに後判定型はありません。(もし,あるなら教えて…)
for文
指定回数繰り返したり,リストの要素を順に参照していくのに向く。
for i in range(0,10):で0~9まで10回繰り返され,順にiに代入される。
一週目はiには0が代入されている。
for e in list:でlistの要素を順にeに代入していく。他言語ではforeachとして実装されていることが多い。
※list()という組み込み関数が存在するので,本来listという変数名は好ましくない。
一週目はeにはlist[0]が代入されている。
while文
条件を満たしている際にある処理を続けたい場合に便利。
while [条件式]:で条件式を満たしている間ループする。
while i>0:でiが0よりも大きい場合にループをする。この場合,while内の処理でi-=1とかしておかないと永久ループしてしまうので注意。
問題5
以下の反復構造をとったフローチャートをPythonで記述してみましょう。
ちなみに以下のようにProcess 1の処理が複雑な場合は分けて記述することもあります。
今回,コードではProcess 1を関数にしたりする必要はありません。
whileでもforでも実現できます。余裕のある人は両方のバージョンを記述してみてください。
https://gyazo.com/e9a5d35518f196e96a73fee4f953a9bb
code:loop.py
for x in range(1, 16):
if (x % 3 == 0):
st = "3の倍数です"
elif (x % 3 == 1):
st = "3で割った剰余は1"
else:
st = "3で割った剰余は2"
print("{}は{}".format(x, st))
print("-------------------------------") #見やすくするため x = 1
while (x < 16):
if (x % 3 == 0):
st = "3の倍数です"
elif (x % 3 == 1):
st = "3で割った剰余は1"
else:
st = "3で割った剰余は2"
print("{}は{}".format(x, st))
x += 1
NWaka.icon「個人的には本問題はforの方が楽(ミスりにくい)かなと思います。whileを使う場合加算を忘れると,永久ループしてしまうので危険。」
今回はフローチャートに従う必要があるので,for x in range(1, 16):などにしましたが,for x in range(15):で処理に用いるxの部分を(x + 1)にする方が記述量が少なくて済みます。
再帰関数
ある関数において,処理内で自分自身を呼ぶ関数のことです。詳しくはググろう(投げやり)。
一応再帰自体は反復構造を取っているが,関数内は選択構造を取っている。
便利だが,ループを使って実装するよりメモリを食うらしい…けれど,今のご時世に気にする必要はない。忘れて。
問題6
階乗$ n!を計算する関数を再帰を使う,while loopを使うそしてfor loopを使うの3通りの方法で定義してみましょう。
code:fact.py
def fact(n):
if (not n): # if(n == 0):の方が自然
return 1
return n * fact(n - 1)
def fact_while_loop(n):
ans = 1
while (n > 0):
ans *= n
n -= 1
return ans
def fact_for_loop(n):
ans = 1
for i in range(1, n + 1):
ans *= i
# ans *= i + 1
return ans
if __name__ == '__main__':
for i in range(6):
print("------------------")
print(fact(i))
print(fact_while_loop(i))
print(fact_for_loop(i))
NWaka.icon「再帰の方法は出来なくても大丈夫です。ほかの方法に関してはやり方をよく見て,どういう流れなのかを理解しておいてください。なんならフローチャートを描くと流れは分かりやすいかもしれません。」
問題7
アッカーマン関数を再帰を用いて実現しよう。
以下がアッカーマン関数の定義。
https://gyazo.com/8335ffadd54f9d25fdb516df21be449f
code:ack.py
def ack(m, n):
if (m == 0):
return n + 1
if (n == 0):
return ack(m - 1, 1)
else:
return ack(m - 1, ack(m, n - 1))
for m in range(4):
for n in range(5):
print("--------------------\nAck({}, {}) = {}".format(m, n, ack(m, n)))
ちなみに結果は以下のように出力されます。
code:result_ack.py
--------------------
Ack(0, 0) = 1
--------------------
Ack(0, 1) = 2
--------------------
Ack(0, 2) = 3
--------------------
Ack(0, 3) = 4
--------------------
Ack(0, 4) = 5
--------------------
Ack(1, 0) = 2
--------------------
Ack(1, 1) = 3
--------------------
Ack(1, 2) = 4
--------------------
Ack(1, 3) = 5
--------------------
Ack(1, 4) = 6
--------------------
Ack(2, 0) = 3
--------------------
Ack(2, 1) = 5
--------------------
Ack(2, 2) = 7
--------------------
Ack(2, 3) = 9
--------------------
Ack(2, 4) = 11
--------------------
Ack(3, 0) = 5
--------------------
Ack(3, 1) = 13
--------------------
Ack(3, 2) = 29
--------------------
Ack(3, 3) = 61
--------------------
Ack(3, 4) = 125
参考
if __name__ == '__main__':は.pyファイルをライブラリとして,ほかの.pyファイルで使う(呼び出す)際に実行しないようにするものです。.pyファイルを直接実行した際に__name__が'__main__'になり,この内部に記述した処理が実行されます。
なので,主にライブラリ作成時に関数などが正しく動いているかをデバッグ(動作確認)をする際に用いられます。
つまり,気にしないでってことです!
第5回 基礎と順次構造の確認
解答記載済み
基礎の確認
Python
インタープリタ型言語。
統計などに役立つライブラリが豊富で人工知能の分野でよく使われている。あとはWebサービスのサーバサイドとか云々。
インデント(字下げ)によって,まとまりを作っているので誰が記述しても見やすいとかほざいている謳っている言語。
変数への代入
変数への代入とは,簡単に言えば名前の書いてある箱に値を入れておくことです。
https://gyazo.com/9fb8e567658c17c351373b4bf8950979
Pythonの場合は型を基本的には気にする必要がありません。Python側が勝手に判断してくれます。よって,例えばxという変数に1という数字を代入したければ,代入演算子=を使って
x = 1
と記述するだけで変数への代入ができます。
print(x)とすれば,コンソールには1と出てくることでしょう。
型について
基本気になくてもよいとは書きましたが,Pythonとはいえどガン無視はできません。
型にはいろいろありますが,Pythonでは主に以下の4つの型が存在します(boolはのちほど詳しく)。
int型:integerの略・整数
float型:浮動小数点数
string(str)型:文字列
boolen(bool)型:真偽値
基本的に,型が異なるものは四則演算等は出来ません。しかし,暗黙のうちに型変換をしてくれるので,intとfloatを足したり割ったりしてもエラーにはなりません。これはPythonに限ったことではありません。
さあて,ここでちょっとした質問を。
問題1
1と1.0は等しいでしょうか?(1 == 1.0はTrueか否か)
答えは____です。
今回は扱いませんが,選択構造(if文とか)を使用する際に重要になってきたりこなかったりするので,気を付けましょう。
また,当然str型の"1"とint型1やfloat型1.0は等しくありません。
code:type_sample.py
print("1" == 1.0)
----------------------------
<console>
>False
問題2
以下のコードを実行したら,なにが出力されるでしょう?
code:type_sample1.py
print(1 + 1.0)
---------------------------
<console>
>_______
Pythonではtype()という型を確認する関数が存在します。
何の型なのかわかんねぇなぁと思ったら,使ってみましょう。
code:type_sample2.py
print(type(1.0))
-------------------------
<console>
><class 'float'>
四則演算について
ただの計算です。数学と同じく乗除算が加減算よりも優先されます。
乗除算の記号が,数学で皆さんが今まで用いてきたものと異なるのが少し慣れが必要かな?程度ですね。
+:足す・加算
-:引く・減算
*:かける・乗算
/:割る・除算
また,剰余を求めるmodの機能として,
%:剰余を求める
があります。こちらは,乗除算よりも優先されます。print(5 % 3)を実行すれば,2と出力されます。
条件式について
条件式とは先ほどの"1" == 1.0のようなもののことを言います。
比較演算子には以下のものがあります。
==:等しいか?$ =
!=:等しくないか? $ \neq
<:左辺が右辺より小さいか?(小なり)$ <
<=:左辺が右辺以下か?(以下・小なりイコール) $ \leq
>:左辺が右辺より大きいか?(大なり)$ >
>=:左辺が右辺以上か?(以上・大なりイコール)$ \geq
=は代入演算子ゆえ,比較演算子の等号は==です。注意しましょう。
※慣れてくると逆にif(x = 2):とかやっちゃうことがまれにあるゾ。
真偽値について
真偽値(boolen)は主に次回の選択構造で使用しますが,すでに今回の内容で出てきているので早めに触れておきましょう。
真偽値には真と偽が存在します。
PythonではTrueとFalseです(頭文字は大文字である点に注意)。
条件式は常に真か偽のどちらかの状態です。ゆえに先ほどのように,"1" == 1.0を出力するとFalseと出てくるわけです。
問題3
以下のコードを実行したら,出力される内容はどのようなものになりますか?
code:q3_bool.py
x = 10
y = 20
print(x <= y - 10)
print(x > y)
print(x != y)
------------------------------
<console>
>True
>False
>True
コンピュータシステム入門などで触れたと思いますが,コンピュータは0,1の世界です。
回路なども電気信号に0,1を割り当てています。後期の論理回路入門でも触れると思いますが,真偽値は0,1で表されます。
Falseは0,Trueは1(0以外はTrueになります)です。
問題4
以下のコードを実行したら,出力される内容はどのようなものになると思いますか?(x,yは全問のもの)
code:q4_bool.py
print((x != y) + 1)
print((x != y) == 1)
------------------------------
<console>
>2
>True
条件式は明示的にint(x != y)などとしても良いですが,Pythonでは暗黙的にintやfloatにしてくれます。
そもそも条件式と四則演算させるケースなんてあるのかは微妙なところですし,そもそもテストに出ないので頭の片隅にちょっとした知識として記憶しておいてくれたらな,と思います。
順次構造
それでは今回の本題に入っていきます。
三大構造には順次・選択・反復の3つがあります。今回はその中でも基本中の基本である順次構造について扱っていきます。
順次構造(処理)とは,その名の通り記述した順番に処理を実行していく構造のことを言います。
特に条件による分岐等がなく,上から下にまっすぐ実行していくようなプロセスはこの構造です。
とは言っても,順次構造だけで構成されるプロセスはそこまで多くありません。多くの場合は他の構造と組み合わせて使われています。
これらをPythonで扱えるようになるのはもちろんですが,それではPython以外の言語に触れる際に応用出来ません。
よって,フローチャートからプログラミング言語に昇華していけるようにしていきたいと思います。
フローチャートに関しては,おそらく情報科学入門などの授業で多少触れているかと思いますが,一応説明を記載しておきます。
フローチャートとは
ある事柄を達成するために用いられるプロセスの流れを示した図のことです。
別にプログラミングのみに使われるわけではありません。
https://gyazo.com/26be4851653ce8681fc1e670eb6de82a
ちなみに順次構造は,フローチャートでは以下のように示される部分のことですね。
https://gyazo.com/cac474f8d362556ac74972d6960628d8
処理内容は長方形の内部に記述するのが,一般的です。処理の流れを矢印で示します。
順次構造の部分はこの処理を記述したブロックのみで構成されます。
では,以下の問題に挑戦してみましょう。
ちなみに「開始」や「終了」などは少し丸みの帯びた端子と呼ばれるブロックに記載します。
プログラミングに昇華する際はあまり気にしなくても大丈夫です。
問題5
順次構造をとったフローチャートをPythonで記述してみましょう。
https://gyazo.com/e8980f67f79b754d040677973ef080bc
code:flowchart.py
x = 1
y = 4
print(x + y)
開始と終了はプログラム内に記載する必要がないので,3行で済みますね。
問題6
では,続いてはPythonのコードをフローチャートにおこしてみましょう。
code:flowchart1.py
p = 90
q = -p + 1
r = p * 3
print(p + q * r)
値の入れ替えは順次構造の一つです。
問題7
code:tmp.py
x = 10
y = 20
print(x, y)
<console>-------------
>20 10
問題8
code:tmp1.py
x = 10
y = 20
z = 30
tmp = x
x = y
y = z
z = tmp
print(x, y, z)
<console>---------------
>20 30 10
問題9
code:tmp2.py
a = 10
b = 20
c = 30
d = 40
tmp = a
a = d
d = c
c = b
b = tmp
print(a, b, c, d)
<console>------------------
>40 10 20 30
実は…
x, y = y, x
で入れ替えができてしまいます。ですが,Python以外では通用しない記法なので,tmpを使った記法もしっかりと頭に入れておきましょう。
https://gyazo.com/049bfca5de2c9c3fde648a254f5f05a2