c #教程第一课简单的欢迎程序_第1页
c #教程第一课简单的欢迎程序_第2页
c #教程第一课简单的欢迎程序_第3页
c #教程第一课简单的欢迎程序_第4页
已阅读5页,还剩113页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C#教程第一课:简单的欢迎程序在本文开始写作的时候,虽然商用c#编译器尚未推出,但你可以下载微软的.NETFrameworksSDKBeta1.本节课通过介绍几个简单的程序,使得你对C#有所入门。本节程要达到如下几个目的:.理解ー个C#程序的基本结构。.初步了解〃名称空间〃的概念。.初步了解〃类〃的概念。.了解〃Main〃方法所做的工作。.学会如何读取命令行输入信息。.学会使用控制台输入/输出(I/O)语句。1.清单1-1.一个简单的欢迎程序Welcome,cs//NamespaceDeclarationusingSystem;//ProgramstartclassclassWelcomeCSS{

//Mainbeginsprogramexecution.publicstaticvoidMain(){//WritetoconsoleConsole.WriteLine(''WelcometotheC#StationTutorial!");说明.清单1-1中的程序包括四个基本元素:名称空间的声明,类,"Main''方法和语句。.本例中对名称空间的声明,表明正在使用''System"这个名称空间。名称空间内包含了一组可以被C#程序调用的代码。有了"usingSystem;"这个声明,就表明程序可以引用该"System"名称空间内的代码,而无需在每个引用的前面加上"System"。关于这一点,我将在后面专门介绍名称空间的课程中详细介

绍。.类〃classWelcomeCSS〃包含了程序所要用到的数据,和所要执行的方法的定义。同诸如接口和结构这样的元素类似,类在程序中是用来描述对象的,这些元素都将会在后续课程中详细介绍。本例中的类不包含数据,只包含ー个方法。该方法定义了该类的行为(或者称为该类所能做的事情)。.程序运行时,WelcomeCSS类中的该方法表明了该类所要完成的事情。方法名〃Main〃作为保留字,作为程序的起点。〃Main〃前面是个名为〃static〃的修饰符。〃static〃修饰符表明该方法仅仅在该特定的类中工作,而不是在在该类的实例中工作。这是必需的,因为一旦程序启动后,并不存在对象的实例。类,对象和实例的具体用法将会在后面的课程中覆盖到。每个方法必须有个返回值类型。本例中,返回值类型是〃void”,它表明〃Main〃函数没有返回值。每个方法名的后面也都跟着个参数表,参数表包含有零个或者多个参数并用括号括起来。为了简单起见,没有在〃Main〃后面添加参数。后面的课程中,将介绍〃Main〃方法所允许采用的参数类型。."Main"方法通过"Console.WriteLine(...)"语句表明其行为。"Console"是"System"名称空间中的类。"WriteLine(...)"是"Console”类中的方法。我们使用".〃这个句点操作符来标记程序中的从属元素。注意到,我们也可以这样来书写:"System.Console.WriteLine(...)",这样的书写格式是很有趣的,它是根据"namespace,class,method"的格式进行书写的。如果在程序的一开始,没有采用"usingSystem"的声明,那么就必须严格遵守"System.Console.WriteLine(...)〃这样的书写格式。该语句的执行结果是在控制台控制台上输出字符串“WelcometotheC#StationTutorial!"o.注释是由"〃"标出的。例子中的这些注释都是单行注释,表明从该注释符号的开始处到该行结束处,都是注释部分。如果你的注释要跨越若干行,即多行注释,可以以符号〃/・〃开始,以符号〃*/〃结束,其中所包含的全部是注释。你也可以在多行注释符号中包含单行注释。但是,不能在单行注释符号后面放上多行注释符

号。程序编译时,将忽略掉注释部分。注释的目的是为了用简单的英语给程序所要完成的工作加上注解。.所有语句都以分号〃;〃结束。类和方法以〃{〃开始,以〃}〃结束。任何位于〃{〃和〃}〃之间的语句定义为块。块定义了程序元素的活动范围(或者称为生命期和可见性),这些概念将在后面的课程中加以介绍。.可以编写出能够接受命令行输入信息的程序。命令行输入信息的集合是在〃Main〃方法中进行处理的。清单1-2中的程序,可以从命令行中接受输入一个名字,之后在控制台上显示出来。2.清单1-2.读取命令行输入信息的程序NamedWelcome.cs//NamespaceDeclarationusingSystem;//ProgramstartclassclassNamedWelcome{//Mainbeginsprogramexecution.

publicstaticvoidMain(string[]args){//WritetoconsoleConsole.WriteLine("Hello,{0}!",args[0]);Console.WriteLine("WelcometotheC#StationTutorial!");说明.记住,要把你的名字添加到命令行中。例如,在命令行中打入"NamedWelcomeJoe"〇如果不这样做,程序就会崩溃,在后面的课程中,将介绍如何检测这种情况,以及如何避免这种情况的出现。.在清单1-2中,在〃Main"方法的参数表中有个入口。参数名是〃args〃。在程序的后面部分就要引用该参数。〃string口〃是参数〃args〃的类型。"string〃类型用于存放字符。这些字符可以是ー个单词,也可以是多个单词。方括号〃口〃

表示数组,〃args〃参数由命令行上的若干个单词构成。.在"Main”方法的语句中,多了一・条"Console.WriteLine(...)〃语句。该语句中的参数表同以往的写法不同,其中有个格式字符串"{0}"参数。格式串中的第一个参数从数字〇开始,第二个参数从数字1开始,依此类推。"{0}〃参数意味着引号后面的参数值将会输出到该位置。现在让我们来看看引号后面的参数。."args[0]〃参数,它指向"args"数组中的第一个字符串。数组中的第一个元素是args[0],第二个元素是args[l],依此类推。例如,如果我在命令行中写上"NamedWelcomeJoe〃,"args[0]〃的值就为"Joe".让我们回到在格式字符串中嵌入的"{0}"参数吧,因为"args[0]"是格式串后面的第一个参数,一旦执行该命令时,"args[0]〃的值"Joe〃就会替换掉格式串中的"{0}"。一旦执行命令:"NamedWelcomeJoe",输出结果就会为:>Hello,Joe!

>WelcometotheC#StationTutorial!通过控制台也可以把输入信息提供给程序。清单1-3演示了交互式处理用户输入的信息的方法。3.清单一3.交互式处理输入信息的程序InteractiveWelcome.cs//NamespaceDeclarationusingSystem;//ProgramstartclassclassNamedWelcome{//Mainbeginsprogramexecution.publicstaticvoidMain(){//Writetoconsole/getinputConsole.Write(z,Whatisyourname?:);Console.Write(''Hello,{0}!",Console.ReadLine());Console.WriteLine("WelcometotheC#StationTutorial!");

说明这一次,〃Main〃方法没有用到任何参数,但现在程序中有了三条语句,前面两条语句不同于第三条语句,它们是:〃Console.Write(…)〃而不是"Console.WriteLine(...)〃。区别是:〃Console.Write(...)〃语句把信息输出到控制台,之后光标停留在同一行,而〃Console.WriteLine(...)〃把信息输出,之后换行。第一条语句仅仅输出〃Whatisyourname?:〃到控制台。第二条语句要等到其参数被适当地处理之后,オ会输出信息。格式串后面的第一个参数是:〃Console.ReadLineO〃。这就使得程序要等待用户在控制台输入信息,输入信息以回车或者换行结束。该方法的返回值替换了格式串中的〃{0}〃参数,并输出到控制台上。最后ー个语句也用来输出信息到控制台,这一点我们在前面已经介绍过。一旦运行了程序〃InteractiveWelcome”,其输出结果为:>WhatisyourName?

>Hello,!WelcometotheC#StationTutorial!小结到现在为止,你已经了解了C#程序的基本结构,名称空间和类。你还了解到〃Main〃方法是C#程序的入口,并学会了如何捕捉命令行的输入信息,以及如何进行交互式的I/O操作。C#教程第二课:表达式,类型和变量逻辑与&左逻辑异或へ左逻辑或1左条件与&&左条件或II左条件?:右赋值等=*=/=%=+=-=<<=>>=&=へ==右左结合意味着运算符是从左到右进行运算的。右结合意味着

所有的运算是从右到左进行的,如赋值运算符,要等到其右边的计算出来之后,オ把结果放到左边的变量中。2.清单!-2.单目运算符:Unary,csusingSystem;classUnary{publicstaticvoidMain(){intunary=0;intpreincrement;intpreDecrement;intpostincrement;intpostDecrement;intpositive;intnegative;sbytebitNot;boollogNot;preincrement=++unary;Console.WriteLineC'Pre-Increment;{〇}〃,preincrement);preDecrement=一unary;Console.WriteLineC'Pre-Decrement;{0j,preDecrement);postDecrement=unary—;Console.WriteLine(''Post-Decrement:{0}",postDecrement);postincrement二unary++;Console.WriteLine("Post-Increment:{0}",postincrement);Console.WriteLine("FinalValueofUnary:{0}",unary);positive=-postincrement;Console.WriteLineC'Positive:{0}",positive);negative=4-postincrement;Console.WriteLine("Negative:{0}",negative);bitNot=0;bitNot=(sbyte)(〜bitNot);Console.WriteLine("BitwiseNot:{0}",bitNot);logNot=false;logNot=!logNot;Console.WriteLine("LogicalNot:{0}",logNot);)}说明.当计算表达式的时候,在后置增一和后置减ー运算符进行运算时,先返回其值,再进行增ー或者减ー运算。当使用前置加号和减号运算符进行运算时,是先进行增ー或者减ー的运算,然后再返回其结果值。.在清单1-2中,变量unary初始化为0,迪亍++x运算时,“unary”的值加1,再把其值1赋给〃preincrement〃变量〇在进行一x运算时,先把〃unary〃的值减到〇,再把值〇赋给〃preDecrement”变量。.进行Xー运算时,先把“unary"的值〇赋给"postDecrement"变量,之后再把"unary"减到ー1。进行x++运算时,先把〃unary"的值T赋给"postincrement〃变量,之后再对"unary〃加1,使得〃unary"变量现在的值为〇〇.变量"bitNot"初始值为〇,进行按位取反运算,本例中,数〇表示为二进制〃00000000〃,按位取反之后变为T,其二进制表示为〃11111111〃。.了解一下表达式〃(sbyte)(〜bitNot)〃,任何对类型sbyte,byte,short或者ushort类型数据的运算,返回结果

都是整数。要把值赋给bitNot变量,我们必须使用cast(类型)运算符(强制类型转换),其中Type表示你希望转换成的类型(本例中为sbyte)。Cast运算符把大范围类型的数据转换为小范围类型的数据时,须特别谨慎,因为此时有丢失数据的危险。一般来说,把小类型的数据赋给大类型变量,并没有问题,因为大范围数据类型的变量具有足够的空间存放小类型数据。注意在signed和unsigned类型之间进行Cast运算时,也存在此类危险。许多初级程序设计教程对变量的位表示作出了很好的讲解,同时也介绍了直接进行Cast运算的危险。逻辑非⑴运算符可以处理布尔变量值。本例中,〃logNoJ变量从false变为true〇上述程序的输出结果如下:>Pre-Increment:1>Pre-Decrement0>Post-Decrement:0>Post-Increment-1>FinalValueofUnary:0>Positive:1>Netative:-1

>BitwiseNot:-1>LogicalNot:True3.清单1-3.二元运算符Binary,csusingSystem;classBinary{publicstaticvoidMain(){intx,y,result;floatfloatResult;x=7;y=5;result=x+y;Console.WriteLineCx+y:{0}〃,result);result=x-y;Console.WriteLine(,,x-y:{0}〃,result);result=x*y;Console.WriteLine(?,x*y:{〇},result);result=x/y;Console.WriteLineC'x/y:{0}〃,result);floatResult=(float)x/(float)y;

Console.WriteLineC'x/y:{0}",floatResult);result=x%y;Console.WriteLine("x%y:{0}",result);result+=x;Console.WriteLine("result+=x:{0}",result);说明清单一3演示了二元操作符的几个例子。加法(+),减法(-),乘法(*)和除法(/)的运算结果,就是我们通常进行的的四则运算的结果。因为〃floatResult〃变量是浮点运算类型,所以整型变量〃x〃和〃y〃被强制转换成浮点类型来计算FloatResulto这里有个求余数的运算符,两个操作数相除,返回余数。最后一条语句给出了另外一种赋值形式,这里用了(+=)运算符.无论什么时候你使用(+=)运算符,那么这个二进制

运算符就应该在运算符左右两边都进行运算,然后把值赋给左边的参数。本语句相当于"result=result+x"»并返回同样的值。前面的课程中,你看到的使用次数较多的ー种类型是〃string〃(字符串)类型。〃string〃类型是由包含在引号内的Unicode编码的字符构成。例如〃Thisisastring.另外一种数据类型是数组。数组可以看成是同种类型的元素构成的集合。当声明数组时,你要指定类型名,数组名,维数和数组大小。4.清单!-4.ArrayOperations:Array,csusingSystem;classArray{publicstaticvoidMain(){int[]mylnts={5,10,15);bool[][]myBools=newbool[2]ロ;myBools[0]=newbool[2];myBools[1]=newbool[1];double[,]myDoubles二newdouble[2,2];

string[]myStrings二newstring[3];Console.WriteLine(''rnylnts[0]:{0},mylnts[1]:{1},mylnts[2]:{2}”,myInts[0],mylnts[1],mylnts[2]);myBools[0][0]=true;myBools[0][1]=false;myBools[1][0]:true;Console.WriteLineC'myBools[0][0]:{0},myBools[1][0]:{1}〃,myBools[0][0],myBools[1][0]);myDoubles[0, 0] = 3.147;myDoubles[0, 1] = 7.157;myDoubles[1, 1] = 2.117;myDoubles[1, 0] = 56.00138917;Console.WriteLine(''myDoubles[0,0]:{0},myDoubles[1,0]:{1}",myDoubles[0,0],myDoubles[1,0]);myStrings[0]="Joe";myStrings[1]="Matt";myStrings[2]="Robert";Console.WriteLine("myStrings[0]:{0},myStrings[1]:{1},myStrings[2]:{2}",myStrings[0],myStringsEl],myStrings[2]);说明清单1-4演示了数组的各种不同实现方法。第一个例子是“mylnts〃数组,它在声明的同时进行了初始化。接着是个二维数组,可以把它理解为数组的数组。我们需要使用〃new〃运算符来实例化初始数组的大小,之后,再对每个子数组使用new运算符。第三个例子是个二维数组。数组可以是多维的,每ー维可以通过逗号隔开,也必须用〃new〃运算符进行实例化。最后定义了一个ー维的字符串数组。每种情况下,对于数据元素的访问可以通过引用元素的位置(下标)来进行。数组的大小可以是任何整型值。其下标从0开始。小结到现在为止,你已经了解了C#的变量,简单数据类型,数

组和字符串。我们还学习了如何用C#的运算符构成表达式。C#教程第三课:选择控制语句本节课将介绍如何使用C#选择控制语句,第三课将达到如下几个目的:.学会〃if〃语句的用法。.学会〃switch〃语句的用法。.学会在〃switch〃语句中如何使用〃break〃语句。.理解〃goto〃语句的正确用法。在前面几节课中,你所看到的程序都是顺序执行的。你无法控制输入语句,你所能做的就是跟着程序执行直到终止。本节课中,将介绍基于条件进行判断,从而选择进入相应的逻辑分支中去执行。

我们所介绍的第一个选择语句是〃if〃语句,它有三种基本形式:单条选择,如果/否则,以及多情形选择。1.清单3-1.IF语句的格式:IfSelection.csusingSystem;classIfSelect{publicstaticvoidMain(){stringmylnput;intmylnt;Console.Write("Pleaseenteranumber:");mylnput二Console.ReadLineO;mylnt=Int32.Parse(mylnput);//SingleDecisionandActionwithbracketsif(mylnt>0){Console.WriteLine("Yournumber{0}isgreaterthanzero.",mylnt);)//SingleDecisionandActionwithoutbracketsif(mylnt<0)Console.WriteLine("Yournumber{0}islessthanzero.",mylnt);//Either/OrDecisionif(mylnt!=0){Console.WriteLineC'Yournumber{0}isnotequaltozero.〃,mylnt);}else{Console.WriteLineC'Yournumber{0}isequaltozero.”,mylnt);}//MultipleCaseDecisionif(mylnt<0||mylnt==0){Console.WriteLine("Yournumber{0}islessthanorequaltozero.",mylnt);}elseif(mylnt>0&&mylntく=10){Console.WriteLine("Yournumber{0}isbetween1and10.",mylnt);}elseif(mylnt>10&&mylnt<=20){Console.WriteLine("Yournumber{0}isbetween11and20.",mylnt);

elseif(mylnt>20&&mylnt<=30){Console.WriteLineC'Yournumber{0}isbetween21and3〇.”,mylnt);}else{Console.WriteLine("Yournumber{0}isgreaterthan30.",mylnt);说明.清单3-1中的IF语句的各种格式都使用了同一个输入变量〃mylnt”。这是从用户获得交互内容的另ー种方式。我们首先输出一行信息:“Pleaseenteranumber:"到控制台。"Console.ReadLine()"语句使得程序等待来自用户的输入,一旦用户输入

ー个数字,按回车键之后,该数字以字符串的形式返回到〃IDylnpuイ变量中,由于我们需要的是一个整数,所以需要转换变量"mylnpulし〃成整型数据。用命令“Int32.Parse(mylnput)〃即可完成。(Int32等数据类型将在后面的课程中加以介绍。)转换结果放到〃mylnイ变量中,这是个整数类型。.有了我们所需要的类型的数据,就可以用”if"语句来进行条件判断了。对于第一种形式的IF语句,格式为:if(booleanexpression){statements}〇该语句必须以关键字"if”开始。之后,括号中为布尔表达式。该布尔表达式必须计算出ー个true或者false值。在本例中,我们检查用户的输入,看看输入值是否大于0,如果表达式运算结果为true,就执行大括号中的语句。(我们把大括号之间的语句部分称为”block”。)块中有一个或者多个语句。如果布尔表达式的值为false,我们就忽略块中的语句,直接执行块后面的语句。.除了没有块之外,第二种”if”语句的格式非常类似于第一种。因此,如果布尔表达式为true,将会执行布尔表达式之后的第一条语句。当布尔表达式的值为false,布尔表达式之后的第一条语句将被忽略掉,而直接执行其后的程序语句。如果你只有一条语句需要执行,就用该格式的"f语句。如果你打算在布尔表达式的值为true时,执行两条或者两条以上的语句,就必须把它们放到块中。我个人的建议是:无论需要执行几条语句,要养成把if语句放到块中的习惯,这就使得你避免犯如下错误:当添加了一条语句之后,忘记了添加一对括号。.大多数时候,你需要作出如下选择:当条件满足时做一件事,否则做另外一件事。清单3-1中,程序演示了这种if语句格式的用法。当布尔表达式为true时,就立刻执行“if”后面的那条语句,而当布尔表达式为false时,就执行”else”关键字后面的语句。.当要计算多个布尔表达式时,你可以使用if/elseif/else这种格式,上面的例子程序演示了这种形式,从关键字”if”开始,一旦布尔表达式为真,就执行if后面的块。但是,这ー次,在组合关键字”elseif”后面还可以进行多个条件的判断。”elseif”语句后面也有个布尔表达式,一旦该布尔表达式的值为true,就会执行紧接其后的块。这种情形可以一直持续下去,直到所有的情况都已经计算出来,但是整个”if/elseif”序列必须以“else”结束。当所有的”if”或者”elseif"后面的布尔表达式的值都为false时,就执行关键字”else”后面的块。对于if/elseif/else格式的语句,每次仅仅执行一个其中部分的语句。.上面的例子中,布尔表达式(mylnt<0IImylnt==〇)包含了条件OR(II)运算符。对于常规OR(I)运算符和条件OR(II)运算符来说,只要有运算符两边的子表达式之一为真,整个布尔表达式的值就为真。两个运算符的区别在于:正规OR运算符(I)每次都对运算符(I)两边的表达式进行计算。而条件运算符OR(II)只有当第一个子表达式的值为false时,オ计算第二个子表达式的值。.布尔表达式(mylnt>0&&mylnt<=10)包含了条件运算符AND〇对于常规AND(&)运算符和条件AND(&&)运算符来说,只有当运算符两边的子表达式的值都为真时,整个布尔表达式的值为真。两种运算符的区别在于:正规AND(&)运算符每次都计算运算符两边的子表达式的值,但是对于条件AND运算符来说,只有当第一个子表达式的值为真时,オ计算第二个表达式的值。条件运算符(&&和II)通常称为运算优化的运算符,因为有时不需要计算整个表达式的值。这样就可以忽略掉不必要的逻辑表达式的计算,可以生成有效的代码。同if/elseif/else格式的"if"语句类似,"switch"语句的用法如下:2.清单3-2.分支选择语句:SwitchSelection.csusingSystem;classSwitchSelect(publicstaticvoidMain(){stringmylnput;intmylnt;begin:Console.Write("Pleaseenteranumberbetween1and3:");mylnput=Console.ReadLineO;mylnt二!nt32.Parse(mylnput);//switchwithintegertypeswitch(mylnt){Console.WriteLine("Yournumberis{0}.〃,mylnt);Console.WriteLine("Yournumberis{0}.〃,mylnt);break;Console.WriteLine("Yournumberis{0}.〃,mylnt);Console.WriteLine("Yournumberis{0}.〃,mylnt);break;Console.WriteLine("Yournumberis{0}.〃,mylnt);Console.WriteLine("Yournumberis{0}.〃,mylnt);break;default:Console.WriteLine("Yournumber{0}isnotbetween1andConsole.WriteLine("Yournumber{0}isnotbetween1and3.",mylnt);decide:Console.Write("Type\"continue\"togoonor\"quit\"tostop:");mylnput二Console.ReadLineO;//switchwithstringtypeswitch(mylnput){case"continue":gotobegin;casequit:Console.WriteLine<Bye.");break;default:Console.WriteLine(/zYourinput{0}isincorrect.z,,mylnput);gotodecide;说明.清单3-2演示了多分支选择语句switch的用法。关键字"switch”后面是switch表达式。Switch表达式必须是以下类型中的ー种:sbyte,byte,short,ushort,int,uint,long,ulong,char,string,或者enum类型。(enum类型将在后面的课程中加以介绍)。在清单3-2的第一个“switch〃语句中,switch表达式计算的是整数类型的数据。.在switch表达式后面是个switch块,当Switch表达式的值同某ー个case后面的常量表达式的值相匹配时,就执行此case后面的语句,直到遇到〃break〃语句或者〃goto〃语句为止。每个分支以关键字〃case〃作为标号,其后为常量表达式,然后是分号(:)〇本例子程序中,我们有〃case1:〃,〃case2:〃和〃case3:〃。.你可以在所有的分支选择的后面加上一个〃default〃分支。如果没有匹配的常量表达式,就进入default分支,并执行该分支的语句。虽然default标号是可选的,我建议你加上该分支。这将有助于处理一些意外事件,使得你的程序能够捕捉和处理不可预见的事件,从而使得程序更加可靠。.每个〃case〃标号必须以〃break〃语句作为结束。“break〃语句将使得程序退出switch语句,并从switch块后面的一条语句开始执行。对于〃default〃标号来说,“break〃语句是可选的,因为有"break"语句和没有"break"语句,其运行结果是ー样的。如果你在switch块中放置了ー个"goto"语句,情况就不一样了。.清单3-2中的第二个〃switch〃语句演示了〃got〇〃语句的用法。“goto〃语句可以让程序跳到关键字〃goto〃后面的标号中去执行。程序执行过程中,如果用户打入〃continue”,switch语句就匹配case"continue"中的常量表达式,并执行"gotobegin:〃语句。程序就会离开〃switch〃语句,开始执行标号“begin:〃后的第一条语句。这是个有效的循环,可以让你多次重复执行同样一段代码。一旦用户打入字符串"quit",循环将会结束。此时,将进入case"quit"分支。该分支将输出信息〃Bye."到控制台上,之后跳出switch语句,再结束程序。一旦输入的字符串既不是〃continue〃也不是〃quit”,就会进入"default:"分支。于是,将会输出ー个出错信息到控制台±,之后执行〃got。decide:〃命令。这就使得程序转跳到“decide:〃标号后面的第一条语句,该语句执行后,将会询问用户是否愿意continue(继续)还是quit(退出)。这是个有效的循环。显然,〃goto"语句功能强大,在受控的场合下,"goto"语句是很有用途的。但是,必须指出的是,〃goto〃如果出现被滥用的趋势,程序的调试和维护将会变得很困难。想象一下,如果程序到处可见goto语句,其流程将会变得难以阅读和理解。下节课中,将介绍在程序中创建循环语句的更好方法。小结现在,你已经了解了如何使用〃if〃语句的各种格式,也了解了如何使用〃switch〃语句。你也了解了使用〃break〃语句可以从〃switch〃语句中推出。最后,你也了解了如何使用“goto〃语句跳到程序的另外一个部分。C#教程第四课:循环控制语句作者:未知阅读人次:65561 文章来源:赢政天下发布时间:2004-9-13 网友评论(:)条

本节课将介绍如何使用C#控制语句中的循环语句,本课目的如下:.学会〃while〃循环的用法。.学会〃d〇〃循环的用法。.学会〃for〃循环的用法。.学会foreach循环的用法。.进ー步了解〃break〃语句的用法。.如何使用〃continue〃语句。在C#中,使用〃goto〃语句并不是ー个最佳的建立循环的方法。本节课将介绍建立循环的常用方法。第一个要介绍的语句是while循环语句1.清单4-1.While循环:Whileloop,cs

usingSystem;classWhileloop{publicstaticvoidMain(){intmylnt=0;while(mylnt<10){Console.WriteC/{0}〃,mylnt);mylnt++;)Console.WriteLine();说明.清单4T演示了一个简单的while循环。以关键字〃while〃开始,后面是个布尔表达式。所有的控制语句都使用了布尔表达式。这就意味着表达式必须计算出true或者false值。本例中,我们将检查mylnt变量,看看

它是否小于10o因为mylnt已经初始化为0»第一次计算时,该布尔表达式将返回true值。一旦布尔表达式的值为true,将执行该布尔表达式后面块中的语句。.在while块中,我们把数字和空格输出到控制台中,之后,对mylnt进行加1运算。一旦执行了while块中的语句之后,再次计算布尔表达式的值,这种情况将一直循环下去,直到该布尔表达式的值为false为止。一旦布尔表达式的值为false,程序将从while块之后的第一条语句开始执行。在本例中,我们把数字0到9输出到控制台中,之后退出while块,再输出ー个新行到控制台。同“while〃循环类似的是〃d〇〃循环语句。.清单4-2.Do循环:Doloop,csusingSystem;classDoloop{publicstaticvoidMain(){stringmyChoice;do{//PrintAMenu

Console.WriteLine(?,MyAddressBook\n〃);Console.WriteLine(",A-AddNewAddress");Console.WriteLine("D-DeleteAddress");Console.WriteLine("M-ModifyAddress");Console.WriteLine("V-ViewAddresses");Console.WriteLine("Q-Quit\n");Console.WriteLine("Choice(A,D,M,V,orQ):");//Retrievetheuser,schoicemyChoice=Console.ReadLineO;//Makeadecisionbasedontheuser,schoiceswitch(myChoice){caseA:casea:Console.WriteLine("Youwishtoaddanaddress.");break;caseD:cased:Console.WriteLine("Youwishtodeleteanaddress.");break;caseM:casem:Console.WriteLineC'Youwishtomodifyanaddress.,,);break;caseV:casev:Console.WriteLine(/zYouwishtoviewtheaddresslist.〃);break;caseQ:caseq:Console.WriteLine(〃Bye.");break;default;Console.WriteLineC,{0}isnotavalidchoice,,,myChoice);}//PausetoallowtheusertoseetheresultsConsole.Write(?,Pressanykeytocontinue... ;Console.ReadLine();Console.WriteLine();}while(myChoice!ニ〃Q〃&&myChoice!=〃q〃);//Keepgoinguntiltheuserwantstoquit

说明.清单4-2演示了〃do〃循环的例子。〃d〇〃循环的格式是:do{く语句>}while(く布尔表达式》);其中的语句可以是任何合法的C#语句,布尔表达式同以前的规定一样,其返回值要么为true,要么为false〇.如果你打算输出清单4-2中的信息或者菜单,之后再读取用户的输入,那么就使用〃d〇〃格式的循环而不要使用〃while〃格式的循环语句。因为在本例中,布尔表达式的值是在循环结束处进行计算的,〃do〃循环可以保证:循环体中的语句至少执行一次。与此相对应的是:〃while〃循环ー开始时,计算布尔表达式的值,〃while〃循环不能保证循环体中的语句能够至少执行一次。.让我们来回顾一下清单4-2中的内容。在Main。方法中,我们定义了变量“myChoice〃为字符串类型。之后,输出ー些信息到控制台,即输出ー个可让用户进行选择的菜单。我们必须要得到用户的输入,即Console.R

eadLineO方法所返回的值,该值存放在myChoice变量中。我们必须先得到用户的输入,之后再处理。要完成这件事,ー个有效的方法是就使用“switch〃语句。注意到:为了获得同样的功能,我们既匹配了小写字母,也匹配了大写字母。另外一点是:我们使用了"default:〃case,这是个良好的编程作风。3.清单4-3.For循环:Forloop.csusingSystem;classForloop{publicstaticvoidMain(){for(inti=0;i<20;i++){if(i==10)break;if(i%2==0)continue;Console.Write("{0}",i);Console.WriteLine();

说明.清单4-3演示了〃for”循环的用法。当你能够精确地知道循环的次数时,For循环语句就派上了用场。本程序同清单4-1中〃while〃循环程序的运行结果ー样。〃for〃循环中,括号中内容由三个由分号隔开的部分:〃(く初始化表》;く布尔表达式》;<post-loop动作表〉)〃组成.初始化表是个由逗号隔开的表达式,在‘x。ピ循环的整个周期中,这些表达式仅仅计算ー次。计算是在一开始进行的,并且在循环语句的执行之前进行。正如在清单4-3所见,通常初始化表是先初始化一个作为计数器的整型变量。.一旦进行初始化后,“for〃循环就进入第二部分:布尔表达式的计算。这里的布尔表达式可以写得很复杂,但是结果只能是true或者falseo布尔表达式通常用来验证计数器变量的状态。

.一旦布尔表达式的值为true时,就会执行〃f。J循环大括号中的语句。通常情况下,这些语句从左大括号开始,不中断地一直执行到右大括号。但在清单4-3中,有几个例外,几个〃if〃语句改变了程序的流程。第一个〃if〃语句检查〃i〃是否等于10,这里使用了〃break"语句,可在此处跳出循环,转入“for〃块后面的第一条语句的执行。第二条"if"语句使用了求余运算符,看看"i"是否能够被2整除,如果余数等于〇,就执行"continue"语句。控制将跳过循环体中余下的语句,转入下ー轮新的循环。你需要在块中正确地组织好语句,一旦满足有关条件,就执行相应的语句。.一旦程序流程遇到continue语句,或者遇到块的结尾处的右括号,就转入"for〃循环括号中的第三项:post-loop动作表,该表由逗号隔开,在〃for"块中的语句都执行完毕之后,就执行该动作表中的动作。清单4-3中的post-loop动作表中的动作很典型:计数器加1〇一旦动作表执行完毕,流程就转到对布尔表达式值进行判别。循环将继续进行

下去,直到布尔表达式的值为true。当布尔表达式的值为false,控制流程就转到〃for〃块之后的第一条语句。4.清单4-4.TheForEach循环:ForEachloop.csusingSystem;classForEachloop{publicstaticvoidMain(){string[]names={"Cheryl","Joe","Matt","Robert"};foreach(stringpersoninnames){Console.WriteLine("{0}",person);)))说明"foreach"循环列举出集合中所有的元素。清单4-4所使用的数组类型,就是这样的ー个集合。(在"System.Collections〃也可以由其他的数据类型作集合。).在Main。方法中,我们所做的第一件事是:定义由四个字符

串组成的数组names〇“foreach〃括号中的表达式是由关键字in隔开的两个项组成。in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素。该循环的运行过程如下:每一次循环时,从集合中取出ー个新的元素值,放到只读变量中去,括号中的整个表达式返回值为true,“foreach”块中的语句就能够执行。一旦集合中的元素都已经被访问到,整个表达式的值为false,控制流程就转入到〃foreach〃块后面的第一条可执行语句。在清单4-4的例子中,我们使用了字符串变量person用来存放names数组的每个元素,并且使用Console.WriteLine()方法输出person变量的值。小结到现在为止,你已经了解了〃while","do","for"和"foreach"循环语句的用法。最后你也学习了如何设置有关条件,来改变循环体块中的语句的流程。

C#教程第五课:方法作者:未知阅读人次:70564 文章来源:赢政天下发布时间:2004-9-13 网友评论()条本节课向你介绍C#的方法,其目的是:.了解方法的结构格式.了解静态和实例方法之间的区别.学会实例对象的使用.学会如何调用实例化的对象.学会方法的四种参数类型的使用.学会使用〃this〃引用以往,对于每个程序来说,所有的工作都在Main。方法中实现。这对于功能简单的程序是合适的,因为仅仅用来学习ー

些概念。有个更好的方法来组织你的程序,那就是使用方法。方法是很有用的,因为方法可以让你在不同的单元中分开设计你的逻辑模块。方法的结构格式如下:属性修饰符返回值类型方法名(参数){语句}我们将在后面的课程中,讨论属性和修饰符。方法的返回值可以是任何ー种C#的数据类型,该返回值可以赋给变量,以便在程序的后面部分使用。方法名是唯一,可以被程序调用。为使得你的代码变得更容易理解和记忆,方法的取名可以同所要进行的操作联系起来。你可以传递数据给方法,也可以从方法中返回数据。它们由大括号包围起来。大括号中的语句实现了方法的功能。1.清单5T.ー个简单的方法:OneMethod.csusingSystem;classOneMethod{publicstaticvoidMain(){

stringmyChoice;OneMethodom二newOneMethod();do{myChoice=om.getChoice();//Makeadecisionbasedontheuser'schoiceswitch(myChoice){caseA:casea:Console.WriteLine(z,Youwishtoaddanaddress.;break;caseD:cased:Console.WriteLine(''Youwishtodeleteanaddress.,,);break;caseM:casez,m:Console.WriteLine(z,Youwishtomodifyanaddress.,,);break;caseV:casev:Console.WriteLineC'Youwishtoviewtheaddresslist.;break;caseQ:caseq:Console.WriteLine(〃Bye.〃);break;default:Console.WriteLine(",{0}isnotavalidchoice,,,myChoice);}//PausetoallowtheusertoseetheresultsConsole.Write(,zPressanykeytocontinue... ;Console.ReadLine();Console.WriteLine();}while(myChoice!=〃Q'&&myChoice!=〃q〃);//Keepgoinguntiltheuserwantstoquit)stringgetChoice(){stringmyChoice;//PrintAMenuConsole.WriteLine(z,MyAddressBook\n〃);Console.WriteLineC'A-AddNewAddress");

Console.WriteLine(",D-DeleteAddress");Console.WriteLine("M-ModifyAddress");Console.WriteLine("V-ViewAddresses");Console.WriteLine("Q-Quit\n");Console.WriteLine("Choice(A,D,M,V,orQ):");//Retrievetheuser'schoicemyChoice=Console.ReadLineO;returnmyChoice;说明.清单5-1中的程序类似于第四课中的DoLoop程序。区别在于:前一课中的程序打印出菜单内容,并在Main。方法中接受用户的输入,而本课中,该功能用ー个名为getChoice。的方法实现,该方法的返回值类型是个字符串类型。在main方法中,在switch语句中用到了该串。方法、

etChoice〃实现了调用时所完成的工作。方法名后面的括号内是空的,因为调用getChoiceO方法时,不需要传递任何数据。.在方法块中,我们首先定义了变量〃myChoice”。虽然它与Main。方法中的〃myChoice”变量同名同类型,但它们是不同的两个变量,因为局部变量仅仅在其定义的块内可见。换句话说,getChoiceO方法中的〃myChoice〃同Main()方法中的〃myChoice〃变量没有丝毫联系。getChoiceO方法打印出一个菜单到控制台,并读取用户的输入。〃return〃语句把〃myChoice〃变量值返回给Main。方法中的调用者getChoiceO〇注意:"return〃语句返回类型同该方法中定义的返回值类型相同,本例中,该返回值是个字符串。.在MainO方法中,在使用getChoice0之前,实例化了一个新的〃。neMethod”对象。这是因为:我们没有指明一个〃静态〃修饰符。(注意:MainO函数带有〃静态〃修饰符),getChoiceO就成为ー个实例的方法。实例方法和静态方法的区别是:前者可以创建多个类的实例,每个实例有自己的单独的getChoiceO方法。而ー旦方法是静态的,就不存在方法的实例,你只能调用该静态方法的ー个实现。所以,正如前面所讲的,因为getChoiceO并不是静态的,所以,我们必须实例化一个新对象来使用它。这是通过定义“OneMethodom=newOneMethod()”来进行的。在等号的左边,是对象引用〃。m〃,其类型是OneMethod。〃Om〃是个对象的引用,这点很重要,〃。m〃并不是对象自身,它是个引用。neMethod类型对象的变量。在等号的右边,把新创建的OneMethod对象赋给引用〃。m〃。关键字〃new〃是个在堆上创建对象的新实例的C#运算符。此处完成的工作是:在堆上创建一个新的。neMethod实例,并把它赋给om引用。一旦有了om引用的。neMethod对象实例,就可以通过om引用来对实例进行处理。方法,域和其他类成员可以通过〃.〃(点)运算符进行访问,标识和操纵。一旦需要调用方法getChoiceO,就通过om引用,并使用点运算符〃。m.getChoiceO”来进行。getChoice0块中的语句执行完毕之后即返回。为了捕捉到getChoice()的返回值,我们使用了赋值运算符〃:〃。返回串放到了Main()函数的局部变量myChoice中,从那里,程序的其余部分按照前面课程中介绍的方式正常执行。2.清单5-2.方法参数:MethodParams.csusingSystem;classAddress{publicstringname;publicstringaddress;}classMethodParams(publicstaticvoidMain(){stringmyChoice;MethodParamsmp=newMethodParams();do{//showmenuandgetinputfromusermyChoice=mp.getChoice();//Makeadecisionbasedontheuser,schoicemp.makeDecision(myChoice);//PausetoallowtheusertoseetheresultsConsole.Write(?,Pressanykeytocontinue... ;Console.ReadLine();Console.WriteLine();}while(myChoice!ニ〃Q〃&&myChoice!=〃q〃);//Keepgoinguntiltheuserwantstoquit}//showmenuandgetuser*schoicestringgetChoice(){stringmyChoice;//PrintAMenuConsole.WriteLine(?,MyAddressBook\n〃);Console.WriteLine(",A-AddNewAddress");Console.WriteLine("D-DeleteAddress");Console.WriteLine("M-ModifyAddress");Console.WriteLine("V-ViewAddresses");Console.WriteLine("Q-Quit\n");Console.WriteLine("Choice(A,D,M,V,orQ):");//Retrievetheuser'schoicemyChoice=Console.ReadLineO;returnmyChoice;}//makedecisionvoidmakeDecision(stringmyChoice){Addressaddr=newAddress();switch(myChoice){caseA:casea:=joe”;addr.address二C#Station";this.addAddress(refaddr);break;caseD:cased:="Robert";this.deleteAddress();break;caseM:casem:="Matt";this.modifyAddress(outaddr);Console.WriteLine("Nameisnow{0}.",);break;caseV:casev:this.viewAddresses("Cheryl",Joe","Matt","Robert");break;caseQ:caseq:Console.WriteLine(〃Bye.〃);break;default:Console.WriteLine(z,{0}isnotavalidchoice^,myChoice);//insertanaddressvoidaddAddress(refAddressaddr){Console.WriteLine("Name:{0},Address:{1},addr.address);}//removeanaddressvoiddeleteAddress(stringname){Console.WriteLine(z,Youwishtodelete{0}'saddress.,name);}//changeanaddressvoidmodifyAddress(outAddressaddr){//Console.WriteLine("'Name:{0}.〃,);//causes

error!addr=newAddress();=〃Joe”;addr.address="C#Station";}//showaddressesvoidviewAddresses(paramsstring[]names){foreach(stringnameinnames){Console.WriteLine("Name:{0}",name);说明.清单5-2是清单5-1的修改,主要是对程序进行了模块化,并添加了更多的实现,以便阐述参数传递的用法。C#可以处理四种类型的参数:out(输出),ref(引用),params(数组)和value(值)。为了说明参数的用法,我们用两个字符串域创建地址类。

.在Main。方法中,我们调用getChoice。来读取用户的输入,并且把字符串放到myChoice变量中。之后,把myChoice变量作为makeDecision()函数的实在参数。在实现makeDecision。方法时,注意其形式参数为字符串myChoice〇需要再次说明的是:这是个新的myChoice变量,不同于调用者的实在参数,仅仅是适用于本方法的局部变量。因为makeDecision()方法的myChoice参数没有任何其他修饰符,故认为它是“值”参,即实在参数的值被拷贝到栈中,故作为值参的变量是局部的,任何对局部变量值的改变并不影响到调用者的实在参数的值。换句话说,值参仅仅是来自调用者的输入。.makeDecision()方法中的switch语句完成如下功能:在每种情形下,都调用相应的方法。这些方法的调用不同于Main。方法。除了使用”mp”引用,它们还使用了”this”关键字。”this"是对当前对象的引用。由于makeDecision()方法不是静态方法,当前对象已经被实例化,所以可以使用”this”引用来调用同一实例中的方法。.addAddress()方法用到了”ref”参数,即引用可作为参数来传递,即该引用被拷贝到栈中,其引用的对象同调用者的实参所引用的对象是同一个。这意味着:任何对局部引用的对象的改变也就是对调用者所引用的对象的改变。你可以想象一下,这就相当于输入/输出参数。.modifyAddress()中有一个输出参数。输出参数仅仅传递给被调用函数。一旦调用该方法时,在栈中的仅有的一个引用未被赋值,因为根据赋值的确定性原则,在该变量没有被赋值之前,就不能使用该变量。modifyAddress。方法的第一行作为注释,说明了这一点。你可以试着去掉注释符,编译ー下程序,看看结果如何。一旦该变量被赋了值,在程序返回之后,输出参数就被拷贝到调用者的参数中。所以,在方法返回之前,必须给输出参数赋值。小结C#语言的ー个很有用途的参数类型是数组参数,它须是ー维或多维的数组。在makeDecision。方法中,我们传递了用四个逗号隔开的字符串参数。参数的个数是变量。在viewAddresses()方法中,使用了foreach循环,逐一输出这些字符串。数组参数仅是ー种输入性质的参数,任何对数组参数值的改变仅仅影响到局部的副本值。概括地讲,你现在已经理解了方法的组织结构。你还了解了方法的实现可以采用的四种参数类型及其格式。一旦你使用实例方法,就必须实例化该对象,静态方法则不同,后者可以在任何时候被调用。另外,你也了解了“this”引用是如何调用实例方法的。C#教程第六课:名称空间作者:未知 阅读人次:62740 文章来源:赢政天下 发布时间:2004-9-13 网友评论(川)条本节课将介绍C#的名称空间。其目的是:.了解什么是名称空间。

.了解如何实现"using〃指示符。.了解〃alias〃指示符的用法。.了解名称空间的成员的内容。在第一课中,你已经在简单的hell。程序中看到了〃usingSystem;〃指示符的使用。该指示符可以让你使用System名称空间中的成员。在第一课中,未及对此作出详细介绍,现在我们来解释ー下名称空间的具体用法。一旦学完了本节课,你将了解〃using〃指示符及其相关内容。作为C#的元素,名称空间可以用来帮助组织程序的结构,可以避免两套代码集中命名的冲突。在程序代码中,使用名称空间是个良好的编程习惯,因为这有助于重用你的程序代码。.清单6T.TheC#StationNamespace:NamespaceCSS.cs//NamespaceDeclaration

usingSystem;//TheC#StationNamespacenamespacecsharpstation{//ProgramstartclassclassNamespaceCSS(//Mainbeginsprogramexecution.publicstaticvoidMain(){//WritetoconsoleConsole.WriteLine("ThisisthenewC#StationNamespace.");}说明清单6-1演示了如何创建一个名称空间。把单词“namespace"放在"csharp_station"之前,就创建了一个名称空间。〃csharp_station"名称空间内的大括号中包含了成员。

.清单6-2NestedNamespace1:NestedNamespacel.cs//NamespaceDeclarationusingSystem;//TheC#StationTutorialNamespacenamespacecsharpstation{namespacetutorial{//ProgramstartclassclassNamespaceCSS(//Mainbeginsprogramexecution,publicstaticvoidMain(){//WritetoconsoleConsole.WriteLineC'ThisisthenewC#StationTutorialNamespace. ;说明名称空间可以建立一个代码的组织结构。一个良好的编程习

惯是:用层次模式来组织你的名称空间。你可以把通用ー些的名称放在最顶层,里层则放置ー些专用ー些的名称。这个层次系统可以用嵌套的名称空间表示。清单6-2演示了如何建立一个嵌套的名称空间。在不同的子名称空间内放置代码,从而组织好你的代码的结构。.清单6-3.NestedNamespace2:NestedNamespace2.cs//NamespaceDeclarationusingSystem;//TheC#StationTutorialNamespacenamespacecsharpstation.tutorial{//ProgramstartclassclassNamespaceCSS(//Mainbeginsprogramexecution.publicstaticvoidMain(){//WritetoconsoleConsole.WriteLineC,rFhisisthenewC#StationTutorialNamespace.;

说明清单6-3演示了另外一种编写嵌套的名称空间的方法。在‘%sharp_station〃和〃tutorial"之间置入点运算符,表明这是嵌套的名称空间。结果同清单6-2。相比而言,清单6-3更易书写。.清单6-4.CallingNamespaceMembers:NamespaceCall.cs//NamespaceDeclarationusingSystem;namespacecsharpstation{//nestednamespacenamespacetutorial{classmyExamplel{publicstaticvoidmyPrintl(){Console.WriteLine(^FirstExampleofcallinganothernamespacemember.z,);

//ProgramstartclassclassNamespaceCallin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论