《C#第2章数据类型与流程控制.ppt》由会员分享,可在线阅读,更多相关《C#第2章数据类型与流程控制.ppt(87页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1 1第第2 2章章 数据类型与流程控制数据类型与流程控制2.1 2.1 数据类型数据类型2.2 2.2 不同数据类型之间的转换不同数据类型之间的转换2.3 2.3 常量与变量常量与变量2.4 2.4 运算符与表达式运算符与表达式2.5 2.5 控制台应用程序与格式化输出控制台应用程序与格式化输出2.6 2.6 C#C#流程控制语句流程控制语句2 22.1 2.1 数据类型数据类型uC#C#数据类型分为两类:值类型和引用类型。数据类型分为两类:值类型和引用类型。P17P17m值类型值类型:包括简单类型、枚举类型、结构类型、可空类型。包括简单类型、枚举类型、结构类型、可空类型。u引用类型引用类型
2、:m 包括类、接口、数组、委托。包括类、接口、数组、委托。一般把引用类型的变量称为对象一般把引用类型的变量称为对象。3 3值类型与引用类型值类型与引用类型4 4栈和堆栈和堆内存基本上被划分为栈和堆内存基本上被划分为栈和堆l栈是用来存储值类型变量的数据结构,如创建栈是用来存储值类型变量的数据结构,如创建intint变量时,变量时,该变量的值存储在栈上,此外对函数(方法)的任何调用都该变量的值存储在栈上,此外对函数(方法)的任何调用都添加到栈的顶端,在函数返回时删除该调用。添加到栈的顶端,在函数返回时删除该调用。l堆用于存储引用类型的变量,在创建类的实例时在堆上分配堆用于存储引用类型的变量,在创建
3、类的实例时在堆上分配对象,返回该对象的地址,并且将该地址存储在位于栈上的对象,返回该对象的地址,并且将该地址存储在位于栈上的变量中。变量中。5 5值类型:值类型:C#的所有值类型均隐式派生自的所有值类型均隐式派生自SYSTEM.VALUETYPE:1、结构体:结构体:Struct(直接派生于(直接派生于SYSTEM.VALUETYPE););2、数值类型:数值类型:整型:整型:SBYTE,SHORT,INT,LONG,BYTE,USHORT,UINT,ULONG,CHAR;浮点型:浮点型:FLOAT,DOUBLE;用于财务计算的高精度用于财务计算的高精度DECIMAL型型;3、BOOL型:型:
4、BOOL(SYSTEM.BOOLEAN的别名);的别名);4、用户定义的结构体(派生于用户定义的结构体(派生于SYSTEM.VALUETYPE)。)。5、枚举:枚举:ENUM(派生于(派生于SYSTEM.ENUM););6、可空类型(派生于可空类型(派生于SYSTEM.NULLABLE泛型结构体,泛型结构体,T?实际上是实际上是SYSTEM.NULLABLE的别名)。的别名)。值类型与引用类型区别值类型与引用类型区别6 6值类型:值类型:C#C#中的所有值类型变量在声明时都有初始值,然而没有明确中的所有值类型变量在声明时都有初始值,然而没有明确地初始化变量,地初始化变量,C#C#就禁止使用该变
5、量。就禁止使用该变量。如:如:bool married;bool married;Console.WriteLine(married);Console.WriteLine(married);则提示错误信息则提示错误信息“使未赋值的变量使未赋值的变量married”married”C#C#中可以将值类型声明为可空(中可以将值类型声明为可空(nullablenullable),意味着它可以暂),意味着它可以暂时没有值。时没有值。如:如:boolbool?married=nullmarried=null;或者或者Nullable married=null;Nullable married=null;
6、值类型与引用类型区别值类型与引用类型区别7 7引引用类型:用类型:1 1、数组(派生于数组(派生于SYSTEM.ARRAYSYSTEM.ARRAY)2 2、用户用定义的以下类型:用户用定义的以下类型:类:类:classclass(派生于(派生于SYSTEM.OBJECTSYSTEM.OBJECT););接口:接口:interfaceinterface(接口不存在派生于何处的问题。(接口不存在派生于何处的问题。3 3、委托:委托:delegatedelegate(派生于(派生于SYSTEM.DELEGATESYSTEM.DELEGATE)。)。4 4、ObjectObject(System.OB
7、JECTSystem.OBJECT的别名);的别名);5 5、字符串:字符串:stringstring(System.StringSystem.String的别名)。的别名)。值类型与引用类型区别值类型与引用类型区别8 8值类型与引用类型区别值类型与引用类型区别堆栈堆56ij实际数据12345Hobj图中i和j为值类型变量,obj为引用类型变量值类型的变量保存的是值类型的变量保存的是变量的值变量的值;引用类型的变量保存的是引用类型的变量保存的是数据的引用地址数据的引用地址。9 9引用类型分两步创建:首先在堆栈上创建一个引用变量,然后在堆上创建对象本身,再把这个内存的句柄(也是内存的首地址)赋给
8、引用变量 例如:string s1,s2;s1=ABCD;s2=s1;其中,s1,s2是指向字符串的引用变量,s1的值是字符串“ABCD”存放在内存的地址,这就是对字符串的引用,两个引用型变量之间的赋值,使得s2、s1都是对“ABCD”的引用。如下图所示。值类型与引用类型区别值类型与引用类型区别1010(1)考虑如下代码:考虑如下代码:int i=5;int j=6;int k=i;i=7;问问k的值是多少?的值是多少?(2)假设类假设类A有实例有实例Obj,Obj1,执行如下代码,执行如下代码Obj.age=10;Obj1=Obj;Obj1.age=12;问此时问此时Obj.age的值是多少
9、?的值是多少?值类型与引用类型区别值类型与引用类型区别1111值类型和引用类型的区别值类型和引用类型的区别 特性特性值类型值类型引用类型引用类型变量中保存的内容变量中保存的内容实际数据实际数据指向实际数据的引用指针指向实际数据的引用指针内存空间配置内存空间配置堆栈(堆栈(StackStack)受管制的堆(受管制的堆(Managed Managed HeapHeap)内存需求内存需求较少较少较多较多执行效率执行效率较快较快较慢较慢内存释放时间点内存释放时间点执行超过定义变量的执行超过定义变量的作用域时作用域时由垃圾回收机制负责回收由垃圾回收机制负责回收1212为什么要托管堆为什么要托管堆(受管制
10、的堆受管制的堆)?.NET框架包含一个托管堆,所有的.NET语言在分配引用类型对象时都要使用它。像值类型这样的轻量级对象始终分配在栈中,但是所有的类实例和数组都被生成在一个内存池中,这个内存池就是托管堆。垃圾收集器的基本算法很简单:将所有的托管内存标记为垃圾 寻找正被使用的内存块,并将他们标记为有效 释放所有没有被使用的内存块 整理堆以减少碎片1313相关面试题目相关面试题目 int k=5;int j=5;if(Object.ReferenceEquals(k,j)/判定判定k k和和j j是否是否为为同一个同一个实实例例 Console.WriteLine(Equal);else Cons
11、ole.WriteLine(Not Equal);Object o=new object();Object obj=o;if(Object.ReferenceEquals(o,obj)Console.WriteLine(Equal);else Console.WriteLine(“Not Equal”);运行结果:Not Equal Equal 14142.1.2 2.1.2 整型整型 uC#C#提供了八种整型(即计算机组成原理中的提供了八种整型(即计算机组成原理中的“定点数定点数”):):sbytesbyte:1 1字节有符号字节有符号 bytebyte:1 1字节无符号字节无符号 shor
12、tshort:2 2字节有符号字节有符号 ushortushort:2 2字节无符号字节无符号 intint:4 4字节有符号,最常用字节有符号,最常用 uintuint:4 4字节无符号字节无符号 longlong:8 8字节有符号字节有符号 ulongulong:8 8 字节无符号字节无符号 15152.1.3 2.1.3 浮点类型浮点类型 float:4字节浮点数,常用。例如:字节浮点数,常用。例如:35.0fdouble:8字节浮点数,常用。例如:字节浮点数,常用。例如:2.7E+23decimal:16字节浮点数,特殊的浮点数,精度高,适用于字节浮点数,特殊的浮点数,精度高,适用于金
13、融、货币等需要高精度数值的领域。其类型指定符为金融、货币等需要高精度数值的领域。其类型指定符为M(或(或m)。)。例如:例如:decimal y=9999999999999999999999999m;float和和double的浮点数格式与计算机组成原理介绍的的浮点数格式与计算机组成原理介绍的IEEE754规定的格式相同规定的格式相同1616C#中中所有非整数的数值所有非整数的数值始终被视为始终被视为双精度双精度,如果将非整数,如果将非整数的数值赋给的数值赋给float类型的变量,需要在该数之后附加类型的变量,需要在该数之后附加F或者或者f后后缀,否则会出现错误缀,否则会出现错误“不能隐式地将
14、不能隐式地将 Double 类型转换为类型转换为“float”类型;请使用类型;请使用“F”后缀创建此类型后缀创建此类型”。如如 float i=3.99f;同样需要使用同样需要使用M后缀将非整数值赋给后缀将非整数值赋给decimal变量变量如如 decimal d=4.56M;2.1.3 2.1.3 浮点类型浮点类型 17172.1.4 2.1.4 布尔型布尔型 u 用用boolbool表示,表示,boolbool类型只有两个值类型只有两个值truetrue和和falsefalse。例如:例如:bool isExist=false;bool isExist=false;bool b=(i0&
15、i0&i10);u注意注意 if(i)j+=10;/if(i)j+=10;/错误错误 if(j=15)j+=10;/if(j=15)j+=10;/错误错误 18182.1.5 2.1.5 字符型与字符串类型字符型与字符串类型 uchar型,为单个型,为单个Unicode字符,字符型常量必须用字符,字符型常量必须用单引号单引号引起引起来来。例如:例如:char ch=a;如果是字符串(单个字符的组合),对应的类型为如果是字符串(单个字符的组合),对应的类型为string。string类型的常量用双引号将字符串引起来。类型的常量用双引号将字符串引起来。例如:例如:string str=hello;
16、uchar和和string类型的常量均可以使用转义符。类型的常量均可以使用转义符。C#中中加在字符串前面,字符串中的加在字符串前面,字符串中的 失去转义符的作用,直失去转义符的作用,直接写字符串而不需要考虑转义字符,接写字符串而不需要考虑转义字符,如果在字符串中需用到双引号,则可连写两个双引号来表示一个双引号。pC:windowsMicrosoft /与 C:windowsMicrosoft 含义相同pHe saidHello to me /与He saidHello to me 含义相同1919转 义 字 符含 义转 义 字 符含 义单引号单引号b退格符退格符双引号双引号f走纸换页符走纸换页
17、符反斜线字符反斜线字符n换行符换行符0空字符空字符r回车符回车符a警铃符警铃符t水平制表符水平制表符v垂直制表符垂直制表符2.1.5 2.1.5 字符型与字符串类型字符型与字符串类型 20202.2 2.2 不同数据类型之间的转换不同数据类型之间的转换 u有两种转换方式:隐式转换与显式转换;有两种转换方式:隐式转换与显式转换;u如果是不同值类型之间的转换,可以使用如果是不同值类型之间的转换,可以使用ConvertConvert类类提供的静态方法。提供的静态方法。21212.2.1 2.2.1 隐式转换和显式转换隐式转换和显式转换u隐式转换:隐式转换:系统默认的,不需要加以声明就可以进行的转换。
18、系统默认的,不需要加以声明就可以进行的转换。从低精度、小范围的数据类型转换为高精度、大范围的数据从低精度、小范围的数据类型转换为高精度、大范围的数据类型,可以用隐式转换。类型,可以用隐式转换。例如:例如:int k=1;int k=1;long i=2;long i=2;i=k;/i=k;/隐式转换隐式转换22222.2.1 2.2.1 隐式转换和显式转换隐式转换和显式转换u显式转换:显式转换:也称为强制转换。用户必须明确地指定转换的类也称为强制转换。用户必须明确地指定转换的类型型。例如:例如:long k=2147483649;long k=2147483649;int i=(int)k;i
19、nt i=(int)k;所有的隐式转换也都可以采用显式转换的形式来表示。如:所有的隐式转换也都可以采用显式转换的形式来表示。如:int i=10;int i=10;long j=(long)i;long j=(long)i;将大范围类型的数据转换为小范围类型的数据的时候,属将大范围类型的数据转换为小范围类型的数据的时候,属于显式转换,另外还必须特别谨慎,因为此时有丢失数据于显式转换,另外还必须特别谨慎,因为此时有丢失数据的危险。的危险。2323例题例题下面声明了一些数值类型的变量:下面声明了一些数值类型的变量:short svalue;int ivalue;uint uvalue;long l
20、value;double dvalue;float fvalue;在对各个变量赋过初值之后,试分析下面哪些转换是正确的,哪些是错误的,在对各个变量赋过初值之后,试分析下面哪些转换是正确的,哪些是错误的,并写出解决办法。并写出解决办法。1)svalue=uvalue;/无法将类型无法将类型“uint”隐式转换为隐式转换为“short”。存在一个。存在一个显式转换显式转换(是否缺少强制转换是否缺少强制转换?)错误;错误;svalue=(short)uvalue;2)lvalue=svalue;正确正确 3)fvalue=dvalue;错误;错误;fvalue=(float)dvalue;4)lva
21、lue=dvalue;错误错误;lvalue=(long)dvalue;24242.2.2 2.2.2 装箱与拆箱装箱与拆箱P22P22uObjectObject类型:所有其他引用类型的基类。类型:所有其他引用类型的基类。m装箱:将值类型转换为装箱:将值类型转换为objectobject类型类型 int i=123;int i=123;object o=i;object o=i;m拆箱:显式地将拆箱:显式地将objectobject类型转换为值类型类型转换为值类型 int i=123;int i=123;Object box=i;/Object box=i;/装箱操作装箱操作 int k=(i
22、nt)box;/int k=(int)box;/拆箱操作拆箱操作m装装箱箱和和拆拆箱箱是是互互逆逆的的过过程程,但但是是必必须须要要注注意意,装装箱箱和和拆拆箱箱必必须满足类型兼容的原则。须满足类型兼容的原则。2525装箱时它首先创建一个对象实例,然后把值类型的值装箱时它首先创建一个对象实例,然后把值类型的值复制到这个对象实例,最后由复制到这个对象实例,最后由objectobject对象引用这个对对象引用这个对象实例象实例。例如:using System;class Demo public static void Main()int x=123;object obj1=x;/装箱操作 x=x+
23、100;/改变x的值,此时obj1的值并不会随之改变 Console.WriteLine(x=0,x);/x=223 Console.WriteLine(obj1=0,obj1);/obj1=123 2.2.2 2.2.2 装箱与拆箱装箱与拆箱2626 拆箱操作与装箱相反,它是将一个拆箱操作与装箱相反,它是将一个objectobject类型转换成值类类型转换成值类型。首先检查由型。首先检查由objectobject引用的对象实例值类型的包装值,然后引用的对象实例值类型的包装值,然后把实例中的值拷贝到值类型的变量中。把实例中的值拷贝到值类型的变量中。class Demo public stati
24、c void Main()int x=123,y;object obj1=x;/装箱操作 x=x+100;/改变x的值,此时obj1的值并不会随之改变 y=(int)obj1;/拆箱操作,必须进行强制类型转换 Console.WriteLine(x=0,x);/x=223 Console.WriteLine(obj1=0,obj1);/obj1=123 Console.WriteLine(y=0,y);Console.WriteLine(y=0,y);2.2.2 2.2.2 装箱与拆箱装箱与拆箱27272.3 2.3 常量和变量常量和变量C#C#中提供中提供2 2种类型的常量:种类型的常量:u
25、使用使用constconst关键字声明关键字声明(const const 字段只能在该字段的声明中初始化。字段只能在该字段的声明中初始化。)constconst常量是在常量是在编译时编译时设置其值并且设置其值并且永远永远不能更改其值的字段,在不能更改其值的字段,在对程序进行编译的时候,编译器会把所有对程序进行编译的时候,编译器会把所有constconst常量全部替换为常常量全部替换为常数。数。const double PI=3.14;const double PI=3.14;u使用使用readonlyreadonly关键字声明关键字声明 readonlyreadonly关键字在程序运行期间只能
26、初始化关键字在程序运行期间只能初始化“一次一次”的字段,可以的字段,可以在声明语句中初始化该字段,也可以在构造函数中初始化该字段。在声明语句中初始化该字段,也可以在构造函数中初始化该字段。初始化以后,用初始化以后,用readonlyreadonly声明的字段的值就不能再更改。声明的字段的值就不能再更改。public readonly string b;public readonly string b;public Form1()public Form1()b=“bbb”;b=“bbb”;28282.3.1 2.3.1 常量常量二者区别:二者区别:ureadonlyreadonly常量运行时初始
27、化,常量运行时初始化,constconst常量编译时初常量编译时初始化。始化。uconstconst常量只能在声明中赋值,常量只能在声明中赋值,readonlyreadonly常量既可常量既可以在声明中赋值,也可以在构造函数中赋值。以在声明中赋值,也可以在构造函数中赋值。29292.3.2 2.3.2 变量变量变量用来表示一个数值、一个字符串值或者一个类的对象。变量用来表示一个数值、一个字符串值或者一个类的对象。变量存储的值可能会发生更改,但变量名称保持不变。变量存储的值可能会发生更改,但变量名称保持不变。C#C#定义了定义了7 7类变量,分别是:静态变量、实例变量、数组元素、类变量,分别是:
28、静态变量、实例变量、数组元素、值参数、引用参数、输出参数和局部变量。值参数、引用参数、输出参数和局部变量。class Aclass A public static int x;/public static int x;/静态变量静态变量 int y;/int y;/局部变量局部变量 void F(int v,int a,ref int b,out int c)void F(int v,int a,ref int b,out int c)int i=1;int i=1;c=a+b+;c=a+b+;30302.3.2 2.3.2 变量变量声明变量举例:声明变量举例:int a=100;int a=
29、100;/声明一个整型变量声明一个整型变量a a,并赋初值为,并赋初值为100100也可以采用先定义、后赋值的方式,例如:也可以采用先定义、后赋值的方式,例如:int a;int a;/声明一个整型变量声明一个整型变量a a a=100;a=100;/为整型变量为整型变量a a赋值为赋值为100100另外,也可以把几个变量声明和初始化用一条语句完成,各另外,也可以把几个变量声明和初始化用一条语句完成,各个变量之间用逗号分隔,例如:个变量之间用逗号分隔,例如:int a=100,b,c=200,d;/int a=100,b,c=200,d;/声明整型变量声明整型变量a a、b b、c c、d d
30、,并将,并将a a赋值赋值100100,c c赋值赋值20020031312.3.3 2.3.3 匿名类型的变量匿名类型的变量匿名类型的变量就是程序员不必指定匿名类型的变量就是程序员不必指定“局部局部”变量的类型,变量的类型,统统用统统用varvar来表示类型即可。来表示类型即可。在在LINQLINQ表达式或者表达式或者foreachforeach语句中,使用匿名类型的变量比较语句中,使用匿名类型的变量比较方便。方便。匿名类型仍然属于强类型,只不过判断具体类型的工作由编匿名类型仍然属于强类型,只不过判断具体类型的工作由编译器完成。译器完成。具体内容到具体内容到LINQLINQ一节再仔细讲解。一
31、节再仔细讲解。【例例】var i=5;var i=5;System.Console.WriteLine(i.GetType();System.Console.WriteLine(i.GetType();32322.4 2.4 运算符和表达式运算符和表达式1.1.运算符运算符C#C#提供了提供了3 3大类运算符:大类运算符:一元运算符:带有一个操作数的运算符称为一元运算符:带有一个操作数的运算符称为“一元一元”运算符,运算符,例如,例如,i+i+。二元运算符:带有两个操作数的运算符称为二元运算符:带有两个操作数的运算符称为“二元二元”运算符,运算符,例如,例如,x+yx+y。三元运算符:带有三个
32、操作数的运算符称为三元运算符:带有三个操作数的运算符称为“三元三元”运算符,运算符,在在C#C#中,只存在中,只存在1 1个三元运算符,即条件运算符个三元运算符,即条件运算符“?:?:”。例如:例如:int z=3;int z=3;int x=(z=3)?2:3;int x=(z=3)?2:3;常用运算符常用运算符typeof typeof:获取类型的:获取类型的System.TypeSystem.Type 例如:例如:System.Type type=typeofSystem.Type type=typeof(intint);33332.4 2.4 运算符和表达式运算符和表达式isis:检查
33、对象是否与给定的类型兼容检查对象是否与给定的类型兼容 例如:例如:if(o is Class1)if(o is Class1)a=(Class1)o;a=(Class1)o;as as :x as T x as T 含义为返回类型为含义为返回类型为T T的的x x。例如:例如:Class1 c=b as Class1 Class1 c=b as Class1 2.2.表达式表达式C#C#的表达式与的表达式与C+C+和和JavaJava类似。类似。34342.5 2.5 控制台应用程序与格式化输出控制台应用程序与格式化输出控制台(控制台(ConsoleConsole类)类)1.1.控制台输出控制
34、台输出lConsole.Write();Console.Write();把各种类型的数据或对象转换成字符串写入标准输出流。把各种类型的数据或对象转换成字符串写入标准输出流。lConsole.WriteLine();Console.WriteLine();把各种类型的数据或对象转换成字符串写入标准输出流,与把各种类型的数据或对象转换成字符串写入标准输出流,与WriteWrite的区别在于,它还输出回车符和换行符(的区别在于,它还输出回车符和换行符(“rn”);rn”);35352.5 2.5 控制台应用程序与格式化输出控制台应用程序与格式化输出2.2.控制台输入控制台输入lConsole.Rea
35、dKey();Console.ReadKey();P27P27 标准输入流读取用户按下的字符或功能键。标准输入流读取用户按下的字符或功能键。例如:例如:ConsoleKeyInfoConsoleKeyInfo c=Console.ReadKey()c=Console.ReadKey();lConsole.ReadLine();Console.ReadLine();从标准输入流读取一行字符。从标准输入流读取一行字符。例如:例如:string s=Console.ReadLine();string s=Console.ReadLine();36363.3.字符串的格式化输出字符串的格式化输出字符串
36、格式化:字符串格式化:ConsoleConsole类的类的WriteWrite或或WriteLineWriteLine方法;方法;String.Format String.Format方法中均可以规定输出字符串的格式。方法中均可以规定输出字符串的格式。格式输出的一般形式为格式输出的一般形式为 N,M:N,M:格式码格式码 其中,其中,:表示其中的内容为可选项。:表示其中的内容为可选项。N N:从零开始的整数,表示第几个参数。:从零开始的整数,表示第几个参数。M M:可选整数,表示最小长度。若参数:可选整数,表示最小长度。若参数N N的长度小于的长度小于M M,就用空,就用空格填充。如果格填充。
37、如果M M为负,则左对齐;如果为负,则左对齐;如果M M为正,则右对齐;为正,则右对齐;如果未指定如果未指定M M,则默认为零。,则默认为零。格式码:可选的格式化代码字符串。格式码:可选的格式化代码字符串。3737字符串的格式化输出字符串的格式化输出对于字符串来说,可以直接利用格式化输出得到希望的格式,对于字符串来说,可以直接利用格式化输出得到希望的格式,例如:例如:string s=string.Format(0,30,);/s string s=string.Format(0,30,);/s得到的得到的结果为结果为3030个空格的字符串个空格的字符串 string s1=string.Fo
38、rmat(0,-20,15);/s1 string s1=string.Format(0,-20,15);/s1得得到的结果为左对齐长度为到的结果为左对齐长度为2020的字符串的字符串3838常用格式码及举例常用格式码及举例格格 式式 符符含含 义义示例:(示例:(int i=10;double x=10.5;)输出结果输出结果C将数字按照金额形式输出将数字按照金额形式输出Console.WriteLine(0:C,i);Console.WriteLine(0:C,x);¥10.00¥10.50D输出十进制整数输出十进制整数Console.WriteLine(0:D,i);Console.Wr
39、iteLine(0:D5,i);1000010F小数点后固定位数小数点后固定位数Console.WriteLine(0:F,i);Console.WriteLine(0:F4,x);10.0010.500000占占位位符符,如如果果数数字字位位数数不不够够指指定定的的占占位位符符位位数数,则则左左边边补补0至至占占位位符符位位数数;如如果果数数字字位位数数超超过过指指定定的的占占位位符符位位数数,则则按按照照原原数数字字实实际际位位数数原原样样输输出出。如如果果小小数数部部分分的的位位数数超超出出指指定定的的占占位位符符位位数数,则则多多余余的的部分四舍五入。部分四舍五入。Console.Wr
40、iteLine(0:00000,123);Console.WriteLine(0:000,12345);Console.WriteLine(0:0000,123.64);Console.WriteLine(0:00.00,123.6484);00123123450124123.65#占占位位符符。对对整整数数部部分分,去去掉掉数数字字左左边边的的无无效效0;对对小小数数部部分分,按按照照四四舍舍五五入入原原则则处处理理后后,再再去去掉掉右右边边的的无无效效0。如如果果这这个个数数就就是是0,而而又又不不想想让让它它显显示示的的时时候候,#占占位位符符很很有用有用Console.WriteLin
41、e(0:#,123);Console.WriteLine(0:#,123.64);Console.WriteLine(0:#.#,123.64);Console.WriteLine(0:#.#,0);Console.WriteLine(0:#.#,123.648);123124123.64123.6539394.4.数字的格式化输出数字的格式化输出常用格式举例:常用格式举例:string s=string.Format(string s=string.Format(0:d60:d6,123);/s,123);/s得到的结果得到的结果为为000123000123int i=123;int i=1
42、23;double j=123.45;double j=123.45;string s1=string.Format(string s1=string.Format(格式:格式:d6,d6,数数0,0,输出结果:输出结果:0:d6,i);0:d6,i);Console.WriteLine(s1);/Console.WriteLine(s1);/结果为:结果为:格式格式d6d6,数,数123123,输出结,输出结果:果:000123000123string s2=string.Format(i:0,-7,j:1,7,i,j);string s2=string.Format(i:0,-7,j:1,
43、7,i,j);Console.WriteLine(s2);/Console.WriteLine(s2);/结果为:结果为:i:123 ,j:123.45i:123 ,j:123.4540404.4.数字的格式化输出数字的格式化输出string s3=string.Format(0:#,#.00,i);string s3=string.Format(0:#,#.00,i);Console.WriteLine(s3);/Console.WriteLine(s3);/结果结果12.0012.00int num=0;int num=0;string s4=string.Format(0:#,num);
44、string s4=string.Format(0:#,num);Console.WriteLine(s4);/Console.WriteLine(s4);/结果输出长度为结果输出长度为0 0的空字符串的空字符串u其他格式化符使用举例其他格式化符使用举例格式:格式:n4n4数数12345.678912345.6789输出结果:输出结果:12,345.678912,345.6789格式:格式:p p数数0.1260.126输出结果:输出结果:12.60%12.60%格式:格式:p2p2数数12.3412.34输出结果:输出结果:1 1,234.00%234.00%格式:格式:5:d5:d数数12
45、3123输出结果:输出结果:123123格式:格式:7:f37:f3数数123.45123.45输出结果:输出结果:123.450123.45041415.5.日期和时间的格式化输出日期和时间的格式化输出DateTime dt=new DateTime(2006,5,25);DateTime dt=new DateTime(2006,5,25);/yy /yy表示年占两位,表示年占两位,M M表示月占表示月占1 1位,超出位,超出1 1位按实际位数位按实际位数 /d /d表示日占表示日占1 1位,超出位,超出1 1位按实际位数位按实际位数 string str=dt.ToString();st
46、ring str=dt.ToString();Console.WriteLine(str);/Console.WriteLine(str);/结果结果 /yyyy /yyyy表示年占表示年占4 4位,位,M M表示月占表示月占1 1位,超出位,超出1 1位按实际位数,位按实际位数,其他按原字符输出其他按原字符输出 string str1=dt.ToString(string str1=dt.ToString(yyyyyyyy年年M M月月););Console.WriteLine(str1);/Console.WriteLine(str1);/结果结果 20062006年年5 5月月中文操作系
47、统下使用英文日期见课本中文操作系统下使用英文日期见课本P30P3042422.6 C#2.6 C#流程控制语句流程控制语句流程控制的形式:流程控制的形式:顺序顺序分支分支循环循环异常捕获异常捕获 如果一个逻辑块包含两条或两条以上的语句序如果一个逻辑块包含两条或两条以上的语句序列,必须使用大括号列,必须使用大括号将语句括起来。将语句括起来。43432.6.1 2.6.1 条件分支语句条件分支语句 uifif语语句句:根根据据布布尔尔表表达达式式的的值值(truetrue或或者者falsefalse)选选择择要要执执行行的的语语句句序序列列,使使用用时时要要注注意意elseelse应应和和最最近近
48、的的ifif语句匹配。语句匹配。u三种形式:三种形式:ifif ifelseifelse ifelse ifelseifelse ifelse44442.6.1 2.6.1 条件分支语句条件分支语句 u【例题例题2-22-2】的关键点:的关键点:从键盘读取一个字符串方法从键盘读取一个字符串方法 string str=Console.ReadLine();string str=Console.ReadLine();将字符串转换成整型数据将字符串转换成整型数据 int int x=Convert.ToInt32(str);/x=Convert.ToInt32(str);/适适合合于于任任何何类类型
49、型转转换换成成整型数据整型数据 int x=int.Parse(str);int x=int.Parse(str);bool b=int.TryParse(str,out x);bool b=int.TryParse(str,out x);针对字符串类型针对字符串类型 int x=Int32.Parse(str);int x=Int32.Parse(str);4545雅虎面试题:雅虎面试题:一列数的规则如下一列数的规则如下:1:1、1 1、2 2、3 3、5 5、8 8、1313、2121、34.34.求第求第3030位数是多少,位数是多少,用用递归算法递归算法实现。实现。实现关键代码:实现关
50、键代码:public static int Foo(int i)public static int Foo(int i)if(i=0)if(i 0&i 0&i 100|i 100|i 0)Console.WriteLine(Console.WriteLine(成绩不在成绩不在0-1000-100范围内范围内););5050 elseelse switch(i/10)/switch(i/10)/整除整除 case 10:case 10:Console.Write(Console.Write(满分,满分,););goto case 9;goto case 9;case 9:case 9:Conso