文字列から数値への変換関数って何

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:

その他いろいろマヌケなミスを犯していましたが、ようやくやりたいことができました。

ありがとうございました。

2件のコメント

  • 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さんのエントリを見ていて覚えたのでした^^;

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください