C sharp #001# hello world

飲水思源:金老師的自學網站算法

一、編寫一個簡單的控制檯程序。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Title = "my title" + DateTime.Now;
            Console.ForegroundColor = System.ConsoleColor.DarkGreen;
            Console.BackgroundColor = System.ConsoleColor.White;

            Console.WriteLine("Hello worldd 2019-04-28");
            
            String userinput = Console.ReadLine();
            Console.WriteLine("{0}這是兩個佔位符號{1}", userinput, userinput.Length);

            Console.Beep();
            Console.ReadKey(); // ReadKey是Console類的另外一個方法,用於接收按鍵
            Console.ReadKey(true); // 添加true參數不回顯所接收按鍵

            // 生成的.exe文件可運行在任何具備相應版本.NET的計算機上
        }
    }
}

二、日期計算的結構化編程實現

結構化編程通常設計步驟:編程

  1. 先設計數據結構。
  2. 基於數據結構肯定算法。簡單的情形是,將人的計算方法轉化爲計算機算法,每一個算法步驟用一個函數實現。
  3. 進一步細化與調整方案
  4. 將總體裝配成一個函數,獲得最終設計方案

PPT截圖:數組

開發時,依據依賴關係由下至上。一般狀況,避免跨層調用。數據結構

namespace CalculateDaysForSP
{
    //封裝日期信息
    public struct MyDate
    {
        public int Year;    //
        public int Month;   //
        public int Day;     //
    }

}
MyDate.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CalculateDaysForSP
{
    class Program
    {
        //存放每個月天數,第一個元素爲0是由於數組下標從0起,而咱們但願按月份直接獲取天數
        static int[] months = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

        static void Main(string[] args)
        {
            MyDate d1, d2;     //起始日期和結束日期
            //1999年5月10日
            d1.Year = 1999;
            d1.Month = 5;
            d1.Day = 10;
            //2006年3月8日
            d2.Year = 2006;
            d2.Month = 3;
            d2.Day = 8;
            //計算結果
            int days = CalculateDaysOfTwoDate(d1, d2);

            string str = "{0}年{1}月{2}日到{3}年{4}月{5}日共有天數:";
            str = String.Format(str, d1.Year, d1.Month, d1.Day, d2.Year, d2.Month, d2.Day);
            Console.WriteLine(str + days);

            //暫停,敲任意鍵結束
            Console.ReadKey();
        }


        //計算兩個日期中的成天數
        static int CalculateDaysOfTwoDate(MyDate beginDate, MyDate endDate)
        {
            int days = 0;
            days = CalculateDaysOfTwoYear(beginDate.Year, endDate.Year);
            if (beginDate.Year == endDate.Year)

                days += CalculateDaysOfTwoMonth(beginDate, endDate, true);
            else
                days += CalculateDaysOfTwoMonth(beginDate, endDate, false);

            return days;
        }

        //計算兩年之間的全年天數,不足一年的去掉
        static int CalculateDaysOfTwoYear(int beginYear, int endYear)
        {
            int days = 0;
            for (int i = beginYear + 1; i <= endYear - 1; i++)
            {
                if (IsLeapYear(i))
                    days += 366;
                else
                    days += 365;
            }
            return days;
        }


        //根據兩個日期,計算出這兩個日期之間的天數
        static int CalculateDaysOfTwoMonth(MyDate beginDate, MyDate endDate, bool IsInOneYear)
        {
            int days = 0;
            //對於同一月,天數直接相減
            if (beginDate.Month == endDate.Month)
                if (IsInOneYear)
                    return endDate.Day - beginDate.Day;
                else
                    if (IsLeapYear(beginDate.Year))
                    return 366 + (endDate.Day - beginDate.Day);
                else
                    return 365 + (endDate.Day - beginDate.Day);

            //不一樣月
            int i = 0;
            if (IsInOneYear)
            {
                //同一年
                for (i = beginDate.Month; i <= endDate.Month; i++)
                {
                    days += months[i];
                    //處理閏二月
                    if ((IsLeapYear(beginDate.Year) && (i == 2)))
                        days += 1;
                }

                //減去月初到起始日的天數
                days -= beginDate.Day;
                //減去結束日到月底的天數
                days -= months[endDate.Month] - endDate.Day;
            }
            else
            {
                //不一樣年
                //計算到年末的天數
                for (i = beginDate.Month; i <= 12; i++)
                    days += months[i];

                //減去月初到起始日的天數
                days -= beginDate.Day;
                //從年初到結束月的天數
                for (i = 1; i <= endDate.Month; i++)
                    days += months[i];

                //減去結束日到月底的天數
                days -= months[endDate.Month] - endDate.Day;
            }
            return days;
        }

        //根據年數判斷其是否爲閏年
        static bool IsLeapYear(int year)
        {
            //若是年數能被400整除,是閏年
            if (year % 400 == 0)
            {
                return true;
            }
            //能被4整除,但不能被100整除,是閏年
            if (year % 4 == 0 && year % 100 != 0)
            {
                return true;
            }
            //其餘狀況,是平年
            return false;
        }
    }
}
Program.cs

三、日期計算機面向對象編程實現

MyDate.cs同上,但命名空間改成CalculateDaysForOOide

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CalculateDaysForOO
{
    /// <summary>
    /// 用於完成日期計算
    /// </summary>
    public class DateCalculator
    {

        //存放每個月天數,第一個元素爲0是由於數組下標從0起,而咱們但願按月份直接獲取天數
        private int[] months = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

        //計算兩個日期中的成天數
        public int CalculateDaysOfTwoDate(MyDate beginDate, MyDate endDate)
        {
            int days = 0; 
            days = CalculateDaysOfTwoYear(beginDate.Year, endDate.Year);
            if (beginDate.Year == endDate.Year)

                days += CalculateDaysOfTwoMonth(beginDate, endDate, true);
            else
                days += CalculateDaysOfTwoMonth(beginDate, endDate, false);

            return days;
        }


        //計算兩年之間的全年天數,不足一年的去掉
        private int CalculateDaysOfTwoYear(int beginYear, int endYear)
        {
            int days = 0;
            for (int i = beginYear + 1; i <= endYear - 1; i++)
            {
                if (IsLeapYear(i))
                    days += 366;
                else
                    days += 365;
            }
            return days;
        }


        //根據兩個日期,計算出這兩個日期之間的天數
        private int CalculateDaysOfTwoMonth(MyDate beginDate, MyDate endDate, bool IsInOneYear)
        {
            int days = 0;
            //對於同一月,天數直接相減
            if (beginDate.Month == endDate.Month)
                if (IsInOneYear)
                    return endDate.Day - beginDate.Day;
                else
                    if (IsLeapYear(beginDate.Year))
                    return 366 + (endDate.Day - beginDate.Day);
                else
                    return 365 + (endDate.Day - beginDate.Day);

            //不一樣月
            int i;
            if (IsInOneYear)
            {
                //同一年
                for (i = beginDate.Month; i <= endDate.Month; i++)
                {
                    days += months[i];
                    //處理閏二月
                    if ((IsLeapYear(beginDate.Year) && (i == 2)))
                        days += 1;
                }

                //減去月初到起始日的天數
                days -= beginDate.Day;
                //減去結束日到月底的天數
                days -= months[endDate.Month] - endDate.Day;
            }
            else
            {
                //不一樣年
                //計算到年末的天數
                for (i = beginDate.Month; i <= 12; i++)
                    days += months[i];

                //減去月初到起始日的天數
                days -= beginDate.Day;
                //從年初到結束月的天數
                for (i = 1; i <= endDate.Month; i++)
                    days += months[i];

                //減去結束日到月底的天數
                days -= months[endDate.Month] - endDate.Day;
            }
            return days;
        }

        //根據年數判斷其是否爲閏年
        private bool IsLeapYear(int year)
        {
            //若是年數能被400整除,是閏年
            if (year % 400 == 0)
            {
                return true;
            }
            //能被4整數,但不能被100整除,是閏年
            if (year % 4 == 0 && year % 100 != 0)
            {
                return true;
            }
            //其餘狀況,是平年
            return false;
        }
    }
}
DateCalculator.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CalculateDaysForOO
{
    class Program
    {
        static void Main(string[] args)
        {
            MyDate d1, d2;  //起始日期和結束日期

            //1999年5月10日
            d1.Year = 1999;
            d1.Month = 5;
            d1.Day = 10;
            //2006年3月8日
            d2.Year = 2006;
            d2.Month = 3;
            d2.Day = 8;

            string str = "{0}年{1}月{2}日到{3}年{4}月{5}日共有天數:";
            str = String.Format(str, d1.Year, d1.Month, d1.Day, d2.Year, d2.Month, d2.Day);
            
            //建立類CalculateDate的對象,讓變量obj引用它
            DateCalculator obj = new DateCalculator(); 
            //調用對象obj的CalculateDaysOfTwoDate方法計算
            int days = obj.CalculateDaysOfTwoDate(d1, d2);

            Console.WriteLine(str + days);

            //暫停,敲任意鍵結束
            Console.ReadKey();
        }
    }
}
Program.cs

四、直接應用已有組件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CalculatorDaysUseDotNet
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime d1 = new DateTime(1999, 5, 10);
            DateTime d2 = new DateTime(2006, 3, 8);
            //計算結果
            double days = (d2 - d1).TotalDays; 

            string str = "{0}年{1}月{2}日到{3}年{4}月{5}日共有天數:";
            str = String.Format(str, d1.Year, d1.Month, d1.Day, d2.Year, d2.Month, d2.Day);
            Console.WriteLine(str + days);

            //暫停,敲任意鍵結束
            Console.ReadKey();
        }
    }
}
相關文章
相關標籤/搜索