読者です 読者をやめる 読者になる 読者になる

無限大な夢のあと

テニスとアニメが大好きな厨二病SEのブログ

「プログラマ脳を鍛える数学パズル」でGolang入門 2問目(数列 の 四則演算) 解答編

普段はJavaプログラマな私が「プログラマ脳を鍛える数学パズル」の問題を解いていく中で、Golangに入門していく記事。

コードを解くに当たって、参考にしたページなども合わせて記載してみる。
ちなみにGoのバージョンは1.6。


1問目はこちら。
「プログラマ脳を鍛える数学パズル」でGolang入門 1問目(10進数で回文) 解答編 - スーツとギークのはざまで


2問目
といきたいところですが、問題文の提示等が著作権的に問題がありそうなので、思考過程(文法の調査)と答えのみ載せます。
どのような問題かは書籍を購入してご確認ください。



1.アルゴリズムを考える前にeval関数の存在の確認
まず、この問題を解くにあたって、JavaScriptにあるeval関数(コードを評価し、実行する関数)があるかを確認してみる。
→以下の記事などで試している人はいそうだけど、サンプルが動かなかったため諦めることに。
Goをちょっと使ってみた - ラシウラ



2.eval関数相当のことができるようなプログラムのサンプルを探す。
→以下の記事で電卓プログラム作成のサンプルを作っているのを見つけたので、参考にしてみることに。
www.geocities.jp

昔、この本読んで途中で積読したのを思い出した。

2週間でできる! スクリプト言語の作り方 (Software Design plus)

2週間でできる! スクリプト言語の作り方 (Software Design plus)



3.電卓プログラム内で、読み解くにあたって以下の事項を確認
・字句解析
構文解析
・式評価
→上記の処理を実現するためのGoの文法の話は、のちに記事をまとめる予定。



4.電卓プログラムの各メソッドを利用
参考にした電卓プログラムで、入力がos.stdinでユーザーからの入力になっていた初期化の箇所を修正。
(変更前) lex.Init(os.Stdin)
(変更後) lex.Init(strings.NewReader(計算式))



5.電卓プログラムの不要な処理を削除
以下の処理を削除
・ユーザ入力待ちの無限ループ
・入力開始
・「;」での計算式終了判定
・quitでの終了判定



6.文字列連結について
どの言語でも話題になる文字列連結。
Golangでは、文字列はImmutableらしいので、少し調べてみた。
Golang の文字列連結はどちらが速い? - Qiita
→今回はそんなに遅くならないという+演算子で手を打つことに。



7.数値から文字列への変換
ここが今回、少しはまったところ。
以前は、「fmt.SprintF("%d",数字型)」で文字列を出力したが、このメソッドで作った文字列を配列に入れて処理した時に通常の文字列として入ってくれない。
(今、思い返したら%#をつけたら良かった?)
今回は以前も紹介した以下の記事を参考に「strconv.Itoa(int型)」を使用。
matope.hatenablog.com



8.部分文字列の取得方法を確認。
計算式構築にあたり、部分文字列を取得するために、以下の記事を参考にした。

逆引きGolang (文字列)

今回は対象の文字列が4桁だけど、文字列が長い場合は、文字列をスライスの要素に入れて、アクセスしても良いかも。



9.実装
色々はまったが、実装完了。
以下、実装しながら気づいた修正した点。
・元の電卓プログラムがFloat64型で計算してたが、int型で十分だったので、変更。
・+,-,/演算子は桁が変わってしまうので、使えない。電卓プログラムの該当箇所を変更および削除。



10.今回の実装にあたっての深掘り
別記事にて、のちに追記予定。
電卓プログラムの中身を理解できていないとこだらけ。
また、C言語での経験がほぼないので、ポインタ、構造体が全然わかっていないので、これを機会にしっかり勉強しよう。



11.感想
eval関数自作は、参考にしたプログラムがあったとはいえ、大変だった( ;´Д`)


3問目も頑張ります。

改訂2版 基礎からわかる Go言語

改訂2版 基礎からわかる Go言語

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)