程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> C#語言和數據庫基礎,

C#語言和數據庫基礎,

編輯:MySQL綜合教程

C#語言和數據庫基礎,


 

 

                       

 

第一章 第一個C#程序

 

Vs2012密鑰

RBCXF-CVBGR-382MK-DFHJ4-C69G8

01..net和C#的區別

大概在2000年,微軟推出了一種革命性的產品--.NET(戰略)

目標:任何人,在任何地方,使用任何終端設備,都可以訪問微軟提供的服務。

.net Framework:要想讓我們自己寫的C#應用可以運行在Good Friend的Computer上,必須有.net Framework

IDE(Itergrated Developer Environment)集成開發環境

 

Linux:裝X

Window:傻X

解析:,net是一種平台,這種平台上可以跑多種語言,例如,vb,j#,C#

c#只是一種語言

02.解決方案和項目的關系

解析:一個解決方案下可以有多個項目。

03.Main方法四種形式,返回值只能是void或者int

Static void Main(){}

Static void Main(string[] args){}

Static int Main(){}

Static int Main(string[] args){}

04.什麼是常量

  變量:可以變化的量。

Int num=5;

Num=7;

  常量;一旦定義,其值不能再後續代碼中再次修改。

解析:PI

Int num=5;

05.海量代碼折疊

快捷鍵是Ctrl+K+S:#region

05.C#中類,對象和方法

 什麼是類?

解析:具有相同屬性和行為的一系列事物的統稱。

Car

Student

Teacher

Person

什麼是對象?

解析:對象是能在現實生活中找到的某個能區別於其他事物的一個獨特個體。

張靓穎家的紅色的小汽車

 

在清華大學大一音樂系的小王。

在哈弗大學教金融學劉老師。

在北大青鳥五道口校區四機房上課的“小蔡”

 

類和對象的關系

解析:類是對象的抽象(模板),對象是類的實例

 

 

06.Bank項目

 

光大銀行

 

開戶功能

存款

取款

轉賬

查詢余額

修改密碼

 

作業;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第2章 c#語法快速熱身

  01.預習檢查

   1.c#與java的switch語句用法有什麼不同?

     01.java中switch後的表達式取值只能為(int/char/常量),

     但是c#中取值可以是(int/char/string)

     02.java中case後如果有語句,可以沒有break語句,但是在c#中不行

     case:

       syso();

 

     case:

      cw();

      break;

   2.java中如何定義數組?

      int[] nums=new int[]{1,2,3};

  02.本章目標

     1.掌握C#中的條件語句

     2.掌握c#中的循環語句

     3.掌握C#中數組用法

     4.掌握冒泡排序算法並且能夠編碼實現

  03.c#中if條件結構

      C#與java中的條件判斷語句對比

      條件判斷語句       java        c#

      if               if(){...}二者完全相同

      if...else...     二者完全相同

   注意:java和c#中switch用法有以下兩點不同:

      01.java中switch後的表達式取值只能為(int/char),

     但是c#中取值可以是(int/char/string)

     02.java中case後可以沒有break語句,但是在c#則不行

     多個可以case 可以共用一個break語句

    

  04.c#中switch小結

        條件判斷的表達式類型:整型、字符型或字符串

        break語句的要求:

          01,每個case都要有break

          02,default也要有break

          03,特殊情況:case中沒有其他語句時,不需要break語句

                case "星期一":

                case "星期二":

                break;

 

  05.c#中的一維數組

      為什麼需要數組?

         解析;我們可以將類型相同的多個數據放到一個箱子中,便於後續的維護。

         考題:

         //在C#中和java中如下語句都可以定義一個長度為3的int類型數組

         方式一:

         int[] arr=new int[]{1,2,3};

         方式二:

          int[] arr;

         arr=new int[]{1,2,3};

         //int[] arr=new int[3]{1,2,3;//C#中正確,java中不可以

        

 

該規則在C#中同樣適用。

foreach局限性:當需要改變數組中值的時候會報錯

 

      01.C#中數組定義語法:

      數據類型[] 數組名;

      string[] arr1;

      02.如何設置數組大小?

      使用new設置大小:創建長度為5的整型數組

      int[] array=new int[5];

      03.數組初始化:

      int[ ] arr = new int[5]{0,1,2,3,4};

      int[ ] arr = new int[ ]{0,1,2,3,4};   // 省略長度

      int[ ] arr = {0,1,2,3,4};                  // 省略new

int [] ds=new int[]{1,2,3}

int [] ds={1,2,3}

      [5]——方括號中的數字決定數組的長度

      {0,1,2,3,4}——大括號中的元素個數決定數組的長度

      04.如何獲取數組的長度(數組中元素的個數)

       答:數組名.Length

      05.如何循環輸出數組中元素?

      // 循環輸出數組元素

        int[ ] array = new int[5] { 0, 1 ,2, 3, 4};  // 聲明並初始化一維數組

              for (int i = 0; i < array.Length;i++ )       // 輸出數組中的所有元素

              {

                   Console.WriteLine(array[i]);

              }

        06.使用foreach循環遍歷數組元素

          foreach循環一般用於遍歷整個集合或數組

     語法:foreach (元素類型 變量名 in 集合或者數組名)

                            {

                                  // 語句

                            }

      07.continue和break語句的使用

       continue:結束本次循環,繼續下一次循環

       break:結束當前循環

       08.二重循環復習

       int i, j;            // 循環變量

 

    // 外層循環控制打印的行數

       for (i = 1; i <= 5; i++)

       {

               // 內層循環控制每行打印數字的個數

               for (j = 1; j <= i; j++)

               {

                      Console.Write(j);

               }

               Console.WriteLine();

       }

  06.冒泡排序

       規則:每次比較相鄰兩數,小的交換到前面,每輪節航速後最大的數交換到最後

       用二重循環實現冒泡排序

          例如:5(n)個數字存放在一維數組中,如何進行排序

          分析:外層循環控制比較多少輪,循環變量i

                    內層循環控制每輪比較多少次,循環變量j

                    觀察規律,分析i和j的關系,最終得出結論

                    i=n-1,j=n-1-i

                    代碼框架如下:

                    for(i=0;i<n-1;i++)

                    {

                         for(j=0;j<n-1-i;j++)

                         {

                            //比較j和j+1位置的元素

                            //如果前大後小就交換

                         }

                    }

                                   冒泡排序速記口訣(升序):

                                      N個數字來排隊

                                      兩兩相比小靠前

                                      外層循環N-1

                                      內層循環N-1-i

 

艱難的抉擇:

卡莉·菲奧麗娜  hp的CEO

 Hp成功的合並了康柏

 HP 和康柏

 第三章  使用屬性升級MyBank

第3章 使用屬性升級MyBank系統

Bank系統

在Bank類中定義一個Card類型數組,存儲三張卡的信息,然後書寫了一個

Initial方法來初始化第一張卡。

Foreach(Card item in cards)

{

    Item本身不能修改,但是可以修改item對象的各個屬性值,對其進行重新賦值

}

取款

轉賬

查詢余額

修改密碼

1.訪問修飾符

public:在任何位置都可以訪問

private:只能在當前類中訪問

2.屬性

屬性作用:修改和獲取私有字段的值(間接對私有字段賦值,起到保護私有字段的作用)

屬性語法

public class Person

{

  private int age;

  public int Age

  {

     //get

     get

     {

       return age;

     }

     //set

     set

     {

       age=value;

     }

  }

}

4.面向對象三大特性:

01.封裝

  //可以將私有字段封裝成屬性,看成是一種封裝(屬性封裝了字段)

       //可以將一個方法寫到類中這種方式成為封裝(類封裝了方法)

02.繼承

03.多態

 

5.01.對方法的返回值不敏感,怎麼定義方法的返回值。

   02.返回值過程中出現的問題

   第三章  使用屬性升級MyBank

    一、預習檢查

    01.創建屬性通過哪兩個訪問器?

    02,本章介紹了哪些傳遞參數的方式?

   

    二、本章任務

     01.使用屬性封裝年齡字段

     02.使用屬性封裝身份證字段

     03.使用屬性封裝MyBank字段

     04.實現計算一組數的奇偶個數

    

     三、本章目標

     01.掌握C#中的訪問修飾符

     02.掌握c#中的屬性

     03,掌握c#中的值傳遞和引用傳遞

    

     四、C#中的訪問修飾符

         當類的某些敏感字段只希望類內部使用時,可以使用private訪問修飾符

         一個類的字段一旦定義成private,其他類訪問不到

         c#中的訪問修飾符:

             public    不受任何限制,訪問級別最高

             private   只有類的內部可以使用,訪問級別最低

    五、this關鍵字的作用

         c#中this關鍵字有什麼用?

         this代表的是當前類的實例,通過this可以訪問當前類的對象的所有

         成員變量和方法

    六、數據安全

    static void Main(string[] args)

       {

             Student stu = new Student();

             stu._age = -2;//非法數據

             stu. _idCard = "123456"; //身份證號不能被修改

       }

       有時候將類中的字段公開是不安全的,但是如果設為私有成員:

       無法正常賦值,無法獲得數據。

       使用方法解決數據安全問題

       1,使用者不可直接操作_age

       2,用方法返回_age供讀取

       3,用方法限制使用者的非法賦值

       private int _age;

       public int 方法1()

       {

           return this._age;

       }

       public void 方法2(int 參數)

       {

         if(參數<0||參數>100)

         {

            this._age=18;

         }

         else

         {

           this._age=參數;

         }

       }

       這種寫法太麻煩,於是誕生了屬性

       class Student

{

        private string name;

        public string Name

        {

            get { return name; }

            set { name = value; }

        }       

}

       value相當於方法的參數,字段和屬性的數據類型必須一致。

       get用於獲取相應字段的值,

       set用於設置字段的值。

       get和set都存在,讀寫屬性。只有get時,只讀屬性。只有set時,只寫屬性。

       屬性的作用:控制私有字段的可訪問性,保護內部數據的安全。

       建議:類內部敏感字段使用屬性來控制訪問

       快速書寫屬性的方法:用ctrl+R+E

       類的成員:字段、屬性和方法

       屬性是不能用來存儲對數據的,真正的數據是存儲在字段中的。

    七、參數的傳遞方式

    參數傳遞有兩種方式:值傳遞和引用類型傳遞

    注意:值傳遞不能保留參數的修改,要按引用傳遞,使用ref

    通過引用傳遞參數:

      1.定義和調用時,在參數前都要使用ref

      2.在方法調用前:作為參數的變量要聲明並賦值

      3.使用場景:希望保留參數的更改。

      

       課堂內容:

       01.如果想讓一個字段只能在當前類中方式問,那麼可以將訪問修飾符設置成private。

       02.如果類中的一個字段沒有訪問修飾符,那麼默認訪問修飾符是private,但是不建議省略。

       03.什麼是封裝?

       解析:我們可以將私有字段封裝成公有的屬性看成是封裝的一種體現。

          封裝的另一種體現是將多個字段封裝到一個類中。

        04.面向對象的三大特性?

        解析:封裝,繼承和多態

        05.屬性的本質也是方法。這也就是為什麼我在第一節通過GetName()和SetName()來引出屬性。

        白話理解:其實微軟在你進行屬性書寫的時候,自動幫助我們構建了一個getName()方法和換一個

        setName()方法。

        06.真正存儲數據的是字段 ,屬性是不能保存數據的。

3.值類型傳遞和引用類型傳遞

          值類型傳遞(不加ref):

             01.傳遞的參數是值類型:不用保留變量值的更改

                02.傳遞的參數是引用類型:會保留變量值的更改

          引用類型傳遞(加ref)

             01.傳遞的參數是值類型:會保留變量值的更改

                02.傳遞的參數是引用類型:會保留變量值更改

 

第4章 深入C#的String類

01.java中常用字符串處理方法

  substring(3,5):

  "我愛你中國,我愛你天安門!"

  length()

  indexof("中");

  lastIndexOf()

  split()

  concat()

  equals()

  trim()

02.C# 中的類型轉換有哪幾種方式?

解析:

  int.Parse("字符串")

  Convert.ToInt32("任意類型")

  (int)1.23 :類型相容

03.字符串的常用方法

IndexOf():查找某個字符在字符串中的位置

Substring():從字符串中截取子字符串

解析:第二個參數代表從第一個參數索引位置往後,截取幾個長度的字符

"明天是個好天氣"

words.Substring(4,3)

ToLower():將字符串轉換成小寫形式

Equals() :比較兩個字符串的值是否相等

Join():連接字符串

Split():分割字符串

Trim():去掉字符串兩邊的空格

Compare(string strA,string strB):比較字符串strA和strB的字典順序,方法返回值是int類型,

如果返回的是0,兩個字符串相等。

如果返回的是正數,第一個字符串大。

負數,第二個字符串大。

04.什麼MSDN?

解析:微軟推出的官方最權威的一個.NET平台的技術的一個幫助文檔。

什麼Java API

就是sun公司推出的學習java技術最權威的幫助文檔。

05.什麼是URL?

解析:URL(Uniform Resoure Locator:統一資源定位器)

相當於老爺爺口中的網址。

三部分組成:http://wwww.baidu.com

  01.協議類型:http協議 ftp  https:加密協議

  02.域名(是IP地址經過映射後的字符串,為了便於網站用戶更方便的訪問該網站的資源)

  03.資源

06.Format()方法

  {索引,對齊:格式}
07.類型轉換

   無論隱式類型,還是強制類型轉換,前提是類型相容,也就是要是數字都是數字。

   double num=1;//隱式類型轉換

   int number=(int)1.23;//強制類型轉換

   01.Parse:應用場景

   只有將字符串轉成數字這一種情況下可以使用XXX.Parse(字符串)

   02.Convert.ToXXX(任意類型)

   以後大家在編程時,本人強烈建議大家使用Convert進行類型轉換

  

  

 

 

第5章 庫存管理

 效果圖:

 

 

第6章 程序數據的集散地:數據庫

 01.講解SQLServer Management Studio ()

 02.數據庫(DataBase) 為了保證數據的持久化,推出了數據庫

 03.DBS(范圍廣:操作員:數據庫管理系統,硬件平台)  DBMS

 04.系統數據庫

Master

Tempdb

Model

Msdb:調度!任務計劃

Resource:

05.登陸數據兩種驗證方式

   Windows:操作系統登陸後,就可以直接登陸數據庫軟件

   SQL Server

     權限最高的用戶:sa  機房默認密碼:

06.開啟服務的方案

   

01.保存在內存中的數據有什麼缺點?

解析:比如拿咱們書寫的Bank系統為例,如果您通過開戶功能

在數組中新增了一張銀行卡,那麼下次進入系統的時候, 數據不會

保留。

02.數據庫可以看成是一個永久保存數據的倉庫。

 

預習檢查

1.數據完整性指的是什麼?

解析:數據的准確性就是數據的完整性

SQL Server有哪兩種身份驗證方式?

解析:Windows身份驗證和SQL Server身份驗證

創建數據庫需要指定哪兩種文件?

解析:數據文件(.mdf) 和 日志文件(.ldf)

03.為什麼要使用數據庫?

解析:可以存儲大量數據

      可以保證數據的一致性和完整性

      可以滿足應用的共享和安全要求

      方便和智能化的分析,產生新的有用信息

02.行:記錄

   列:字段

03.數據冗余:數據的重復性

04.數據庫完整性:准確性

05.注意點:

    當我們在連接(登陸)數據庫的時候,一定要保證

數據庫服務開啟:Sql Server(MSSQLServer)

04.登陸SQL Server兩種方式:

 Windows身份驗證

 SQL Server身份驗證:sa   機房密碼默認為空

 

核心內容

01.什麼是服務器?

解析:提供服務的一個容器。一台計算機上安裝了某個服務,例如數據庫這款軟件,那麼這台

電腦就稱之為數據庫服務器。

02.常見的數據庫

oracle

DB2

sql server

mysql

sqllite

visual foxpro

access

02.增刪查改

發表評論:質量很好,就是發貨速度有點慢

購物車:刪除

浏覽商品 :查詢

修改密碼:改

上網自己下(我就不告訴你)

05.DBMS和DBS的區別

DBMS:DataBase ManageMent System:數據庫管理系統

DBS:DataBase System 數據庫系統

關系:DBS包含DBMS

因為數據庫系統組成部分:

數據庫的操作者

數據庫軟件  (數據庫管理系統)

承載該軟件的電腦

06.數據庫服務啟動方法

方法一:對“我的電腦”→右鍵“服務”→SQL Server(MSSQLServer)

方法二:打開開始菜單→運行→services.msc回車 就可以打開服務窗口,後續操作同上

方法三:按住鍵盤上的“Win+R”打開命令提示符窗口,輸入→services.msc回車 就可以打開服務窗口,後續操作同上

07.系統數據庫

Resource數據庫:作用:用戶新建 了一個數據庫School,

那麼有些信息會自動從Resource中映射到School中

master數據庫:保存所有數據庫的信息,一旦損壞,整個數據庫軟件都無法運行。

model:模板數據庫

tempdb:臨時數據庫,保存臨時數據

msdb:代理,業務調度,警報作業等。

DBA:OK的

初級DBA

自動備份

10年

美工

軟件開發

 

1.如何將硬盤的數據庫文件拷貝到U盤?

解析:通過關閉服務的方式

2.如何將U盤中的數據庫文件還原成電腦上數據庫軟件中的一個數據庫存在?

解析:先將U盤上的數據文件拷貝到電腦的非系統盤,使用附加工具,找到對應位置的數據庫文件,進行附加操作

3.停止服務備份數據文件的缺陷?

解析:熱備份!

4.童鞋們:收縮數據庫干什麼呀?

解析:節省硬盤空間

三種開啟服務方式:(曉鵬)

08.分離和附(方言)

09.備份和還原 (龍龍)

10.收縮數據庫  

11.刪除數據庫

我站在這裡用血的教訓告訴大家,當你需要刪除數據庫的時候,

一定要備份,嚴重推薦,特別非常十分及其需要注意:在自己心裡先問3遍,你確定

這個數據要刪除嗎?讓你同桌看一下,是否代碼寫的正確,是否需要刪除?

前途:

備份:::::::::::::::

作業:1.bank系統終結版

      2.手寫三遍:轉賬

      3.第6章和第7章預習

      4.blogs兩篇(MyBank  商品管理)

      5.Java  Logic

第7章 數據表

01.四種完整性約束

   001.實體完整性:針對數據行設置的完整性

   002.域完整性:針對數據列設置的完整性。

   003.引用完整性:外鍵約束

   004.自定義完整性:為了滿足我們的業務需求,我們自己量身定制的完整性約束,一般

   通過存儲過程。

02.SQL Server中數據類型

 int:存儲整型數字

 numeric(18, 2):存儲小數

 decimal(18, 2):存儲小數

 nvarchar():存儲文字

  以後嚴重建議大家只要是保存字符串就用nvarchar()類型,n代表的unicode編碼,該編碼是國際通用編碼,可以避免亂碼的出現。var代表長度可變。表中該列真正存儲的內容就占它本身的空間,而不會占用該列通過(20)設置的長度所占用的空間。

 varchar():存儲可變長度的文本

 char(4):存儲固定長度的文本

 text();SQL Sever2000的使用使用的大文本類型,現在2005.2008  2012已經無情的毫無憐憫之心的拋棄了它,

 nvarchar(Max)

 DateTime:保存日期和時間

 照片:image(二進制存儲)

--以後我們存儲姓名:nvarchar(20)

--存儲年齡:int

--存儲性別:bit

--存儲一篇文章:nvarchar(max)

盡量不要使用ntext或者是text,因為text和ntext讀取效率非常低。

 

作業:1.第六章和第七章數據類型形成blog文章

      2.創建MySchool,並且形成Student,Result,Grade,Subject,數據類型,以及測試數據。

      3.第六章選擇和簡答題

03.為表建立約束

  01.主鍵約束

  一張表一定要設置主鍵,否則別人會罵死你。

  如果一張表不設置主鍵,到後續學習框架的時候,框架就欺負你,給你報錯。

  不能給自增列手動給值,這個值是由系統自動給的。

  02.非空約束

  03.默認值約束

  04.check約束

  05.外鍵約束

  注意:外鍵約束只能設置在外鍵表中

 

  年級名稱和學生名稱同時獲取

  年級名稱    學員姓名     學生成績

    S1290       不知道        100

04.常見問題:

 01.外鍵把控的不好

 02.在SQL Server中,字符串和日期類型數據要加單引號,數值類型不用

 03.每張表中必須都有一個主鍵,沒有主鍵的表是不行的。

 04.主鍵列不允許為空

 05.不推薦使用復合主鍵,主鍵列選擇依據:盡量簡單。

 06.如果找不到有意義的列作為表的主鍵,那麼就加多一列ID作為

該表的主鍵列。

05.標識列:

 為了唯一確定一行數據在該表中唯一而設定的一列。

--應用前提:

  01.必須是int(smallint)類型

  02.在標識規范處設置:標識種子,標識增量

(種子值:)標識種子:從哪個數據開始增長

(步長:)標識增量:每次增長幾個數

 

06.外鍵:

在一張表表A中某列是主鍵,但是在另外一張表表B中該列不是主鍵。那麼

表A稱為主鍵表,表B稱為外鍵表。

 

--只能在外鍵表中設置外鍵

%:代表任意長度的任意字符:特別聲明:包含0個

 

07.表內容圖

 

查詢機制

 

外鍵

 

那些年,第七章我們講了什麼?

解析:1主鍵:唯一的,一個

      2.約束:

        非空約束:

        主鍵約束

        默認值約束

        Check約束

        外鍵約束

      3.實體完整性約束(行數據)

        引用完整性約束(外鍵!)

      4.自定義完整性約束(規則,存儲過程,觸發器)

      5.域完整性約束(列  ,check約束)

      6. 設置外鍵:

      7.標識列

        特征:自增,有種子和增量,前提(必須是int類型)

     8.建立數據庫關系圖,更直觀的看出表之間的關系!

     9.數據類型

         文本:char   nchar

               Varchar   nvarchar()

               Text   nvarchar(max)

     10.check

          男或者女 or

     11.建立主鍵

         多列共同確定一個主鍵,復合主鍵。

         主鍵不一定是標識列。

     12.通配符

      _:有且只有一個字符

      %任意個任意字符

       Like ‘’

     13.設置了標識列和約束,不符合約束,可能產生標識列斷裂的情況!

     14.數據類型中的日期和時間  DateTime

     15.刪除數據庫表,要想刪除有外鍵關系的表,必須先刪除子表(外鍵表)

     16.貨幣數據類型money decimal(18,0)

     17.int bit true false

     18.字符編碼unicode

     19.二進制數據 image

第8章 用SQL語句操作數據

DML:

DDL:

DQL:

DCL

 

01.SQL語句書寫規范

  1,.在SQL Sever中,SQL語句不區分大小寫(數據庫名,表名,列名,關鍵字) ,SQL編譯器都識別

  2,對表進行操作的時候,一定要使先用use關鍵字切換到對應的數據庫

  3.自增列不可以賦值

02.新增數據注意事項

  01.如果新增全部列,那麼表名後可以不跟列名,但是要提供所有列的值,除非當前

  列有默認值,那麼也要給出default關鍵字。

  02.如果只想給一張表中添加部分列,那麼在表名後要跟上列名,並且需要保證除了你給出

  的列的值之外,其他列都允許為空或者有默認值。

  insert into goodPerson(stuName,stuAge) values('張曉玲',20)

03. 一次性向一張表中插入多條數據的解決方案

方案一:insert into 目標表

 select  * from 原表

 注意事項:如果目標中有自增列,那麼不能使用*號。

 

 

 方案二:select *  into 目標表(不存在)

  from 原表

  該方式只保留了數據和子自增列,但是主鍵等約束就都沒有了。

 

  方案三:insert into 目標表(存在)

  select '高一二班'

  union

  select '高一五班'

04.幾個注意點

 1.以後大家見到update語句,一定要跟where條件,打死也要跟。

 2.在SQL Server中null代表不知道,所以如果where後的限定條件不能用=和null做對比,必須使用is null

05.delete和truncate區別?

   解析:01.delete 後可以跟where條件,而truncate不行

         02.delete刪除數據的時候會記錄日志,而truncate不會

               03.delete刪除表中所有數據庫,id編號不會從1開始,而truncate會。

 

同志們,有些童鞋問老濕,為什麼呀???

專業人士解析:因為truncate又稱為“截斷表”。編號從1開始。

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved