/// <summary>
 /// 第三章:方法和作用域
 /// </summary>
 namespace Chapter3
 {
     class Program
     {
         public static void Main(string[] args)
         {
             //3.1创建方法
             Console.WriteLine($"{addValues(1, 2)}");
             ///3.1.3 使用表达式主体方法
             void showresult(int answer) => Console.WriteLine($"the answer is {answer}");
            //3.2调用方法
             showresult(100);
            //3.3使用作用域
             ///3.3.1定义局部作用域
             ///3.3.2定义类作用域
             ///3.3.3重载方法
             ///3.3.4编写方法
            //3.4 使用visual studio调试器来调试方法
             ///3.4.1重构代码
             /* 在应用程式的多个位置写相同的代码,选定并右击输入的代码块,选择快速操作和重构,再单击提取方法*/
            //3.5使用可选参数和具名参数
             ///3.5.1定义可选参数
             optMethod(99, 123.45, "world");//全部三个参数都提供了实参
             optMethod(100, 54.321);//只为前两个参数提供了实参
                                    ///3.5.2传递具名参数
             optMethod(first: 99, third: "world");
             ///3.5.3消除可选参数和具名参数的歧义
             ///提供具名参数,编译器会将参数名和方法声明中指定的参数名比较,并选择参数名称匹配的方法。
             Console.ReadLine();
         }
        /// <summary>
         /// 3.1.1 声明方法
         /// </summary>
         /// <param name="left"></param>
         /// <param name="right"></param>
         /// <returns></returns>
         static int addValues(int left,int right)
         {
             //3.1.2 从方法返回数据
             return left + right;
         }
        /// <summary>
         /// 3.2.2 从方法返回多个值(元祖)
         /// </summary>
         /// <param name="left"></param>
         /// <param name="right"></param>
         /// <returns></returns>
         //static (int,int) addValues2(int left, int right)
         //    {
         //        return (left,right);
         //    }
        ///3.4.2嵌套方法
         static long CalculateFactorial(string input)
         {
             int inputValue = int.Parse(input);
             long factorial(int dataValue)
             {
                 if (dataValue == 1)
                 {
                     return 1;
                 }
                 else
                 {
                     return dataValue * factorial(dataValue - 1);
                 }
             }
             long factoricalValue = factorial(inputValue);
             return factoricalValue;
         }
        /// <summary>
         /// 3.5.1
         /// </summary>
         /// <param name="first"></param>
         /// <param name="second"></param>
         /// <param name="third"></param>
         static void optMethod(int first, double second=0.0,string third = "hello")
         {
}
     }
 }
  
/// <summary>
 /// 第四章:使用判断语句
 /// </summary>
 namespace Chapter4
 {
     class Program
     {
         static void Main(string[] args)
         {
             One();//4.1声明布尔变量
             Two();//4.2使用布尔操作符
             Three();//4.3使用if语句判断
             Four(0);//4.4使用switch语句做判断
             Five(8);//4.5为switch表达式使用模式匹配
             Console.ReadLine();
         }
        private static void Five(int v)
         {
             switch (v)
             {
                 case 0:
                     v += 1;
                     break;
                 default:
                     v += 1;
                     break;
             }
             //int a = 0;
             //a = v switch
             //{
             //    0 => 1,
             //    1 =>1,
             //    _ =>1
             //};
}
        private static void Four(int num)
         {
             //4.4.1理解switch语句的语法
             switch (num)
             {
                 case 0:
                     Console.WriteLine("num=0");
                     break;
                 default:
                     Console.WriteLine("num!=0");
                     break;
             }
             //4.4.2遵守switch语句的规则
             /*
              * 1.switch语句的控制表达式只能是某个整形或string。其他的类型只能用if
              * 2.case标签必须是常量的表达式,如42等等。要是想在运行时计算case标签的值,就只能用if语句
              * 3.case标签必须唯一,不允许两个case标签具有相同的值
              * 4.可以续写多个case标签(中间不间插额外的语句)
              */
             switch (num)
             {
                 case 1:
                 case 2: //允许直通
                     Console.WriteLine("num=2"); //1和2都执行相同的代码
                     break;
                 //case 3:
                 //    Console.WriteLine("num=3");//出错标签之间有额外的代码
                 case 4:
                     Console.WriteLine("num=4");
                     break;
             }
}
        static void One()
         {
             bool areYouReady;
             areYouReady = true;
             Console.WriteLine(areYouReady);
         }
        static void Two()
         {
             //4.2.1理解相等和关系操作符(==,!=,<,>,<=,>=)
             //4.2.2理解条件逻辑操作符(&&,||)
             //4.2.3短路求值(针对||)
             //4.2.4操作符的优先级和结合性总结
             //1.<,>,<=,>=
             //2.==,!=
             //3.&&,||
             //4.=(赋值)
             //4.2.5模式匹配
             try
             {
                 bool valiPercentage;
                 //int percent = int.Parse(Console.ReadLine());
                 //valiPercentage = (percent is <0 and <=100);  C#8.0
             }
             catch
             {
                 Console.WriteLine("请重新输入!");
                 Console.ReadLine();
             }
         }
        static void Three()
         {
             int percent = int.Parse(Console.ReadLine());
             //4.3.1理解if语句的语法
             if (percent>=100)
                 Console.WriteLine("hh!");
             else
                 Console.WriteLine("heng!");
             //4.3.2使用代码块分组语句(用括号)
             //4.3.3嵌套if语句
             if (percent > 100)
             {
                 Console.WriteLine("aa!");
             }else if (percent > 50)
             {
                 Console.WriteLine("bb!");
             }
             else
             {
                 Console.WriteLine("cc!");
             }
         }
     }
 }