Nemerle for OOP Programmers Week 0 ; Exercise 2
早速演習に取り掛かります.
Exercise 2
問題はこんな感じです.
ユーザがオペレーションを選択できるように、先ほどのプログラムにメニュー(可能なオペレーションのリストと、選択のためのプロンプトを持つもの)を追加する.数値を読み込むメソッドとメニューを表示するメソッドは分けること.
前回の問題では,2数の加減乗除と角度の正弦・余弦・正接を1プログラムにしていました.今回それをベースにしようと思ったのですが,メニュー周りが煩雑になるので,角度のほうは無しにしました(^^;;
using System; class Asker { public static Input() : array[string] { Console.Write("Input a first number > "); def lhs = Console.ReadLine(); Console.Write("Input a second number > "); def rhs = Console.ReadLine(); array[lhs, rhs]; } public static Menu() : string { Console.Write("Choose a operation to perform. Add, substract, multiply, divide(a/s/m/d) > "); Console.ReadLine(); } } def input = Asker.Input(); def item = Asker.Menu(); def lhs = int.Parse(input[0]); def rhs = int.Parse(input[1]); if (item == "a") { Console.WriteLine("Added is {0}.", lhs + rhs); } else if (item == "s") { Console.WriteLine("Substracted is {0}.", lhs - rhs); } else if (item == "m") { Console.WriteLine("Multiplied is {0}.", lhs * rhs); } else if (item == "d") { Console.WriteLine("Divided is {0}.", lhs / rhs); Console.WriteLine("Modules is {0}.", lhs % rhs); } else { Console.WriteLine("Bye."); }
実は今回,意外とてこずりました.Inputメソッドで戻り値で2数を返すのですが,配列がstring[]でないところで少しだけハマリ.
string[] input = new string[2];
みたいなコードを書くと,newなんて知らないと怒られ.
それでInputメソッドは
public static Input() : array[string] { Console.Write("Input a first number > "); def lhs = Console.ReadLine(); Console.Write("Input a second number > "); def rhs = Console.ReadLine(); def input = array(2); input[0] = lhs; input[1] = rhs; input; }
としてたんだけど,いかにも最後のinput;がいやだったので現在の形に改善しました.
ちなみに本当は配列を返したいのではなく2値を返したいので,tupleのほうがいいような気もしますが,そのうち出てくるでしょうってことで放置.またstringの2値をintの2値に変換するところも,Haskellでいうところのmap関数みたいなのがありそう……ってところで,簡単そうな問題でもいろいろ考えるところは出てきますね.