基本情報技術者アルゴリズムの問題を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に入力すれば普通に出してくれるんだもの。
まあでも、カッコとか演算子の優先順位がある場合、コンピュータの中ではどんな手順で処理しているのか
そんな裏側のことを想像できてためになったのかな!
以上です!
それではまた^^