F# 简易万年历程序

这个程序是我初学F#写的第一个程序~~~

程序可以根据给出的年和月生成该月的日历,年可以是1-9999中的任何一年

程序示例:

F# 简易万年历程序_第1张图片

代码如下:

// 在 http://fsharp.net 上了解有关 F# 的更多信息
// 请参阅“F# 教程”项目以获取更多帮助。

type YearMonth(Year: int, Month: int) =
    //判断某年某月有多少天
    member x.DaysInMonth(): int = 
        System.DateTime.DaysInMonth(Year, Month)
    //判断某月的第一天是星期几
    member x.DayOfWeek1st(): System.DayOfWeek =
        System.DateTime(Year, Month, 1).DayOfWeek
    
[<EntryPoint>]
let main argv = 

    //参数的合法性校验
    if argv.Length <> 2 then 
        System.Console.WriteLine("程序用法: Calendar.exe year month")
        System.Environment.Exit(0)
        
    let year = System.Int32.Parse(argv.[0])    //输入年
    let month = System.Int32.Parse(argv.[1])   //输入月

    //年只能取公元1-9999年
    if year < 1 || year > 9999 then
        System.Console.WriteLine("年的取值在1-9999之间")
        System.Console.WriteLine("程序用法: Calendar.exe year month")
        System.Environment.Exit(0)
        
    //月只能取1-12月
    if month < 1 || month > 12 then 
        System.Console.WriteLine("月的取值必须在1-12之间")
        System.Console.WriteLine("程序用法: Calendar.exe year month")
        System.Environment.Exit(0)

    let yearmonth = new YearMonth(year, month) //年月类
    let fst = yearmonth.DayOfWeek1st()         //该月的第一天是星期几
    let len = yearmonth.DaysInMonth()          //该月的天数

    //存储日期的矩阵
    let mutable matrix = [| [| 0; 0; 0; 0; 0; 0; 0 |];
                            [| 0; 0; 0; 0; 0; 0; 0 |];
                            [| 0; 0; 0; 0; 0; 0; 0 |];
                            [| 0; 0; 0; 0; 0; 0; 0 |];
                            [| 0; 0; 0; 0; 0; 0; 0 |];
                            [| 0; 0; 0; 0; 0; 0; 0 |] |]
    
    //日历首部
    //System.Console.Clear()
    System.Console.WriteLine()
    System.Console.WriteLine("\t===================================================")
    System.Console.ForegroundColor <- System.ConsoleColor.Cyan
    System.Console.WriteLine("\t\t\t     " + argv.[0] + "年" + argv.[1] + "月")
    System.Console.ForegroundColor <- System.ConsoleColor.White
    System.Console.WriteLine("\t===================================================")
    System.Console.ForegroundColor <- System.ConsoleColor.Cyan
    System.Console.WriteLine("\tSUN\tMON\tTUE\tWED\tTHU\tFRI\tSAT")
    System.Console.ForegroundColor <- System.ConsoleColor.White

    //x:行 y:列
    let mutable x = 0
    let mutable y = 
        match fst with
        | System.DayOfWeek.Sunday -> 0
        | System.DayOfWeek.Monday -> 1
        | System.DayOfWeek.Tuesday -> 2
        | System.DayOfWeek.Wednesday -> 3
        | System.DayOfWeek.Thursday -> 4
        | System.DayOfWeek.Friday -> 5
        | System.DayOfWeek.Saturday -> 6
        | _ -> 0
    
    //计算矩阵中的值
    for i = 1 to len do
        matrix.[x].[y] <- i
        y <- y + 1
        if y >= 7 then
            y <- y - 7
            x <- x + 1

    //输出矩阵
    for i = 0 to 5 do 

        //没找到break语句,被迫用异常退出循环 :-(
        try

            System.Console.Write("\t")
            for j = 0 to 6 do

                //设置显示颜色
                let temp = System.Console.ForegroundColor <- 
                                    if j = 0 || j = 6 then 
                                        System.ConsoleColor.Green 
                                    else 
                                        System.ConsoleColor.Yellow
                //输出日期
                if matrix.[i].[j] <> 0 then
                     System.Console.Write(" " + matrix.[i].[j].ToString() + "\t")
                elif j <> 0 || i = 0 then
                    System.Console.Write("\t")
                else
                    //遇到整行都是0的情况,抛出“异常”,退出循环
                    raise (System.FormatException())
              
            //从周日输出到周六后换行
            System.Console.WriteLine()
        
        with
        | :? System.FormatException -> printf "\b" //抵消掉多余的换行符

    //日历输出完毕后,将颜色改回
    let temp = System.Console.ForegroundColor <- System.ConsoleColor.White
        
    //日历尾部
    System.Console.WriteLine("\t===================================================")
    System.Console.ForegroundColor <- System.ConsoleColor.Cyan
    System.Console.WriteLine("\t\t\t" + System.DateTime.Now.ToString())
    System.Console.ForegroundColor <- System.ConsoleColor.White
    System.Console.WriteLine("\t===================================================")
    System.Console.WriteLine()

    //按任意键继续(退出)
    System.Console.WriteLine("按任意键继续")
    let temp = System.Console.ReadKey()
    let temp = System.Console.Write("\b\t") //删除按下的“任意键”字符

    0 // 返回整数退出代码

END

你可能感兴趣的:(F#,万年历)