实训第二天
************************************************************************************************************************

        今天是实训的第二天,中午在教室小憩一会儿,醒来头很疼(还想再睡)感觉到累了。
讲的内容较昨天多,最让人头疼的是代码部分的练习,绕来绕去思维有点乱了 思维乱了心情糟了,再循环下去就有可能导致个人“死机”(崩溃),所以要break下!
   自己也明白知识是一点一点积累的 思路在乱的时候需要整理,可是在真正面对时我会真正静下来吗?这个也是一个考验,来吧,我全都接受,我可以搞定的!相信自己!

控制台成员这部分学到很多方法,
例如:
Console.Beep(1000, 200);//播放声音通过控制台扬声器播放提示音,两个参数(频率,时间)更多的会在后面代码中出现

练习
  弹钢琴小程序:
while (true)//完成无限的输入按键
            {
                ConsoleKeyInfo cki = Console.ReadKey(true);//读取按键
                int mark;
                if (int.TryParse(cki.KeyChar.ToString(), out mark))//判断按键是否为数字
                {
                    if (mark > 0 && mark < 8)//判断按键是否在1-7
                    {
                        Console.BackgroundColor = (ConsoleColor)mark;//设置色彩
                        for (int i = 1; i < mark; i++)   //添加背景空格,达到1-7不同长度
                        {
                            Console.Write("   ");
                        }
                        Console.Beep(mark * 1000, 200);//播放声音
                       
                        Console.WriteLine(cki.KeyChar);//打印数字
                    }
                }
             }
C# 是强类型语言;因此每个变量和对象都必须具有声明类型
字面量:在数值不能准确表达出数据类型时使用字面量
变量表示数值或字符串值或类的对象
变量是字段的一种类型。常数是另一种类型的字段,赋值后在任何情况下都不会发生更改。

四种命名法:
1匈牙利命名法TempBoolMark:Temp(属性)+Bool(类型)+Mark(对象描述):
2驼峰命名法:printEmployeePaychecks();
3下划线法命名:print_employee_paychecks();
4帕斯卡命名法是在命名的时候将首字母大写string UserName;
在C#中,以帕斯卡命名法和驼峰命名法居多

数据类型
值类型(struct)本质是结构体,表示实际数据 将值存放在内存中 存储在线程堆栈中

引用类型(class)本质是类,表示指向数据的引用 包含内存堆中对象的地址 存储在托管堆中
 
中存放方法,而对象执行方法。 函数返回值是什么类型 用什么类型变量接收 consonleinfo ck = consonle.readkey();
 console.wline(ck.key/keychar/Modifiers);
(aA/AA/读键值shift)
readerkey(true/flase);/(1/11)

匿名类型与var:
var
在方法范围中声明的变量可以具有隐式类型 var。
隐式类型的本地变量是强类型变量(就好像您已经声明该类型一样),但由编译器确定类型。
var i = 10;
int i = 10;
匿名类型
匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。类型名由编译器生成,并且不能在源代码级使用。这些属性的类型由编译器推断。
var v = new { Amount = 108, Message = "Hello" };
在将匿名类型分配给变量时,必须使用 var 构造初始化该变量。这是因为只有编译器能够访问匿名类型的基础名称。


装箱是值类型到 object 类型或到此值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。拆箱反之;装箱3步拆两步 装箱很耗资源尽量避免
类型转换:
Parse
类型.Parse(string)
int  i=int.Parse(“123”);

Convert.To类型
强类型转换
int i=Convert.ToInt32(“123”);

Dynamic类型:
Visual C# 2010 引入了一个新类型 dynamic。 该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查。 大多数情况下,该对象就像具有类型 object 一样。 在编译时,将假定类型化为 dynamic 的元素支持任何操作。 因此,您不必考虑对象是从 COM API、从动态语言(例如 IronPython)、从 HTML 文档对象模型 (DOM)、从反射还是从程序中的其他位置获取自己的值。 但是,如果代码无效,则在运行时会捕获到错误。
 
练习
 
   银行系统,完成查询余额,转帐,存款,取款:
using System.IO;
    class Program
    {
        static void WriteLog(string content)//写入日志
        {
File.AppendAllText(@"d:/log.txt",DateTime.Now.ToString("yyyy年MM月dd日 hh时mm分ss秒")+" "+content + "\r\n");
        //写入文件函数及获取当前时间(格式)"\r\n"换行
        }
        static string Account = "1234";//账号
        static string Password = "111111";//密码
        static float SumMoney = 10000f;//总金额
        static void Main()
        {
            while (true)
            {
                Console.Clear();//清屏
                Console.ForegroundColor = ConsoleColor.Blue;//设置控制台前台颜色
                Console.WriteLine("******欢迎使用银行系统********");
                Console.ResetColor();//控制台恢复默认颜色

                Console.WriteLine();
                Console.WriteLine("请输入帐号:");
                string account = Console.ReadLine();//string类型

                Console.WriteLine("请输入密码:");//掩码处理
                string password = "";
                for (int i = 0; i < 6; i++)
                {
                    ConsoleKeyInfo cki = Console.ReadKey(true);
                         //参数为true只打印不多,如输入1出现1 若flase则11
                    Console.Write("*");             //用*覆盖密码值
                    password += cki.KeyChar.ToString();
                }
                Console.WriteLine();
                if (account == Account && password == Password)
                {
                    WriteLog(account + "登录成功!");
                    string readstr = "";
                    do
                    {
                        Console.Clear();//清屏
                        Console.WriteLine("1、取款    2、查询余额   3、存款    4、转帐   5、退出");
                        readstr = Console.ReadLine();
                        switch (readstr)
                        {
                            case "1":
                                if (GetMoney())
                                {
                                    WriteLog("取款成功!");
                                }
                                else
                                {
                                    WriteLog("取款失败!");
                                }
                                break;
                            case "2":
                                Console.WriteLine("余额为:{0}", SumMoney);
                                WriteLog("查询余额!");
                                break;
                            case "3":
                                if (SetMoney())
                                {
                                    WriteLog("存款成功!");
                                }
                                else
                                {
                                    WriteLog("存款失败!");
                                }
                                break;
                            case "4":
                                break;
                            default:
                                break;
                        }
                        System.Threading.Thread.Sleep(3000);
                    } while (readstr != "5");//(5、退出),不在循环内
                }
                else
                {
                    WriteLog(account + "登录失败!");
                    Console.WriteLine("帐号或者密码错误!");
                }
            }
        }
        static bool GetMoney()
        {
            Console.WriteLine("请输入取款金额:");
            float money;
            if (float.TryParse(Console.ReadLine(), out money))
            {//将数字的字符串转为等效单精度浮点数字
                if (money > SumMoney)
                {
                    Console.WriteLine("你现在余额为:{0},已不足", SumMoney);
                    return false;//函数是bool类型
                }
                else
                {
                    SumMoney = SumMoney - money;
                    Console.WriteLine("取款成功!");
                    return true;
                }
            }
            else
            {
                Console.WriteLine("你的输入有误!");
                return false;
            }
        }
        static bool SetMoney()
        {
            Console.WriteLine("请输入存款金额:");
            float money;
            if (float.TryParse(Console.ReadLine(), out money))
            {
                SumMoney = SumMoney + money;
                Console.WriteLine("存款成功!你的余额为:{0}", SumMoney);
                return true;
            }
            else
            {
                Console.WriteLine("你的输入有误!");
                return false;
            }
        }
}
***************************************************************************