文字列から数値への変換関数って何
2007/05/10
lispで簡単な問題を解くのは勉強に丁度いいと改めて思ったので、適当に問題を取ってきた。
http://www.media.osaka-cu.ac.jp/~matsuura/2006-PP/index.html
課題2-1 (BMI)
BMI(Body Mass Index)指数は,次の式によって与えられる.
身長と体重を入力するとBMI指数を計算し,BMI指数と判定結果を表示するプログラム BMI を書け.
BMI = 体重(kg) / ( 身長(m) * 身長(m) ) 20未満 痩せている 20以上24未満 正常 24以上26.5未満 やや肥満 26.5以上 肥満
幾つかの入力を試して,きちんと動いていることを示す実行結果を付けること.
回答 まだ動いてませんorz.
(defun prompt-read (prompt) (format *query-io* "~a: " prompt) (force-output *query-io*) (read-line *query-io*)) (defun bmi (tall weight) (let ((bmi (/ weight (* tall tall)))) (cond ((< bmi 20) (format t "痩せている")) ((and (>= bmi 20) (< bmi 24)) (format t "正常")) ((and (>= bmi 24) (< bmi 26.5)) (format t "やや肥満")) (t (format t "肥満"))))) (bmi (prompt-read "身長(m)") (prompt-read "体重(kg)")) ;重複してformatしてたorz. ;vim : set ft=lisp expandtab :
実行結果
身長(m): 1.73 体重(kg): 64 *** - FLOAT: "1.73" is not a real number
コンソールからの入力が文字列だから数値型に変換してあげれば良さそうだな。と思ったのです。
が、googleで調べても全然それらしい関数を見つけることができません;
common lispのリファレンスとかhelpとかって下のくらいしか見つからなかった。
http://www.franz.com/support/documentation/6.2/ansicl/ansicl.htm
探してみるか。。。
lispが難しい理由。perlでいうところのperldocのような初心者に優しい機能がないことだなぁ。
lisp脳への道程は厳しい。。
追記20070511
id:ibazaさんに教えてもらったread-from-stringを使ってみました。最初 read-lineの替わりに使うのかと勘違いしました。
(defun prompt-read (prompt) (format *query-io* "~a: " prompt) (force-output *query-io*) (read-from-string (read-line *query-io*))) (defun bmi (tall weight) (let ((bmi (/ weight (* tall tall)))) (cond ((< bmi 20) "痩せている") ((and (>= bmi 20) (< bmi 24)) "正常") ((and (>= bmi 24) (< bmi 26.5)) "やや肥満") (t "肥満")))) (format t "-------~%結果:~a~%" (bmi (/ (prompt-read "身長(cm)") 100) (prompt-read "体重(kg)"))) ;vim : set ft=lisp : set expandtab:
その他いろいろマヌケなミスを犯していましたが、ようやくやりたいことができました。
ありがとうございました。
read-from-string という関数を使うと文字列を数値型に変換できるようです。
ibazaさん、コメントありがとうございます。
実は prompt-read 関数は、「Practical Common Lisp」からパクってきたので理解してませんでした。。
教えてもらったread-from-stringでgoogleしてみたところ、かなり良さそうなリファレンスを見つけることができました。
http://xyzzy.s53.xrea.com/reference/wiki.cgi?p=FrontPage
後で、read-from-string を試してみます。
#最近知ったzerop関数は、ibazaさんのエントリを見ていて覚えたのでした^^;