理系母の趣味はプログラミング

理系院卒、メーカー技術職の二児の母が、PythonやVBAで色々と作ってアップしていくブログです。

基本情報技術者アルゴリズムの問題をPythonでコーディングしてみた【平成30年秋】

過去問コーディング。
今回の問題は、整数式の解析と計算のアルゴリズムです。

過去問PDF「出典:平成30年度 秋期 基本情報技術者試験 午後 問8」

プログラム

def compute(Expression):

    ExpLen = len(Expression)

    #プログラム(解析処理の部分)

    Operator =[]
    Priority = []
    OpCnt = 0
    Value = [0]
    nest = 0


    for i in range(0,ExpLen):
        
        chr = Expression[i]
        
        if ('0' <= chr) and (chr <= '9'): #数字0~9か?
            Value[OpCnt] = 10 * Value[OpCnt]+int(chr)

        if (chr == '+') or (chr == '-') or (chr == '*') or (chr == '/'):
            Operator.append(chr)  #変更点:要素番号で指定すると、番号の枠がない場合エラーになる
            
            if (chr == '+') or (chr == '-'):
                Priority.append(nest + 1) #変更点
            else:
                Priority.append(nest + 2) #変更点

            OpCnt = OpCnt + 1
            Value.append(0) #変更点:次Valueに数字を入れるために枠を作っておく
            
        if chr == '(':
            nest = nest + 10
        if chr == ')':
            nest = nest - 10
            
    #確認用
    print('確認用:'+ Expression,Value,Operator,Priority)

    #プログラム(計算処理の部分)

    while OpCnt > 0:

        #優先度の最も高い要素番号を取得
        ip = 0
        for i in range(1,OpCnt):
            if Priority[ip] < Priority[i]:
                ip = i
                
        chr = Operator[ip]

        #計算
        if chr == '+':
            Value[ip] = Value[ip] + Value[ip + 1]

        if chr == '-':
            Value[ip] = Value[ip] - Value[ip + 1]

        if chr == '*':
            Value[ip] = Value[ip] * Value[ip + 1]

        if chr == '/':
            Value[ip] = Value[ip] / Value[ip + 1]

        #各リストの要素を左詰めにする
        for i in range(ip+1,OpCnt):
            Value[i] = Value[i+1]
            Operator[i-1] = Operator[i]
            Priority[i-1] = Priority[i]

        OpCnt = OpCnt - 1

    print(Value[0])

compute('2*(34-(5+67)/8)')
compute('2*(-1)')

出力結果

確認用:2*(34-(5+67)/8) [2, 34, 5, 67, 8] ['*', '-', '+', '/'] [2, 11, 21, 12]
50.0
確認用:2*(-1) [2, 0, 1] ['*', '-'] [2, 11]
-2

過去問との主な相違点は下記
・プログラム中に全角を入れるのが嫌なので、演算子は半角に変更
・問題では要素番号100までのリストを定義しているが、出力が膨大になるのが嫌なので、appendで要素を追加する方法を採用
・リスト追加の方法をインデックス指定からappendに変更(Pythonの仕様上)

【感想】
シンプルなコードだったので、ほぼ過去問の記述通りでいけました。
ただ、「計算式を入力すると計算結果がでる」今回のプログラム、
やりがいはありませんでした(笑)
だって計算なんて、Pythonに入力すれば普通に出してくれるんだもの。

まあでも、カッコとか演算子の優先順位がある場合、コンピュータの中ではどんな手順で処理しているのか
そんな裏側のことを想像できてためになったのかな!

以上です!

それではまた^^