プログラ生活

プログラム初学者のためのポイントを書いていこうと思います。たまに脇道それた記事もありますが、息抜きだとおもって気長にお付き合いください。

DNCLをかいてみる -006 ユーザー定義関数-

www.pon-x.jp

前回の続き

今回は関数を作ってみるをかいてみる
どんくりにて実行。

配列

関数名()で定義して、「を実行する」で関数を閉じる。
呼び出しは関数名()でOK
戻り値(return)は「を返す」で指定する。

足し算(num1,num2)は
    num1+num2を返す
を実行する

足し算(5,8)を 表示する


ちょっとした応用。
nの段の九九を返すユーザー定義関数

nの段の九九(n)は
    kakezan←{}
    iを1から9まで1ずつ増やしながら、
        追加する(kakezan,i*n)
    を繰り返す
    kakezanを返す
を実行する

nの段の九九(4)を 表示する

DNCLをかいてみる -005 配列-

www.pon-x.jp

前回の続き

今回も繰り返しをかいてみる
どんくりにて実行。

配列

{}で配列を定義する。

array←{1, 2, 3, 4, 5}
arrayを表示する


例.3つ目の要素に2を挿入する

array←{1,2,3,4,5}
入れる(array,3,2)
arrayを 表示する

末尾に追加する場合はaddをつかう

array←{1,2,3,4,5}
追加する(array,6)
arrayを表示する


例.2つ目の要素を削除する

array←{1,2,3,4,5}
削除(array,2)
arrayを 表示する


例.2つ目の要素を取り出す

array←{1,2,3,4,5}
array[2]を表示する


2次元以上の配列も表現できる。

例.九九の計算を2次元配列にする。

kuku←{}

iを1から9まで1ずつ増やしながら、
    kakezan←{}
    jを1から9まで1ずつ増やしながら、
        追加する(kakezan,i*j)
    を繰り返す
    追加する(kuku,kakezan)
を繰り返す

kukuを表示する

DNCLをかいてみる -004 While文-

www.pon-x.jp

前回の続き

今回も繰り返しをかいてみる
どんくりにて実行。

繰り返し いわゆるWhile文

いわゆるWhile文である。

以下、ポイント
1. 【~の間】とかいて繰り返しスタート 2. 【を繰り返す】とかいて繰り返しエンド

i←1
i<=10の間、
    iを表示する
    i←i+1
を繰り返す

九九の計算をしてみる

i←1
i<=9の間、
    j←1
    j<=9の間、
        i*jと" "を改行なしで表示する
        j←j+1
    を繰り返す
    改行を表示する
    i←i+1
を繰り返す

DNCLをかいてみる -003 For文-

www.pon-x.jp

前回の続き

今回は繰り返しをかいてみる
どんくりにて実行。

繰り返し いわゆるFor文

いわゆるFor文である。

以下、ポイント
1. 【変数をFROMからTOまで】とかく 2. 【定数ずつ増やしながら、】と書き、増加分を指定する

iを1から5まで1ずつ増やしながら、
    iを表示する
を繰り返す

九九の計算をしてみる

iを1から9まで1ずつ増やしながら、
    kakezan=""
    jを1から9まで1ずつ増やしながら、
        i*jと" "を改行なしで表示する
    を繰り返す
    改行を表示する
を繰り返す

DNCLをかいてみる -002 条件分岐-

www.pon-x.jp

前回の続き

今回は条件分岐をかいてみる
どんくりにて実行。

条件分岐

いわゆるif文である。
if~elseif~elseを表現してみる。

以下、ポイント
1. if ~ then にあたる部分は、もし~ならば
2. elseif ~ then にあたる部分は、そうでなくもし~ならば
3. elseにあたる部分は、そうでなければ

num←1000

もしnum=100ならば
    "numは100"を表示する
を実行し、そうでなくもしnum<100ならば
    "numは100未満"を表示する
を実行し、そうでなければ
    "numは100より大きい"を表示する
を実行する

DNCLをかいてみる -001 変数・表示-

DNCLという実行できない疑似プログラミング言語は、受験で扱われている。
なかなかに不思議な世界観だが、こういったものは親切に対応してくれる方がいるものだ。

[大阪電気通信大学 兼宗研究室]さまによって実行環境を開発されている。
どんくりというらしく、親しみがわくネーミングだ。
これが、DNCLに対応しているようなので、しばらく趣味で文法を練習してみようと思い、今回が初回だ。

変数の使い方と画面表示

以下のプログラムを作成し、どんくりの簡易エディタで実行させていただきました。

以下、ポイント
1. 文字は「」もしくは””で囲む。
2. 連結は【と】
3. 表示は【で表示する】
4. 改行は【改行】

sikiri←「-------------------------------」

sikiriを表示する
moji←「DNCL」
mojiを表示する

sikiriを表示する
mojiと「と文字を連結する」を表示する

sikiriを表示する
mojiと"と文字を連結する"を表示する

sikiriを表示する
mojiと改行とmojiを表示する

sikiriを表示する

う~ん。日本語プログラムになれない。 しかし、教育の未来のためにしばらくは頑張って続けよう。

【Python連載】クラス (オーバーライド)-024-

www.pon-x.jp

今回は前回までの続き、クラスの続きです。

オーバーライド

今回は、親クラスの一部を上書きするオーバーライドを紹介します。

まずは、前回までのストーリーにもとづいて以下のクラスを作ってみましょう。

class Character:
    def __init__ (self, job, HP, weapon):# コンストラクタを定義して、初期値を決める。
        self.job = job
        self.HP = HP
        self.level = 1
        self.comment = self.job + "が誕生した"
        
    def set_status(self, set_HP): # レベルとHPを上げるメソッドに変更
        self.level += 1 # レベルを1ずつ上げる(1ずつと分かっているので引数はいらない)
        self.HP += set_HP # さっきまでは直接代入したが、増加分に変更する
        self.comment = self.job + "はレベルが上がった"
        
    def print_status(self): #表示するためのメソッド
        print("職業 : " + self.job)
        print("H  P : " + str(self.HP))
        print("武器 : " + self.weapon)
        print("レベル : " + str(self.level))
        print("※ " + self.comment)
 
    def powerUp(self):
        self.HP += 50
        self.comment = "勇者のレベルが上がった"
        

そして、前回同様にCharacterクラスを継承するChildクラスを作成します。

class Child(Character):
    def __init__(self, job, HP, weapon, comment):
        super().__init__(job, HP,weapon)
        self.weapon = weapon
        self.comment = comment
        
    def powerUp(self):
        self.HP += 100
        self.comment = "孫勇者のレベルが上がった"

2つのクラスを比較するとお互いpowerUpメソッドが存在していることがわかります。

Characterクラスは通常通りpowerUpメソッドが使用できますが、ChildメソッドはCharacterクラスを継承していますが、powerUpメソッドを実行するとChildクラス内のpowerUpメソッドがCharacterクラスのpowerUpメソッドを上書きして実行されます。
これがオーバーライドです。

以下を実行してみましょう。

print("-------------------------")

yusya = Child("勇者" , 50 , "ほっそい棒" , "勇者がうまれた")
yusya.print_status()

print(">>>>>>>>>>>>>>>>>>>>>>>>>")

child_yusya = Child("孫勇者" , 100 , "はがねの剣" , "孫勇者がうまれた")
child_yusya.print_status()
print("-------------------------")

print("-------------------------")
yusya.powerUp()
yusya.print_status()

print(">>>>>>>>>>>>>>>>>>>>>>>>>")

child_yusya.powerUp()
child_yusya.print_status()
print("-------------------------")

f:id:hanabusa-snow:20211209084244p:plain

このように実行されました。

以下、全コードです。

class Character:
    def __init__ (self, job, HP, weapon):# コンストラクタを定義して、初期値を決める。
        self.job = job
        self.HP = HP
        self.level = 1
        self.comment = self.job + "が誕生した"
        
    def set_status(self, set_HP): # レベルとHPを上げるメソッドに変更
        self.level += 1 # レベルを1ずつ上げる(1ずつと分かっているので引数はいらない)
        self.HP += set_HP # さっきまでは直接代入したが、増加分に変更する
        self.comment = self.job + "はレベルが上がった"
        
    def print_status(self): #表示するためのメソッド
        print("職業 : " + self.job)
        print("H  P : " + str(self.HP))
        print("武器 : " + self.weapon)
        print("レベル : " + str(self.level))
        print("※ " + self.comment)
 
    def powerUp(self):
        self.HP += 50
        self.comment = "勇者のレベルが上がった"
        
        
class Child(Character):
    def __init__(self, job, HP, weapon, comment):
        super().__init__(job, HP,weapon)
        self.weapon = weapon
        self.comment = comment
        
    def powerUp(self):
        self.HP += 100
        self.comment = "孫勇者のレベルが上がった"

print("-------------------------")

yusya = Child("勇者" , 50 , "ほっそい棒" , "勇者がうまれた")
yusya.print_status()

print(">>>>>>>>>>>>>>>>>>>>>>>>>")

child_yusya = Child("孫勇者" , 100 , "はがねの剣" , "孫勇者がうまれた")
child_yusya.print_status()
print("-------------------------")

print("-------------------------")
yusya.powerUp()
yusya.print_status()

print(">>>>>>>>>>>>>>>>>>>>>>>>>")

child_yusya.powerUp()
child_yusya.print_status()
print("-------------------------")