C# 复习专升本.docx
《C# 复习专升本.docx》由会员分享,可在线阅读,更多相关《C# 复习专升本.docx(19页珍藏版)》请在冰豆网上搜索。
C#复习专升本
第一章C#基础语法
变量名的命名规则
①变量名必须以字母或下划线(不推荐)开头。
②变量名只能由字母、数字、下划线组成,不能包含空格、标点符号、运算符等其它符号。
③C#区分大小写。
如:
code、Code、CODE代表三个不同的变量,不能相互替换。
数据类型
C#中的数据类型主要分为:
值类型和引用类型
●值类型包括简单类型(如,char、int、float等)、枚举类型和结构类型。
●引用类型有四种:
类、接口、数组和代理(委托)。
类除了系统类和用户类外,还包括两个特殊类:
对象类型(object)和字符串类(string)。
值类型和引用类型的区别
值类型变量中存储的是数据本身,而引用类型变量中存储的是数据的内存地址。
把一个值类型变量赋值给另一个值类型变量,将会在内存中创建同一数据的另一个副本,而这两个变量相互之间不会产生任何影响,即改变其中一个变量的值不会影响到另一个变量的值。
相反,把一个引用类型的变量赋给另一个引用类型变量,会在内存中创建同一引用(内存地址)的另一个副本,而不是创建数据的另一个副本。
此时,两个引用型变量引用的是同一数据对象,改变其中一个变量所引用的数据对象会直接影响到另一个变量。
数据类型转换
例如:
doublea=7.85;
intb=(int)a;//结果b=7
在数值和字符串之间进行转换可以用Parse()和ToString()
或者,用System.Convert类中的一套静态方法。
如,Convert.ToInt32()、Convert.ToDouble()、Convert.ToString()、Convert.DateTime()等。
自增、自减运算符
自增、自减运算符有两种应用方式:
y=x++(或y=x--);
先将x值赋给y,然后再将x值做++(或--)运算。
y=++x(或y=--x);
先将x值做做++(或--)运算,然后再将赋值给y。
注意:
自增、自减运算符只能用于变量,而不能用于常数或表达式。
例如:
x++;--x;y=--x;y=x++;都正确。
而5++;++5;(x+y)--;++(5+x);都是错误的。
例如:
doublex=2.5;
doubley=x++;//此时,y=2.5,x=3.5
inta=4;
intb=++a;//此时,a=5,b=5
第2章控制语句
流程控制语句是用来控制程序中各语句的执行顺序。
程序的流程主要分为三种基本结构:
顺序结构、选择结构(分支结构)和循环结构。
在C#语言中,有两种选择结构语句:
if-else语句和switch语句。
在C#语言中,有四种循环结构语句:
while、do-while、for和foreach-in。
例:
求1+2+3+…+100的计算结果。
usingSystem;
classGetSum
{
staticvoidMain()
{
intsum=0;//sum为求和变量
for(inti=1;i<=100;i++)//i为循环变量
{
sum+=i;
}
Console.WriteLine(“sum={0}”,sum);
}
}
例:
打印九九乘法表。
usingSystem;
classPrint
{
staticvoidMain()
{
for(inti=1;i<10;i++)
{
for(intj=1;j<=i;j++)
{
Console.Write(“{0}X{1}={2}”,j,i,j*i);
}
Console.WriteLine();
}
Console.ReadLine();
}
}
C#中有break语句、continue语句和goto语句3种类型的跳转语句。
break语句常用于跳出switch选择结构或while、do-while、for、foreach循环结构。
continue语句常用于跳出while、do-while、for或foreach循环中的本次循环而强制执行下一次循环。
continue语句与break语句的区别:
continue语句用于结束本次循环;而break语句则用于结束整个循环。
第3章数组
数组是一种可以包含多个具有相同数据类型变量的结构。
数组中的每个变量称为数组元素,可以通过数组下标来访问。
注意:
●数组下标从0开始,而不是从1开始。
如数组a的第一个元素是a[0],第二个元素是a[1],依次类推,第n个元素是a[n-1]。
●数组元素在内存中占据着一段连续的内存空间
●数组可以被定义为任何类型(值类型、引用类型,包括数组类型)
●数组中所有元素为同一数据类型
●根据需要,数组可以是一维的、二维的,也可以是多维的
●数组是一种引用类型
例1:
计算数组中奇数和偶数之和。
classGetSum
{
staticvoidMain()
{
int[]a=newint[5]{1,2,3,8,13};//定义一个整型数组
intoddSum=0,evenSum=0;
foreach(intelemina)
{
if(elem%2==0)evenSum+=elem;
elseoddSum+=elem;
}
Console.WriteLine(“奇数和为:
{0},偶数和为:
{1}”,oddSum,evenSum);
}
}
当然,也可以用for循环实现:
classGetSum
{
staticvoidMain()
{
int[]a=newint[5]{1,2,3,8,13};//定义一个整型数组
intoddSum=0,evenSum=0;
for(inti=0;i<5;i++)
{
if(a[i]%2==0)evenSum+=a[i];
elseoddSum+=a[i];
}
Console.WriteLine(“奇数和为:
{0},偶数和为:
{1}”,oddSum,evenSum);
}
}
例2:
定义一组数据,对数据进行排序(先升序排序,再降序排序)
classOrder
{
staticvoidMain()
{
Console.Write("\n要排序的数值个数:
");
intn=int.Parse(Console.ReadLine());
Console.WriteLine("请输入数据!
");
double[]a=newdouble[n];//定义存储数据的一维数组
for(inti=0;i{
Console.Write("第[{0}]个数字:
",i);
a[i]=double.Parse(Console.ReadLine());
}
for(inti=0;iArray.Sort(a);
Console.WriteLine(“\n升序排序结果:
");
for(inti=0;iArray.Reverse(a);
Console.WriteLine(“\n反序结果:
");
for(inti=0;i}
}
练习1:
一维数组的应用。
要求:
编写程序,输入并存储10个学生的考试成绩,并实现如下操作:
(1)求平均分
(2)统计成绩在平均分以上的人数
(3)输出最高分及对应数组下标
参考答案:
classTest
{
publicstaticvoidMain()
{
//输入数据
Console.Write("请输入学生人数:
");
intn=int.Parse(Console.ReadLine());
int[]grades=newint[n];
for(inti=0;i{
Console.Write("请输入第[{0}]个学生成绩:
",i+1);
grades[i]=int.Parse(Console.ReadLine());
}
//显示数据
Console.WriteLine("您输入的{0}个学生成绩如下:
",grades.Length);
for(inti=0;i{
Console.Write("{0}",grades[i]);
}
Console.WriteLine();
//求平均分
doublesum=0,avg=0;
for(inti=0;i{
sum+=grades[i];
}
avg=sum/grades.Length;
Console.WriteLine("平均成绩为:
{0}",avg);
//统计平均分以上的人数
intnum=0;
for(inti=0;i{
if(grades[i]>avg)
{
num++;
}
}
Console.WriteLine("成绩高于平均分的人数为:
{0}",num);
//输出最高分及对应数组下标
intmax=grades[0];
intindex=0;
for(inti=1;i{
if(grades[i]>max)
{
max=grades[i];
index=i;
}
}
Console.WriteLine("最高分为:
{0}",max);
Console.WriteLine("对应数组下标为:
{0}",index);
}
}
第4章面向对象编程
在面向对象技术中,对象就是现实世界中某个具体的物理实体在计算机逻辑中的映射和体现,类是同一类对象的抽象。
在面向对象程序设计中,用对象来表示现实世界中的某个具体事物,用类来描述同种对象的共同属性和功能。
面向对象技术的三个主要特征是:
封装、继承和多态。
//例:
设计一个计算圆面积和周长的类。
classCircle
{
publicconstdoublePI=3.1415926;//圆周率π
publicdoubler=0;//圆的半径
publicdoubleGetArea()//计算圆面积
{
doublearea=PI*this.r*this.r;
returnarea;
}
publicdoubleGetCircum()//计算圆周长
{
doublecircum=2*PI*this.r;
returncircum;
}
}
classTest
{
staticvoidMain()
{
Circlecir=newCircle();
Console.Write("请输入圆半径:
");
cir.r=double.Parse(Console.ReadLine());
doublearea=cir.GetArea();
Console.WriteLine("圆面积是:
{0}",area);
doublecircum=cir.GetCircum();
Console.WriteLine("圆周长是:
{0}",circum);
}
}
方法的参数
在C#中,有4种类型的参数:
●值类型参数(不含任何修饰符)
●引用型参数(以ref修饰符声明)
●输出型参数(以out修饰符声明)
●数组型参数(以params修饰符声明)
引用型参数应用示例:
交换两个变量的值。
classExchange
{
publicvoidSwap(refintx,refinty)
{
inttemp=x;
x=y;
y=temp;
}
}
classTest
{
staticvoidMain()
{
inta=5,b=10;
Console.WriteLine(“a={0},b={1}”,a,b);
Exchangeobj=newExchange();
obj.Swap(refa,refb);
Console.WriteLine(“a={0},b={1}”,a,b);
}
}
方法的重载
重载方法通过参数列表(参数个数、参数类型、参数顺序)的不同来区分。
方法的重写
要在派生类中重写基类方法,基类方法就必须声明为虚方法(用virtual关键字声明)或抽象方法(用abstract关键字声明),然后,就可以在派生类中用关键字override对其重写。
这将意味着,在程序运行时,基类被重写的方法将在派生类中被覆盖。
例:
写出程序的输出结果
classVehical
{
publicvirtualvoidSpeedup()
{
Console.WriteLine("交通工具加速");
}
}
classCar:
Vehical
{
publicoverridevoidSpeedup()
{
Console.WriteLine("汽车加速");
}
}
classTest
{
publicstaticvoidMain()
{
Vehicalv=newVehical();
Vehicalv1=newCar();
Carv2=newCar();
v.Speedup();
v1.Speedup();
v2.Speedup();
}
}
基类方法的调用
在派生类中通过base关键字来调用基类方法。
例:
写出程序的输出结果
classVehical
{
publicvirtualvoidSpeedup()
{
Console.WriteLine("交通工具加速");
}
}
classCar:
Vehical
{
publicoverridevoidSpeedup()
{
base.Speedup();//调用基类方法
Console.WriteLine("汽车加速");
}
}
classTest
{
publicstaticvoidMain()
{
Carcar=newCar();
car.Speedup();
}
}
方法的递归调用
例:
用递归方法实现n的阶乘计算
publiclongFact(longn)
{
if(n==0)return1;//递归结束条件
elsereturnn*Fact(n-1);//递归调用
}
属性
属性本身不能存储任何数据,只是提供了一种访问成员变量的接口,并可以根据需要在读写成员变量时进行某些检查、警告等额外操作。
get访问器是一个不带参数的方法,用于获取属性成员的值。
set访问器是带有一个名为“value”参数的方法,用于设置成员变量的值。
构造函数
构造函数是一种比较特殊的方法,专门用于创建对象。
当用new关键字创建类的实例时,系统会自动调用构造函数,为该实例分配内存空间并对其成员变量进行初始化。
构造函数也有两种:
实例构造函数和静态构造函数。
实例构造函数是在创建类的对象时由系统自动调用,每创建一个类的实例都会调用一次实例构造函数,主要用于初始化实例成员变量;
静态构造函数是在类的第一次引用前由系统自动调用,并且仅执行这一次,主要用于初始化静态成员变量。
静态构造函数
例:
写出程序的输出结果
classNumber
{
publicstaticintn=0;
staticNumber()
{
n++;
}
publicvoidShowN()
{
}
}
classTest
{
publicstaticvoidMain()
{
Console.WriteLine("n={0}",Number.n);
Numbernum1=newNumber();
Console.WriteLine("n={0}",Number.n);
Numbernum2=newNumber();
Console.WriteLine("n={0}",Number.n);
}
}
基类构造函数的调用
例:
写出程序的输出结果
classFather
{
protectedintx=1;
publicFather(intx)
{
this.x=x;
}
}
classSon:
Father
{
privateinty=1;
publicCircle(intx,inty):
base(x)
{
this.y=y;
}
publicvoidShowValue()
{
Console.WriteLine("x={0},y={1}",this.x,this.y);
}
}
classTest
{
publicstaticvoidMain()
{
Sonson=newSon(3,6);
son.ShowValue();
}
}
构造函数的执行序列
例:
写出程序的输出结果
classFatherClass
{
publicFatherClass()
{
Console.WriteLine("FatherClass对象创建完成");
}
}
classSonClass:
FatherClass
{
publicSonClass()
{
Console.WriteLine("SonClass对象创建完成");
}
}
classTest
{
publicstaticvoidMain()
{
SonClassson=newSonClass();
Console.ReadLine();
}
}
结构与类的区别:
●结构是值类型,而类是引用类型。
●在结构中,不能定义无参构造函数;而在类中,可以定义无参构造函数。
●对于结构,在声明成员变量时,不能为实例成员变量赋值,但可以给静态成员变量赋初值;而对于类,在声明时,可以给任何成员变量指定初值。
●结构不支持继承;而类允许单继承。
但结构和类都可实现一个或多个接口。
接口
接口类似于类,也可以包含方法、属性、索引和事件。
但接口只是一个方法声明列表,接口中只有成员的声明,没有成员的实现(即,接口中的所有成员都没有方法体)。
接口中的成员是由继承(实现)该接口的类或结构来实现的(即,编写所有成员的方法体实现代码),并且,继承(实现)接口的类或结构必须实现该接口中的所有成员。
注意:
接口成员只能是方法、属性、索引、事件,不能包含有任何成员变量、运算符、构造函数、析构函数和静态函数。
并且,接口中所有成员都被默认为公有(public),在声明时不能有任何访问修饰符。
例:
定义一个MyClass类来实现以下3个接口
interfaceIA
{
voidPlay();
}
interfaceIB
{
voidPlay();
}
interfaceIC
{
voidStop();
}
接口的实现如下:
classMyClass:
IA,IB,IC
{
voidIA.Play()
{}
voidIB.Play()
{}
publicvoidStop()
{}
}
综合练习
1.计算1~n之和
2.计算n的阶乘
3.给定一个数组,求最大值、最小值和平均值
4.设计一个类,实现圆的周长和面积计算。