




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章程序开发基础
1.1C#语言简介1.2VisualStudio.NETIDE集成开发环境1.3第一个C#程序1.4C#程序结构1.5习题
C#是用于创建运行在Microsoft.NET公共语言运行库上的应用程序的语言之一,它从C语言和C++语言演化而来,是Microsoft专门为使用 .NET平台而创建的,并且具备了其他语言的许多优点。1.1C# 语言简介经过短短几年的发展,C# 已经成为Windows平台上软件开发的主流语言之一。C#如此受欢迎,主要是因为两个方面:首先,C#是专门为.NET而量身定制的,因而是 .NET开发的最佳语言,.NET框架提供的由一百多万行代码构建的类库也基本上由C# 实现;其次,C# 是一种基于面向对象设计方法的现代语言,如果抛开一切非技术方面的因素,C# 无疑是编程语言和企业级开发语言的集大成者。其特点为面向对象、类型安全、组件技术、自动内存管理、跨平台异常处理、版本控制、代码安全管理。
VisualStudio.NET(VS.NET)是微软针对.NET平台提供的集成的开发环境,它包含一套完整的开发工具,可以开发Windows应用程序、ASP.NETWeb应用程序、XMLWebservices和移动应用程序。1.2VisualStudio.NETIDE集成开发环境软件人员最关心的是开发效率,VS.NET的人性化界面和众多工具将成倍地提高开发效率。VisualStudio.NET是.NET平台下最为强大的开发工具,无论是软件服务商,还是企业应用程序的部署与发布,VisualStudio.NET都可以提供近乎完美的解决方案。
VisualStudio.NET提供了包括设计编码、编译调试、数据库连接操作等基本功能和基于开放架构的服务器组件开发平台、企业开发工具和应用程序重新发布工具以及性能测评报告等高级功能,VisualStudio.NET2005集成开发环境的操作界面如图1-1所示。图1-1VisualStudio.NET2005集成开发环境
Microsoft公司提供了4种VisualStudio.NET语言:C++.NET、C#、VisualJ# 和VisualBasic.NET。无论选择何种语言来创建、测试和部署应用程序,其集成开发环境都是相同的。实际上,VisualStudio.NET允许用户先使用一种语言创建一部分应用程序,然后使用另一种语言创建应用程序的其他部分。
每一种VisualStudio.NET语言都提供相近的功能,选择使用哪一种语言不但取决于该语言的特性,还取决于开发者的喜好,实际上具体选择何种语言是无关紧要的。
【例1-1】编写、编译和运行一个简单的C# 应用程序,该程序在屏幕上输出“你好!”,运行效果如图1-2所示。1.3第一个C#程序图1-2例1-1运行效果
(1)打开VisualStudio.NET开发环境IDE。
(2)在菜单中,单击“文件”→“新建”→“项目”,弹出“新建项目”对话框。
(3)在左边“项目类型”列表框中选择“VisualC#”下的Windows;在右边“模板”列表框中选择“控制台应用程序”选项;在“名称”文本框中输入项目名,本处可输入“firstApp”;在下面的“位置”下拉列表框中输入该项目的保存路径。开发者可视具体情况输入或利用右边的“浏览”按钮来选择项目的保存路径,本处选择“C:\zz”,如图1-3所示。图1-3“新建项目”对话框
(4)单击“确定”按钮,系统自动产生了一个名为Program.cs的文件,并直接进入了编辑器窗口,系统自动生成一个代码框架。
(5)为编写一个简单的C# 程序,可先删除Program.cs文件已有的内容,输入如下代码:usingSystem;
namespaceHelloWorld
{
classHelloWorldApp
{
staticvoidMain(string[]args)
{
Console.WriteLine("你好!");//输出你好!
}
}
}
(6)编辑好C# 代码后,单击“保存”按钮,保存此Program.cs文件。
(7)在菜单中选择“调试”→“开始执行(不调试)”命令,系统编译和运行该项目,并自动打开一个输出窗口。
提示:
如果有误,在IDE下方可以查看错误信息,如图1-4所示,在错误报告信息框中的某条错误信息上双击,光标会跳到编辑窗口中与之对应的那条出错语句上,以便进行修改。图1-4“错误列表”窗口在编写C#代码之前,应该了解这门语言的结构。
程序结构指定了构成应用程序的必要元素,并且详细说明了如何组织这些元素,以使编译器能够识别应用程序的代码。下列代码说明了C# 应用程序的基本结构:1.4C#程序结构usingSystem;
namespaceHelloWorld
{
classHelloWorldApp
{
staticvoidMain(string[]args)
{
Console.WriteLine("你好!");//输出你好!
}
}
}以下是对上述代码中的元素和组织原则的简要描述:
(1) using关键字。using关键字可以引用Microsoft.NET框架类库中的现有资源。通常,在程序文件的开头使用这个关键字。通过多次使用该关键字,程序可以引用多种资源。
(2) System命名空间。System命名空间提供了对构建应用程序所需的所有系统功能的访问。程序中用到的类Console在命名空间System中定义。
(3)类。在C# 或其他任何面向对象语言的编程过程中,都需要编写类,并用类来创建对象。例如,classHelloWorldApp语句定义了一个名为HelloWorldApp的类。
(4) Main方法。Main方法用来描述类的行为。上面示例中的staticvoidMain是一个全局方法,指编译器从该处开始执行应用程序,是程序运行的入口。需要注意的是,每个C#应用程序都必须在组成程序的某一个类中包含Main方法。
(5)语句。语句就是在C# 应用程序中执行操作的指令。语句之间用分号分隔,编译器通过分号来区分它们。在C# 中,可以在一行中包含多条语句,也可以将一条语句拆分到多行中。尽管把一条长语句拆分为几行可能会提高可读性,但仍然推荐每行仅写一条语句。
(6)大括号。大括号“{”和“}”用于在应用程序中标识某个代码块的开始和结束,从而可以用来对语句进行分组。每个左括号必须要有与之对应匹配的右括号。大括号可以嵌套,以表示应用程序中的不同层次。
在上面的示例中,classHelloWorldApp之后的大括号限定了HelloWorldApp类的范围。在Main之后的大括号限定了Main方法中的语句的范围。
(7)区分大小写。C# 语言区分大小写,也就是说,编译器区分大写字符和小写字符。例如在应用程序中,code、Code和CODE是不同的变量名,相互不能替代。
(8)注释。注释在运行时不会被执行,而只用于说明程序,便于程序员理解。在双斜杠(//)之后可书写不跨行的注释。
若注释很长,并跨越多行,那么就可以用另外一种方法,即用斜杠加星号(/*)来表示注释的开始,用星号加斜杠(*/)来代表注释的结束,如:/*
这是一个
多行注释的示例
*/
1.解释C#程序的基本结构。
2.编写程序,在屏幕上输出“欢迎学习C#程序设计!”。1.5习题第2章数据类型与运算符
2.1变量2.2常量2.3数据类型2.4运算符和表达式2.5习题
2.1.1变量名
和其他高级语言一样,用来标识变量名、常量名、对象名、过程名等的有效字符序列称为标识符,简单地说,标识符就是一个名字。C# 对变量命名的最低要求是它应该能标识并区别变量类型、变量作用范围、常量、对象以及过程,并且它应当便于理解和使用。2.1变量在C# 中,变量名必须遵守以下规则:
●首字符必须是字母,或下划线(但不推荐)。
●第2个字符开始可以是任意字母、数字和下划线,但不能包含空格、标点符号、运算符等其他符号。
●变量名不能与C# 中的类库名相同。
● C# 区分大小写,所以year、Year和YEAR代表了3个不同的变量。
变量名不能与C# 关键字名相同,关键字是C# 语言的特殊标识符,用户最好不要使用,否则容易降低程序的清晰度。如果一定要用C# 语言中的关键字作为标识符,应使用“@”字符作为前缀。以下是一些C# 变量名:
Person(合法)yearly-cost(合法)name(合法)_Debug(合法)Max_Size(合法)
float(非法,是一个C# 关键字)5day(非法,第1个字符是数字)2.1.2变量声明
程序中所有用到的变量都必须在程序中定义,即遵守“先定义后使用”,或“先声明后使用”的原则。
定义(声明)变量的作用是:定义的变量名和数据类型将告诉编译器要为变量分配多少内存空间,以及变量中要存储什么类型的值。因为针对不同类型的数据,计算机将会为其分配不同大小的存储空间。有了变量名和变量类型,一个变量的定义才是完整的。定义变量的一般格式:
[访问修饰符]数据类型变量名[=初始值];其中:
● []内的内容可有可无,可根据需要添加。
● “修饰符”是指访问修饰符。
● “数据类型”是指变量的类型。
● “变量名”是给变量取的名称。
例如:
intnumber; //声明一个整型变量
boolopen; //声明一个布尔型变量
decimalbankBlance;//声明一个十进制变量
可以一次声明多个变量,变量名之间用逗号分隔,例如:
sbytea,b; //声明两个有符号字节型变量
inta=6,b=12,c=24;2.1.3给变量赋值
变量的值表示变量的名称所指向的内存空间中所存储的内容。变量必须先定义后使用,使用之前必须赋值。变量赋值就是将数据保存到变量中的过程。变量在定义时既可以赋值也可以不赋值,在定义时直接对变量赋值是良好的编程习惯。如果在定义时没有赋值,可以在程序代码中使用赋值语句直接对变量进行赋值。在C# 中,给一个变量赋值语句的格式如下:
变量名=表达式;
这里的表达式可以是数学表达式,在计算机语言中,单个常数或变量,也可算作一个表达式,由单个常数或变量构成的表达式的值,就是这个常量或变量本身。
变量赋值语句的功能是:计算表达式的值,然后将这个值赋予变量。举例:
intage=26; //定义变量age,并在定义时直接对变量赋值,变量的值为26
intage; //定义变量age,但在定义时没有对变量赋值,变量没有值
age=26; //使用赋值语句直接对变量age进行赋值,变量的值为26
在程序中,可以给一个变量多次赋值,变量的当前值等于最后一次给该变量所赋的值。例如:
intnumber;
number=32; //为变量赋值32
intnum=5; //定义一个int型变量num,并将其赋予初始值5【例2-1】变量使用。
usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
intnum1,num2; //声明两个整型变量num1、num2
num1=10; //把10赋给num1
num2=num1+1; //把变量num1的值加1再赋给变量num2
Console.WriteLine(num2); //输出num2变量的值
}
}
运行结果如图2-1所示。图2-1例2-1运行结果
【例2-2】己知圆的半径Radius = 2.5,计算圆的面积(PI = 3.14159)。
usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
doubleRadius=2.5,Area;//声明double类型变量Radius与Area
Area=Math.PI*Radius*Radius;
Console.WriteLine(“面积={0}”,Area);
}
}
运行结果如图2-2所示。图2-2例2-2运行结果同变量不同,常量(Constant)是指在程序的运行过程中值不能改变的量。常量与变量都是数据的存储符号,区别在于存放在变量中的值是可变的,而存放在常量中的值是不变的。
(1)整型常量。整型常量即整数,整型常量有以下三种形式:
十进制形式,即通常意义上的整数,如123,48910等。
八进制形式,输入八进制整型常量,需要在数字前面加“0”,如0123、038等。
十六进制形式,输入十六进制整型常量,需要在数字前面加“0x”或“0X”,如0x123、0X48910等。2.2常量
(2)实型常量。实型常量即带小数的数值,实型常量有以下两种表示形式:
小数形式,即人们通常的书写形式,如0.123、12.3、.123等。
指数形式,也叫科学记数,由底数加大写的E或小写的e再加指数组成,例如,123e5或123E5。
(3)字符常量。字符常量是用单引号 '
'括起来的一个字符。如 's'、'x'、'¥'等都是字符常量。
在表示一个字符常量时单引号内的有效字符数必须且只能是一个,并且不能是单引号或反斜杠( \ )。
在C# 中,有些字符具有特殊的含义,这时不能直接放在单引号中作为字符常量,而需要使用转义符来表示。转义符由反斜杠(\)加字符组成,如 '\n' 代表一个“换行”符。表2-1列出一些常见转义符。表2-1转义符【例2-3】转义符的使用。
usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
Console.WriteLine("Thisisa\ttest\n");
Console.WriteLine("\'Hello\'");
}
}
运行结果如图2-3所示。图2-3例2-3运行结果
(4)字符串常量。字符串常量是由一对双引号界定的字符序列,例如:
"欢迎使用C#!"
"Iamastudent."
需要注意的是,即使是由双引号界定的一个字符,也是字符串常量,不能当做字符常量看待,例如,'A' 与 "A",前者是字符常量,后者是字符串常量。
(5)布尔常量。布尔常量即布尔值本身,如前所述,布尔值true(真)和false(假)是C# 的两个关键字。2.3.1整数类型
整数类型是指那些没有小数部分的数字,包括整数常量和整数变量。
整数常量即整数类型的常数,一般包括以下两种形式:
●十进制数:348、-56、0等。
●十六进制数:这类数据以“0x”(其中“0”是数字0)开头,如0x61,相当于十进制数据97。2.3数据类型整数类型又分有符号整数与无符号整数。有符号整数可以带正负号,无符号整数无需带正负号,默认为正数。
顾名思义,整数类型的变量的值为整数。数学上的整数可以从负无穷大到正无穷大,但是由于计算机的存储单元是有限的,所以计算机语言提供的整数类型的值总是在一定的范围之内。根据变量在内存中所占的二进制位数不同和是否有符号位,C# 语言中整数类型分为八种:字节型(sbyte)、无符号字节型(byte)、短整型(short)、无符号短整型(ushort)、整型(int)、无符号整型(uint)、长整型(long)、无符号长整型(ulong)。所占的二进制位数不同,表示的数值的取值范围也不同,所占的二进制位数越多,表示的数值的取值范围越大。比如说8位整数,它可以表示28个数值,即256个不同的数值,如果用来表示有符号8位整数(sbyte),其取值范围就是在-128到127之间,而如果用来表示无符号8位整数(byte),其取值范围就是在0到255之间。各整数类型及其取值范围见表2-2。表2-2整数类型及其取值范围2.3.2字符类型
可使用关键字char来定义字符类型数据。char类型的变量占用2个字节的内存,其中存储的数字(对应某个ASCII码或Unicode码)被解释为一个字符。
字符变量用来存放字符常量,请注意只能放一个字符,例如:
charch1='a';
charch3=(char)97;//97是字符a对应的ASCII码
【例2-4】输出26个大写字母。大写字母的ASCII码范围为65~90,小写字母的ASCII码范围为97~122。
usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
intnum;
charch;
for(num=65;num<=90;num=num+1)
{
ch=(char)num;//将整数转换为字符
Console.WriteLine("{0}is{1}",num,ch);
}
}
}
运行结果如图2-4所示。图2-4例2-4运行结果2.3.3浮点数类型
(1) float型(单精度类型)。
float数据类型使用4个字节的内存来存储数字。
注意:
floattestfloat=23.03;
这样写是错误的,因为C# 中默认的数值数据类型为double,数字后必须加上F。长类型到短类型的转换需要强制进行。float型的正确写法如下:
floattestfloat=23.03F;
(2) double型(双精度类型)。
double类型的变量占用8个字节的内存,double型精度为15~16位有效数字。
【例2-5】从键盘输入两个浮点数,然后输出这两个数相加的结果(要求小数后取4位)。
usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
floatf1,f2;
strings;
Console.WriteLine("请输入浮点数1:");
s=Console.ReadLine();//从键盘读入字符串
f1=Convert.ToSingle(s);//将字符串转换为float类型
Console.WriteLine("请输入浮点数2:");
s=Console.ReadLine();
f2=Convert.ToSingle(s);
Console.WriteLine("{0}+{1}={2:F4}",f1,f2,f1+f2);
}
}
运行结果如图2-5所示。图2-5例2-5运行结果2.3.4布尔类型
布尔类型是一种用来表示“真”和“假”的逻辑数据类型。布尔类型的变量占用1个字节的内存。布尔类型变量只有两种取值:true代表“真”,false代表“假”,true或false是C# 关键字,例如:
boolisExist=false;
boolb=(i>0&&i<10);
【例2-6】使用布尔类型。
usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
boolb;
b=false;
Console.WriteLine("bis{0}",b);
b=true;
Console.WriteLine("bis{0}",b);//一个布尔值能够控制if语句
if(b)
Console.WriteLine("bisTrue");
else
Console.WriteLine("bisFalse");
//关系运算符的结果是一个布尔值
Console.WriteLine("10>9is{0}",(10>9));
}
}
运行结果如图2-6所示。图2-6例2-6运行结果2.3.5字符串类型
字符串类型的变量是由关键字string来定义的,它是类System.String的别名。
字符串类型也有常量和变量之分。字符串变量由关键字string来定义,而字符串常量和字符常量很相似,所不同的就是字符常量是用单引号 '' 来表示,而字符串常量要用双引号""表示。另外,一个字符常量只能由一个字符组成,而字符串常量可以由一个或多个字符组成。
除了上述描述的字符串常量的形式外,还可以指定一种逐字字符串常量。逐字字符串常量以@开始,引号内的内容可以包含新行、制表符等,而不必使用转义序列。唯一的例外是,如果要在文本中要包含双引号",就必须在一行中使用一对双引号"",如:
Stringstr=@"Hello\world";【例2-7】使用字符串数据类型。
usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
stringa="Hello"; //定义字符串并赋值
stringb="world";
stringc;
c=a+b; //连接a、b字符串
Console.WriteLine(c);
Console.WriteLine(c.Length); //输出字符串的长度
}
}
运行结果如图2-7所示。图2-7例2-7运行结果应用程序使用运算符来处理用户输入的数据,运算符(如+和--)用于处理变量并返回值。运算符是一组用于计算或比较的一个或多个字符,运算符可以将一个或多个数据值(称为操作数)转换成新的数据值。
表达式(expression)是可以进行运算并能够产生值的式子,是操作数与运算符按照一定的规则进行的组合,计算的结果称为此表达式的值。操作数是运算的对象,可以是任意常量、变量、方法等。运算符是具体要执行的操作。下面是表达式的示例:2.4运算符和表达式
doublePi=3.1415926;
doubler=10.0;
doublearea;
area=Pi*r*r;
上面的示例中声明了圆周率Pi的值为3.141 592 6,圆半径r的值为10.0,圆的面积area为Pi*r*r,Pi*r*r就是一个表达式,计算出来的结果314.159 26就是该表达式的值。2.4.1赋值运算符及其表达式
赋值运算就是给一个变量赋一个新值。赋值运算符的左操作数必须是一个变量。
表2-3列出了操作符的用法并描述了常用的赋值操作符。表2-3常用的赋值操作符【例2-8】赋值运算。
usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
intop1=10;
intop2=20;
intresult;
result=op1+op2;
Console.WriteLine(result);
result+=10;//相当于result=result+10;
Console.WriteLine(result);
}
}
运行结果如图2-8所示。图2-8例2-8运行结果2.4.2算术运算符及其表达式
算术运算符包括基本算术运算符
+、-、*、/、%
和一元操作符自加、自减运算符“++、--”等。算术表达式就是用算术运算符将操作数连接起来的算式。
表2-4描述了常用的算术操作符。表2-4常用的算术操作符一元操作符用于增加或减少操作数1,表2-5说明了增加和减少操作符的用法。
注意前置操作符与后置操作符的不同:
● Y=++(或--)x:先将x值做 ++(或--)运算,再赋值给y;
● y=x++(或--):先将x值赋给y,再将x值做 ++(或--)运算。表2-5增加和减少操作符的用法【例2-9】加法运算。
usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
Console.WriteLine(8+8); //数字加法
Console.WriteLine("8+0.8"); //字符串原样输出
Console.WriteLine("a"+"a"); //字符串加法
Console.WriteLine(8.3+"a"); //混合类型相加
Console.WriteLine(8+'a'); //字符和数字混合相加
Console.WriteLine(8.3+'a'); //数字和字符相加
}
}
运行结果如图2-9所示。图2-9例2-9运行结果由此例可见:
●参与运算的操作数都是数字时,加法运算同一般的数学运算是一致的。
●参与运算的操作数都是字符串时,相加的结果是两字符串连接在一起。
●参与运算的操作数分别是数字和字符串时,得到的结果是将数字转变为字符串,然后将两个字符串连接在一起。
●参与运算的操作数分别是数字和字符时,则运算的结果是将字符常量对应的Unicode编码数值同数字进行加法运算得到的。【例2-10】自增和自减运算。
usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
doublex;
x=1.5;
Console.WriteLine(++x); //自增运算,x先加1再输出
x=1.5;
Console.WriteLine(x++); //自增运算,x先输出再加1
x=1.5;
Console.WriteLine(--x); //自减运算,x先减1再输出
x=1.5;
Console.WriteLine(x--); //自减运算,x先输出1再减
}
}
运行结果如图2-10所示。图2-10例2-10运行结果【例2-11】己知a = 1,b = 2,c = 3,x = 2,计算y = a*x^2 + bx + c之值。
usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
inta=1,b=2,c=3,x=2,y;
y=a*x*x+b*x+c;
Console.WriteLine("y={0}",y);
}
}
运行结果如图2-11所示。图2-11例2-11运行结果【例2-12】取余运算。
usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
Console.WriteLine(0%2);
Console.WriteLine(1%2);
Console.WriteLine(5%2);
}
}
运行结果如图2-12所示。图2-12例2-12运行结果2.4.3关系运算符及其表达式
关系运算可以理解为是一种“判断”,判断的结果要么是“真”,要么是“假”,也就是说关系表达式的返回值总是布尔类型。
C# 语言提供的关系运算符有以下六个:
==!=<<=>>=
由操作数和关系运算符组成的表达式就是关系表达式。
关系运算符用于比较两个值并且在比较结果的基础上执行某个操作,表2-6介绍了常用的比较操作符的用法。表2-6常用的比较操作符2.4.4逻辑运算符及其表达式
逻辑运算符是用来进行布尔表达式计算的。在C# 语言中提供的逻辑运算符主要有三种:逻辑与“&&”、逻辑或“||”和逻辑非“!”。逻辑运算符对表达式a和b的操作见表2-7。表2-7逻 辑 运 算 表
(1) “&&”运算。
“&&”运算符表示逻辑与,它用于判断是否同时满足两个或两个以上的条件。其操作数可以是布尔类型变量或关系表达式。例如,在数学中,判断变量x是否在开区间(1,10)中,C# 语句可表示为
If(x>1)&&(x<10);
如果变量y的值为true,则表明变量x的值在开区间(1,10)。
“&&”的短路特性:在一个与操作中,如果第一个操作数是假,则不管第二个操作数是什么值,结果都是假。
(2) “||”运算。
“||”运算符表示逻辑或,用来判断是否满足两个或两个以上的条件之一,其操作数可以是布尔类型变量或关系表达式。例如,判断变量x是否满足小于1,或者大于10,其C# 语句可写为:
Booly=(x<1)||(x>10);
如果变量y的值为true,则表明变量x的值或者小于1,或者大于10。
“||”的短路特性:在一个或操作中,如果第一个操作数是真,则不管第二个操作数是什么值,结果都是真。
(3) “!”运算。
“!”运算符是一个一元运算符,表示逻辑非。同样,其操作数可以是布尔类型变量或者关系表达式。例如判断变量x是否不小于100时,C# 语句可写为
booly=!(x<100);
如果变量y的值为true,则表明变量x的值不小于100。2.4.5条件运算符及其表达式
条件运算符“?:”是唯一的一个三目运算符,它需要3个操作数。条件运算表达式的一般格式为:
关系表达式?表达式1:表达式2;
功能:如果关系表达式的值是true,则条件运算表达式得到的值为表达式1的值,否则为表达式2的值。【例2-13】条件运算符。
usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
inta=20;
intb=50;
intmax=(a>b)?a:b;
Console.WriteLine("较大值为{0}",max);
}
}
运行结果如图2-13所示。图2-13例2-13运行结果2.4.6位运算符及其表达式
位运算是指进行二进制位的运算。在系统软件中,经常要处理一些二进制位的问题。例如在进行计算机之间的通信时,需要通过某些标志位来判断通信是否成功等。
位运算符包括:&(位与)、^(位异或)、l(位或)和~(位反)以及进行位移动操作的运算符<<(左移)、>>(右移)。参与位运算的操作数可以是整数类型的变量或者是常数。
(1)按位与运算。
参与运算的两个二进制数,如果相应位都是1,则结果是1,否则为0,即:
0&0 = 0,0&1 = 0,1&0 = 0,1&1=1
(2)按位或运算。
参与运算的两个二进制数,如果相应的位只要有一个为1,则结果是1,否则为0,即:
0|0 = 0,0|1 = 1,1|0 = 1,1|l = 1
(3)按位异或运算。
参与运算的两个二进制数,如果相应位的值相异,则结果为1;相应位的值相同,则结果为0,即:
0^0 = 0,0^1 = 1,1^0 = 1,1^1=0
(4)按位取反运算。
这是个一元运算。如果二进制数的某位为1,则结果为0;某位为0,则结果为1,即:
~0 = 1,~1 = 0
例如:对0100101010001101取反,结果为1011010101110010。
(5)移位运算。
左移运算是将一个二进制数的各位向左移若干位;而右移运算是将一个二进制数的各位向右移若干位。
例如:
A=a<<2;//表示将a的二进制数各位左移2位,右补0。对无符号数,高位左移后溢出,舍弃
A=a>>2;//表示将a的各二进制位右移2位,移出右端的低位被舍弃。对无符号数,高位补02.4.7各种简单类型的数据间转换
1.隐式类型转换
隐式类型转换是由编译器根据不同类型数据间转换的规则自动完成的,又称为自动转换。隐式转换仅适用于那些不用仔细检查即可安全实现的转换,隐式数值转换实际上就是从低精度的数值类型向高精度的数值类型的转换。简单类型间所有可能的隐式转换规则如下:
(1)从sbyte类型到short、int、long、float、double或decimal类型。
(2)从byte类型到short、ushort、int、uint、long、ulong、float、double或decimal类型。
(3)从short类型到int、long、float、double或decimal类型。
(4)从ushort类型到int、uint、long、ulong、float、double或decimal类型。
(5)从int类型到long、float、double或decimal类型。
(6)从uint类型到long、ulong、float、double或decimal类型。
(7)从long类型到float、double或decimal类型。
(8)从ulong类型到float、double或decimal类型。
(9)从char类型到ushort、int、uint、long、ulong、float、double或decimal类型。
(10)从float类型到double类型
对于上述没有列出的数值类型转换,如要进行赋值,编译器将会报错。【例2-14】隐式类型转换。
usingSystem;
classProgram
{
publicstaticvoidMain()
{
intx=42;
shorts=12;
inty;
longl;
floatf;
doubled;
floatPI=3.14159F;
l=x; //int转换为long
d=PI; //float转换为double
y=s; //short转换为int
f=l; //long转换为float
}
}
2.显式类型转换
显式转换也叫强制转换,是在代码中明确指示将某一类型的数据转换为另一种类型。显式转换的一般格式为:
(类型名)变量或表达式;
例如:
inti,h;
floatj=4.5F;
i=(int)j;//强制变量j为整型,结果输出i=4
h=j;//隐式转换,非法,无法通过编译【例2-15】显式类型转换。
usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
inti;
floatw=9.999f;
i=(int)w; //float强制转换为int,截掉所有的小数位
Console.WriteLine(i);
Console.WriteLine(Math.Round(w)); //Math.Round(w)返回w四舍五入的结果
}
}
运行结果如图2-14所示。图2-14例2-15运行结果
3.使用方法进行数据类型的转换
(1) ToString方法。
ToString方法可将其他数据类型的变量值转换为字符串类型。ToString方法的使用格式为:
变量名称.ToString();
例如:
intx=123;
strings=x.ToString();
(2) Parse()方法。
ToString方法用来将变量转换为相应格式的字符串,而Parse()方法则可以将字符串转换为数值类型数据。调用Parse()方法的常用格式为:
publicstatic数据类型.Parse(strings);【例2-16】数字和字符串的相互转换。
usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
inta;
doubled;
stringstr;str=Console.ReadLine(); //控制台输入整数数字字串
a=int.Parse(str); //将字串转换为整数
Console.WriteLine(a+11);
str=Console.ReadLine(); //控制台输入双精度数字字串
d=double.Parse(str); //将字串转换为双精度数
Console.WriteLine(d+0.11);
}
}
运行结果如图2-15所示。图2-15例2-16运行结果
(3) Convert类。
System命名空间中有一个用于将某个基本数据类型转换为另一个基本数据类型Convert类。Convert类包含了大量将数据转换为不同数据类型的静态方法,可直接使用以下语句格式调用:
Convert.方法名(原数据变量);举例如下:
//将string值转换为boolean值
stringMyString="true";
boolMyBool=Convert.ToBoolean(MyString); //MyBool=true
//将数字字符的字符串转换为Int32值
stringnewString="123456789";
intMyInt=Convert.ToInt32(newString); //MyInt=123456789
//进行四舍五入的转换
doubleMyDouble=42.72;
intMyInt=Convert.ToInt32(MyDouble); //MyInt=432.4.8运算符的优先级
当表达式中包含多个运算符时,运算符的优先级控制各运算符的计算顺序。例如,表达式x+y*z按x+(y*z)计算,因为 * 运算符具有的优先级比+运算符高。表2-8按照从最高到最低的优先级顺序概括了所有的运算符。表2-8运算符优先级表一、选择题
1.以下的
用来表示换行字符。
A.\b B.\f C.\v D.\n
2.下列语句在控制台上的输出是
。
stringmsg=@“Hello\nWorld!”;
System.Console.WriteLine(msg);
A. Hello\nWorld!
B. @“Hello\nWorld!”
C. HelloWorld!
D. Hello World!
2.5习题
3.
被用来放在其他字符串末尾使这些字符串连成一串。
A.加号(+)
B.减号(-) C.问号(?) D.星号(*)
4.在C# 中,将路径名“C:\Documents\”存入字符串变量path中的正确语句是
。
A. path=“C:\\Docments\\”; B. path=“C://Document//”;
C. path=“C:\Document\”; D. path=“C:\/Document\/”;
5.C# 中每个bool类型量占用
个字节的内容。
A. 4 B. 2 C. 8 D. 1
6.C# 中每个char类型量占用
个字节的内容。
A. 1 B. 2 C. 4 D. 8
7.C# 中每个int类型的变量占用
个字节的内存。
A. 1 B. 2 C. 4 D. 8
8.在C# 中,表示一个字符串的变量应使用以下的
定义。
A. CStringstr; B. stringstr;
C. dimstrasstring; D. char*str;
9.
操作符仅在两个条件都是真时表达式的结果是真。
A. && B. || C. >= D. !=
10.
是Console.Readline()函数接受值。
A. int B. float C. bool D. String
二、编程题
1.从键盘输入物品名、价格和数量,计算总价格并显示结果。
2.从键盘输入两个整数,输出较大值。第3章程序控制语句
3.1使用分支3.2使用循环3.3学生成绩管理系统的菜单3.4习题3.1.1if语句
1.单独if语句
if(布尔表达式)
{
语句块;
}
功能:如果表达式的值为真(即条件成立),则执行if语句所控制的语句块;如果表达式的值为假(即条件不成立),则直接执行语句块后面的语句。这种语句结构的控制流程如图3-1所示。3.1使用分支图3-1if语句控制流程【例3-1】输入两个整数,输出其中较大的整数。
usingSystem;
classProgram
{
publicstaticvoidMain(String[]args)
{
intnum1,num2,max;
Console.Write("请输入数值1:");
num1=int.Parse(Console.ReadLine());
Console.Write("请输入数值2:");
num2=int.Parse(Console.ReadLine());
max=num1;
if(num2>num1)
max=num2;
Console.WriteLine("较大值为:{0}",max);
}
}
程序运行结果如图3-2所示。图3-2例3-1运行结果
2. if…else语句
if(布尔表达式)
{
语句块1;
}
else
{
语句块2;
}
功能:如果表达式成立,则执行语句块1,然后执行语句块3;如果表达式不成立,则跳过语句块1,执行语句块2,然后执行语句块3。这种语句结构的控制流程如图3-3所示。图3-3if...else语句流程【例3-2】输入两个整数,输出其中较大的整数。
usingSystem;
classProgram
{
publicstaticvoidMain(String[]args)
{
intnum1,num2;
Console.Write("请输入数值1:");
num1=int.Parse(Console.ReadLine());
Console.Write("请输入数值2:");
num2=int.Parse(Console.ReadLine());
if(num1==num2)
Console.WriteLine("两数相等");
else
{
if(num1>num2)
Console.WriteLine("较大值为:{0}",num1);
else
Console.WriteLine("较大值为:{0}",num2);
}
}
}
运行结果如图3-4所示。图3-4例3-2运行结果
【例3-3】输入一个数字,如果为偶数,则输出“偶数”,否则输出“奇数”。
usingSystem;
classProgram
{
publicstaticvoidMain(String[]args)
{
Console.Write("请输入一个整数:");
intx=int.Parse(Console.ReadLine());
if(x%2==0)
{
Console.WriteLine("{0}是偶数",x);
}
else
{
Console.WriteLine("{0}是奇数",x);
}
Console.ReadLine();
}
}
运行结果如图3-5所示。图3-5例3-3运行结果
【例3-4】输入一个年份,判断是否为闰年。如果年份可以除尽4并且不能除尽100,或者可除尽400,则其为闰年。
usingSystem;
classProgram
{
publicstaticvoidMain(String[]args)
{
intnYear;
Console.Write("请输入年份:");
nYear=int.Parse(Console.ReadLine());
if((nYear%4==0&&nYear%100!=0)||nYear%400==0)
Console.WriteLine("是闰年");
else
Console.WriteLine("不是闰年");
}
}
运行结果如图3-6所示。图3-6例3-4运行结果
3. if…elseif…else语句
有些问题的解决方式并不是非此即彼的两个选择,而是由许多复杂的前提条件决定的。这种情况下,可以使用如下格式的if…elseif…else语句:
if(布尔表达式1)
{语句块1;}
elseif(布尔表达式2)
{语句块2;}
elseif(布尔表达式n-1)
{语句块n-1;}
else
{语句块n;}功能:当表达式1为真时,执行语句块1,然后跳过整个结构执行下一个语句;当表达式1为假时,跳过语句块1去判断表达式2。若表达式2为真时,执行语句块2,然后跳过整个结构去执行下一个语句;若表达式2为假时,则跳过语句块2去判断表达式3。依次类推,当表达式l、表达式2、……、表达式n-1都为假时,则执行else中的语句块n。
在这种阶梯形式的if结构中,最后的else语句经常作为缺省条件。就是说如果所有其他条件测试都失败,那么最后的else语句会被执行,流程如图3-7所示。
在实际应用中,elseif语句可以多次使用,但是else语句只有一个。图3-7if...elseif...else语句流程
【例3-5】输入学生的成绩,根据分数输出优(90~100)、良(80~90)、中(70~80)、及格(60~70)和不及格(0~60)。
usingSystem;
usingSystem.IO;
classProgram
{
publicstaticvoidMain(String[]args)
{
intscore;
stringgrade;
Console.Write("请输入学生的成绩:");
score=Int32.Parse(Console.ReadLine());if(score>=90)
grade="优";
elseif(score>=80)
grade="良";
elseif(score>=70)
grade="中";
elseif(score>=60)
grade="及格";
else
grade="不及格";
Console.WriteLine("该学生的考试成绩等级为:{0}",grade);
}
}
运行结果如图3-8所示。图3-8例3-5运行结果3.1.2switch语句
当分支情况很多时,虽然if…elseif…else语句可以实现,但多层的嵌套会使程序变得冗长且不直观。针对这种情况,C#提供了switch语句,用于处理多分支的选择问题。
switch语句的一般形式:
switch(控制表达式)
{
case常量表达式1:
语句块1;
break;
case常量表达式2:
语句块2;
break;
case常量表达式n:
语句块n;
break;
default:
语句块n+1
break;
}
switch语句基于控制表达式的值选择要执行的语句分支,语句的执行过程如下:
(1)控制表达式求值。
(2)如果case标签后的常量表达式的值等于控制表达式的值,则执行其后的内嵌语句。
(3)如果常量表达式的值不等于控制语句的值,则执行default标签后的内嵌语句。在使用时要注意以下几点:
●表达式的值必须是整型数值、字符或字符串,并且要与各个语句中case之后的常量值类型相同。
●一个switch语句中可以有任意多个case语句,case语句中的子语句体可以是一条或者多条任意语句。
●一般情况下,每个case语句的最后是break语句,用来从整个switch语句中跳出,继续执行switch语句下面的语句。如果没有使用break语句,则继续执行下面case语句中的子语句体,直到遇到break语句,或者整个switch语句结束。【例3-6】使用switch语句,实现对成绩等级的评定。
usingSystem;
classProgram
{
publicstaticvoidMain(String[]args)
{
Console.Write("请输入成绩:");
//从键盘接收一行字符
stringstr=Console.ReadLine();
//转换为整型
inti=Int32.Parse(str.Trim());
if(i>100||i<0){
Console.WriteLine("成绩不在0~100范围内");
}
else
{
switch(i/10)
{
case10:
Console.Write("满分");
gotocase9;
case9:
Console.WriteLine("优秀");
break;
case8:
Console.WriteLine("良好");
break;
case7:
Console.WriteLine("中等");
break;
case6:
Console.WriteLine("及格");
break;
default:
Console.WriteLine("不及格");
break;
}
}
Console.ReadLine();
}
}
运行结果如图3-9所示。图3-9例3-6运行结果
【例3-7】编写一个程序以识别用户输入的字符是元音(a、e、i、o、u)还是辅音。
usingSystem;
classVowelConsotant
{
staticvoidMain(string[]args)
{
charch;
Console.Write("请输入一个字母:");
ch=Convert.ToChar(Console.ReadLine());
switch(ch)
{
case'a':
case'e':case'i':
case'o':
case'u':
Console.WriteLine("{0}是元音",ch);
break;
default:
Console.WriteLine("{0}是辅音",ch);
break;
}
Console.ReadLine();
}
}
运行结果如图3-10所示。图3-10例3-7运行结果
【例3-8】编写一个简单计算器的程序,计数器应该能够执行加、减、乘、除等算术操作。
usingSystem;
classCalculation
{
staticvoidMain(string[]args)
{
Console.WriteLine("主菜单");
Console.WriteLine("1.加法");
Console.WriteLine("2.减法");
Console.WriteLine("3.乘法");
Console.WriteLine("4.除法");
Console.Write("请选择运算1-4:");
charoption=Convert.ToChar(Console.ReadLine());Console.Write("输入第一个数:");
intnum1=Convert.ToInt32(Console.ReadLine());
Console.Write("输入第二个数:");
intnum2=Convert.ToInt32(Console.ReadLine());
intresult;
switch(option)
{
case'1':
result=num1+num2;
Console.WriteLine("结果为:"+result);
break;
case'2':
result=num1-num2;
Console.WriteLine("结果为:"+result);
break;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CQAP 3005-2023大兴安岭地产中药材金莲花质量规范
- T/CPQS F003-2020软体办公家具环保等级评价技术要求
- T/CNFMA B025-2023园林绿化机械以锂离子电池为动力源的手持式绿篱修剪机
- T/CNFMA A006-2024木工刀具木工金刚石圆锯片
- T/CNFA 014-2021沙发质量安全等级评定
- T/CIQA 82-2024汽油辛烷值试验机检维修技术规范
- T/CIES 035-2024生鲜食用农产品照明光源显色性规范
- T/CHEC 007-2021自动平移门安装验收技术规范
- T/CGCC 72-2022公用纺织品洗涤废水回用水质要求
- T/CGCC 54.5-2021网络平台环境下文化领域内容交易规范
- 银行背债协议书
- 非洲地理课件
- 军队文职考试试题及答案
- 【公开课】巴西+课件-2024-2025学年七年级地理下学期人教版
- 10.3 保障财产权 课件-2024-2025学年统编版道德与法治七年级下册
- 2025-2030中国表面声波(SAW)滤波器行业市场发展趋势与前景展望战略研究报告
- 的电工考试试题及答案
- 2025年公务员面试试题及答案全解析
- 交通大数据应用试题及答案
- 齐鲁名校大联考2025届山东省高三第七次学业水平联合检测语文试题及答案
- 食堂从业人员培训内容
评论
0/150
提交评论