基本情報技術者試験的な備忘録 基本情報技術者試験2023サンプル問題 問3python 単方向リスト再び

プログラム素人です。
アルゴリズム素人です。
間違いだらけです。

以前、
20221218基本情報技術者試験2023サンプル問題 問3python 単方向リスト
を記事にした。
他にもクラスについては分からなくてしつこく書いている・・・。
自分でもバカだなと思います。

問題文:

まったく解釈が違うかもしれないが、構造化プログラミングについて。
この問題の解説を書籍「うかる!基本情報技術者 科目B・アルゴリズム編」2023年版で見ました。
著者の福嶋宏訓様感謝します。動画解説よかったです。

で、どこが良かったかというと、

 

○append(文字型: qVal)
 ListElement: prev, curr   参照(アドレス)を入れる変数
 curr ← ListElement(qVal)  たぶん、インスタンスを生み出して参照を格納

 

と解説している点です。

解説では、構造化プログラミングで、インスタンスを生み出す=コンストラクタ呼び出した時、
具体的には、主記憶装置に実行可能なプログラムの実体が作られたと考え、
上記のcurr ← ListElement(qVal)の場合、
currには、100番地など主記憶装置のアドレスを入れる(参照)すると考えればいいように説明している(ような気がする)。

だから、append(う)だと

 

こんなのに、追加は・・・

こう考えればいいらしい。

なんとなく構造化プログラミング(オブジェクト指向)は、抽象度が高く、インスタンス化して具体的にすると理解していたが、
このプログラムの場合、主記憶装置のアドレスを変数に持つと考えると、しっくりくる。

以前に何回かこのサンプル問題を考えていたが、cuurなどに何が入るのか、想定できていなかった。
構造化ではなく、非構造化プログラミングでは、currなどは、配列の添え字(変数)に当たるような
ものだと思うが、このクラスListElementには、添え字がない。(ような気がする。)

インスタンス化して、主記憶装置に置いたら、そのアドレスを使って、操作する感じか。
なんとなくだが、アドレスを使うというのは、エクセルで表を使うのに似ているかも。
エクセルでは、自分は値を入れるだけ(他の設定しない)だが、セル番地を持つことになる。(セル番地で参照・操作可能みたいな)

あまり分かっていないが、何となく、そんな気がしました。

 

 

listheadやnextなどに何が入っているのか確認したくて以前作ったプログラムに追加してみる。(このプログラム作成時に参考にした方にも感謝)

 

class ListElement:

    def __init__(self):
        self.ListHead = None #大文字

    class Node:
        def __init__(self, val):
            self.val = val
            self.next = None
            
    def append(self, Qval):
        curr = ListElement.Node(Qval)
        if self.ListHead == None:
                self.ListHead = curr
                return
        else:
            prev = self.ListHead
            while prev.next != None:
                prev = prev.next
            prev.next = curr
    #確認用        
    def printList(self): 
        temp = self.ListHead 
        while temp: 
            print(temp.val) 
            temp = temp.next            
            
     #追加       
    def printhoge(self):
        print(self.ListHead)
        temp = self.ListHead 
        while temp: 
            print(temp.next) 
            temp = temp.next     

 

 

tamesi = ListElement()
tamesi.append("谷")
tamesi.append("山")
tamesi.append("川")
#確認用
tamesi.printList()
#追加
tamesi.printhoge()

 

 

#追加の2か所
すると、下記のような結果。

<__main__.ListElement.Node object at ・・・>
<__main__.ListElement.Node object at ・・・>
<__main__.ListElement.Node object at ・・・>
None

 

at以下は毎回違うようだ。多分アドレスみたい。その都度インスタンス化するからかな。
最後のNoneの表示は、nextは未定義だからだろう。
ただ、「川」は表示されるので、次を指すnextが「(箱が)空」というより、「箱」そのものの用意がない(だからnone)ということなのかな。

currとか「インスタンスの参照と出てきたら、主装置のアドレス入ってると考えたらいいかも。・・・?