VC#第3講其它常用數(shù)據(jù)類型.ppt
VisualC#.NET程序設(shè)計,第三講其它常用數(shù)據(jù)類型,第6章其它常用數(shù)據(jù)類型,本章要點:字符串類型的定義與使用枚舉類型的定義與使用委托類型的定義與使用,6.1循序漸進學(xué)理論,6.1.1字符串類型1字符串的種類及其定義(1)規(guī)則字符串格式:string字符串變量名=字符串初值;(2)逐字字符串逐字字符串由字符后跟雙引號括起來的零個或多個字符組成。格式:string字符串變量名=字符串初值;,規(guī)則字符串中可以使用的轉(zhuǎn)義字符,【例6-1】觀察下列程序的執(zhí)行結(jié)果。程序代碼usingSystem;classA_6_1publicstaticvoidMain()stringstr1="你是"王三"?"/“"”是轉(zhuǎn)義字符stringstr2="星期一星期二星期三"/“”是轉(zhuǎn)義字符,stringstr3="你好!t王三。"/“t”是轉(zhuǎn)義字符stringstr4="你好t王三?"/t并不看成轉(zhuǎn)義字符,而是看成兩個字符stringstr5="星期一星期二星期三"/也不是轉(zhuǎn)義字符,而是看成兩個“”Console.WriteLine("str1=0,str2=1,str3=2",str1,str2,str3);Console.WriteLine("str3=0,str4=1",str4,str5);,執(zhí)行結(jié)果,2字符串類型的使用,【例6-3】編寫一個Windows應(yīng)用程序,程序的設(shè)計界面如圖6-1所示,程序的運行界面如圖6-2所示。程序執(zhí)行時在第一個文本框中輸入一個字符串,然后按【倒置】按鈕將把輸入的字符串反序顯示在第二個文本框中。,圖6-1程序設(shè)計界面,圖6-2程序運行界面,3字符串中單個字符的訪問,例如,有以下語句:stringstr1="Iamateacher."/定義一個字符串并賦初值charc;/定義一個字符變量c=str10;/給字符變量賦一個字符,該字符為str1字符串的第一個字符語句執(zhí)行后,字符變量c的值為I。,【例6-4】編寫一個程序,用來統(tǒng)計用戶輸入的字符串中字母個數(shù)、數(shù)字個數(shù)和其它字符個數(shù)。程序的設(shè)計界面如圖6-3所示,程序的運行界面如圖6-4所示。,圖6-3程序設(shè)計界面,圖6-4程序運行界面,6.1.2結(jié)構(gòu)類型,在C+和C#中,結(jié)構(gòu)類型是對同一類具有某些特定屬性和功能的對象的抽象定義,其定義中可以包括構(gòu)造函數(shù)、析構(gòu)函數(shù)、成員變量、成員函數(shù)、成員屬性等等,同C#中的類類型基本相同。但結(jié)構(gòu)類型與類類型畢竟是兩種不同的類型,主要不同點體現(xiàn)在以下兩個方面。(1)存儲值的不同結(jié)構(gòu)類型是值類型,而類類型是引用類型。,(2)參數(shù)傳遞不同,格式:struct結(jié)構(gòu)型名成員聲明;例如:structstudentpublicstringname;publicintage;,實際上程序中使用的不是結(jié)構(gòu)型,而是根據(jù)結(jié)構(gòu)型聲明的結(jié)構(gòu)型變量,根據(jù)結(jié)構(gòu)型聲明結(jié)構(gòu)型變量的格式如下。格式:結(jié)構(gòu)型名結(jié)構(gòu)型變量名;例如有以下語句:studentstu;就是創(chuàng)建了一個名為stu的結(jié)構(gòu)型變量。在程序中經(jīng)常需要訪問結(jié)構(gòu)型變量的成員,訪問方法如下。結(jié)構(gòu)型變量名.成員名;如要給stu的age成員賦值15,可使用如下語句:stu.age=15;,【例6-5】編程實現(xiàn)從鍵盤上輸入一個學(xué)生的學(xué)號、姓名和年齡,然后輸出剛剛輸入的學(xué)生學(xué)號、姓名和年齡。,6.1.3枚舉類型,格式:枚舉修飾符enum枚舉類型名枚舉常量1,枚舉常量2,枚舉常量n;定義枚舉變量的語句格式如下:枚舉類型名變量名;如果希望讓枚舉型常量的值是其它類型的,可在定義枚舉型時指定,定義格式與如下。格式:枚舉修飾符enum枚舉類型名:類型說明符枚舉常量1,枚舉常量2,枚舉常量n;,【例6-6】定義一個職稱枚舉類型,輸出枚舉類型中所有枚舉常量的值。,6.1.4委托類型,1委托C#的委托相當(dāng)于在C/C+中的函數(shù)指針。函數(shù)指針用指針獲取一個函數(shù)的入口地址,實現(xiàn)對函數(shù)的操作。委托與C/C+中的函數(shù)指針不同在于委托是面向?qū)ο蟮模且妙愋?,因此對委托的使用要先定義后實例化,最后才調(diào)用。定義委托使用關(guān)鍵字delegate,定義一個委托:delegateintSomeDelegate(intnID,stringsName);再實例化:SomeDelegated1=newSomeDelegate(wr.InstanceMethod);最后調(diào)用:d1(5,"aaa");通過委托SomeDelegate實現(xiàn)對方法InstanceMethod的調(diào)用,調(diào)用還必須有一個前提條件是:方法InstanceMethod有參數(shù)和定義SomeDelegate的參數(shù)一致,并且返回值為int。方法InstanceMethod定義:publicintInstanceMethod(intnID,stringsName)委托的實例化中的參數(shù)既可以是非靜態(tài)方法,也可以是靜態(tài)方法。,一個委托聲明定義了一個從類System.Delegate延伸的類。一個委托實例封裝一個方法及可調(diào)用的實體。在聲明委托時只需要指定委托指向的函數(shù)原型的類型,它不能有返回值也不能帶有輸出類型的參數(shù)。委托類型的定義格式如下。格式:delegate數(shù)據(jù)類型說明符委托類型名();例如,若要聲明一個指向double類型函數(shù)原型的委托類型,可使用如下語句:delegatedoubleMyDelegate();委托既可以封裝一個靜態(tài)方法也可以封裝一個非靜態(tài)的方法。,委托的使用方法,一般分為三步:(1)聲明委托,定義參數(shù)列表和返回類型。(2)實例化委托:定義一個委托類型的實例變量,讓該實例變量指向某一個具體的方法。其一般格式如下。格式:委托類型名委托變量名=new委托類型名(方法名);(3)調(diào)用委托:調(diào)用委托類型變量指向的方法。其一般格式如下。格式:委托變量名(實參列表);,【例4.25】委托示例。usingSystem;classSimpleClasspublicclassWorkerClass/委托引用的非靜態(tài)方法publicintInstanceMethod(intnID,stringsName)intretval=0;retval=nID*sName.Length;Console.WriteLine("調(diào)用InstanceMethod方法");returnretval;/委托引用的靜態(tài)方法staticpublicintStaticMethod(intnID,stringsName),intretval=0;retval=nID*sName.Length;Console.WriteLine("調(diào)用StaticMethod方法");returnretval;/定義委托,參數(shù)與上面兩個方法相同publicdelegateintSomeDelegate(intnID,stringsName);staticvoidMain(stringargs)/調(diào)用實例方法(非靜態(tài)方法)WorkerClasswr=newWorkerClass();SomeDelegated1=newSomeDelegate(wr.InstanceMethod);Console.WriteLine("InvokingdelegateInstanceMethod,return=0",d1(5,"aaa");,/調(diào)用靜態(tài)方法SomeDelegated2=newSomeDelegate(WorkerClass.StaticMethod);Console.WriteLine("InvokingdelegateStaticMethod,return=0",d2(5,"aaa");運行結(jié)果如圖4.10所示。,圖4.10運行結(jié)果,委托,2.多播相對于上面的一次委托只調(diào)用一個方法,一次委托也可以調(diào)用多個方法,稱為多播。通過+和-運算符實現(xiàn)多播的增加或減少。,【例4.26】多播示例。usingSystem;classSimpleClasspublicclassWorkerClass/委托引用的非靜態(tài)方法publicintInstanceMethod(intnID,stringsName)intretval=0;retval=nID*sName.Length;Console.WriteLine("調(diào)用InstanceMethod方法");returnretval;,/委托引用的靜態(tài)方法staticpublicintStaticMethod(intnID,stringsName)intretval=0;retval=nID*sName.Length;Console.WriteLine("調(diào)用StaticMethod方法");returnretval;/定義委托,簽名與上面兩個方法相同publicdelegateintSomeDelegate(intnID,stringsName);staticvoidMain(stringargs)/調(diào)用實例方法WorkerClasswr=newWorkerClass();SomeDelegated1=newSomeDelegate(wr.InstanceMethod);Console.WriteLine("InvokingdelegateInstanceMethod,return=0",d1(5,"aaa");,/調(diào)用靜態(tài)方法SomeDelegated2=newSomeDelegate(WorkerClass.StaticMethod);Console.WriteLine("InvokingdelegateStaticMethod,return=0",d2(5,"aaa");/多播Console.WriteLine();Console.WriteLine("測試多播.");/多播d3由兩個委托d1和d2組成SomeDelegated3=d1+d2;Console.WriteLine("Invokingdelegate(s)d1ANDd2(multi-cast),return=0",d3(5,"aaa");/委托中的方法個數(shù)intnum_method=d3.GetInvocationList().Length;Console.WriteLine("Numberofmethodsreferencedbydelegated3:0",num_method);/多播d3減去委托d2d3=d3-d2;Console.WriteLine("Invokingdelegate(s)d1(multi-cast),return=0",d3(5,"aaa");,/委托中的方法個數(shù)num_method=d3.GetInvocationList().Length;Console.WriteLine("Numberofmethodsreferencedbydelegated3:0",num_method);運行結(jié)果如圖4.11所示。,圖4.11運行結(jié)果,6.2典型實例練能力,6.2.1典型實例一:回文字符串的判定【實例題目】編寫一個應(yīng)用程序,用來判斷用戶輸入的字符串是否為回文,所謂回文就是正讀和反讀均一樣的字符串。如“abcddcba”、“我是兵兵是我”均是回文,而“abcdefgh”則不是回文。程序的設(shè)計界面如圖6-5所示,程序的運行界面如圖6-6所示。,圖6-5程序設(shè)計界面,圖6-6程序運行界面,6.3上機練習(xí)重應(yīng)用,6.3.1上機練習(xí)一:從字符串中分離出數(shù)字字符【練習(xí)題目】編寫一個程序,把在一個文本框中輸入的字符串中的數(shù)字字符分離出來,然后顯示在另一個文本框中。程序的設(shè)計界面如圖6-8所示,程序的運行界面如圖6-9所示。,圖6-8程序設(shè)計界面,圖6-9程序運行界面,