2013年11月17日日曜日

開発環境

C実践プログラミング 第3版 (Steve Oualline (著)、 望月 康司 (監訳) (翻訳)、谷口 功 (翻訳)、オライリー・ジャパン)のⅡ部(単純なプログラミング)の11章(ビット演算)、11.8(ビットマップグラフィックス)、11.10(プログラミング実習)、実習11-4をHaskellで解いてみる。

その他参考書籍

実習11-4.

コード(BBEdit)

Sample.hs

{-# OPTIONS -Wall -Werror #-}
import Data.Bits

main :: IO ()
main = do
    putStrLn "整数を入力"
    s <- getLine
    if s == "" then
        return ()
    else do
        let n = read s :: Int
        putStrLn $ "ビットの数: " ++ (show $ count n)
        main

count :: Int -> Int
count n =
    let m = minBound :: Int
    in foldr (\x -> if n .&. x /= 0 then
                        (+1)
                    else
                        (+0)) 0 $
             m:(takeWhile (>0) $ geometricProgression 1)

geometricProgression :: Int -> [Int]
geometricProgression a = a:(map (`shiftL` 1) $ geometricProgression a)

入出力結果(Terminal, runghc)

$ runghc Sample.hs
整数を入力
0
ビットの数: 0
整数を入力
1
ビットの数: 1
整数を入力
2
ビットの数: 1
整数を入力
3
ビットの数: 2
整数を入力
4
ビットの数: 1
整数を入力
5
ビットの数: 2
整数を入力
-1
ビットの数: 32
整数を入力
-2
ビットの数: 31
整数を入力
-3
ビットの数: 31
整数を入力
-4
ビットの数: 30
整数を入力
-5
ビットの数: 31
整数を入力

$

{-# OPTIONS -Wall -Werror #-}を記述してるから、細かく型を指定(:: Double)しないと警告がいっぱい出た。慣れるまでは{-# OPTIONS -Wall -Werror #-}の記述を消さずに細かく型を指定していくことに。

0 コメント:

コメントを投稿