完美版本C#习题册解析.docx
《完美版本C#习题册解析.docx》由会员分享,可在线阅读,更多相关《完美版本C#习题册解析.docx(16页珍藏版)》请在冰豆网上搜索。
完美版本C#习题册解析
C#课程复习纲要
第一部分知识点
C#控制台应用程序结构,熟练掌握输入、输出语句
第二部分知识点(重点章节):
C#编程基础
C#标识符的命名规则;C#常用关键字
【重点】:
C#的数据类型。
基本数据类型(又称值类型)和引用类型(如:
字符串、数组、类、接口等)
C#常量和变量;转义字符
数据类型转换(自动类型转换、强制类型转换)
【重点】:
运算符和表达式
【重点】:
程序的控制结构(顺序结构、分支结构、循环结构、跳转结构)
控制结构的应用,如:
阶乘计算、九九乘法表、杨辉三角、百鸡(百马)问题、水仙花数等问题的编程。
第三部分知识点(重点章节)
一、二维静态、动态数组的创建及使用;字符串的定义、赋值及常用方法;
Math、string、Array、ArrayList、Integer、Float、Double等类的常用方法。
Parse、ToString、Format等方法的使用
第四部分知识点
面向对象程序设计概述。
理解类和对象的内涵,并能正确声明类、创建对象。
熟练定义类、属性、字段、方法及构造方法和析构方法。
理解委托和事件的关系及接口概念
掌握集合,包括:
ArrayList、List、Queue、Stack类
知识点:
标识符的命名规则
●标识符的合法符号包括:
字母、数字、下划线、连接字符、组合字符、格式设置符。
字母为大写或小写的英文字母,数字为0~9;
●标识符必须以字母或下划线开头,即数字不允许为标识符的首字母;
●标识符区分大小写;
●标识符不允许与关键字相同,但允许关键字作为标识符的一部分。
如同名,可在变量前加@;
●变量名不能与C#的库函数同名。
知识点:
转义字符
●转义字符用于表述特定的功能或执行特殊的动作;
●常见转义字符:
水平制表符、退格符、回车符、换行符等。
知识点:
关键字
●关键字是C#语言定义、并赋予特定含义的一类标识符,用户只能按照规定使用这些关键字;
●掌握常见关键字。
知识点:
常量和变量、数据类型
●基本数据类型;
●变量是程序运行过程中数据类型不变,但数值可以发生改变的一种量;
●变量三要素:
变量名、变量数据类型、变量值;
●变量要先定义、再使用。
知识点:
数组
●数组是具有相同类型的数据的集合,数组元素的类型可以使基本数据类型,也可以使类或接口;
●使用数组名和下标可以唯一确定数组中的每个元素,数组下标的索引号从0开始,故最后一个元素的索引号应是(数组长度-1);
●数组通过Length属性获得数组的长度;
●数组必须先经过声明和初始化后才能使用;
●重点掌握一、二维静态数组;
●动态数组ArrayList的使用及常用方法,如:
Add()、Sort ()、Insert()、Clear()等。
●
●
知识点:
字符串类、Math类及其常用方法
●字符串是用双引号括起来的字符序列,而字符则是使用单引号括起来的单个字符;
●C#语言将字符串视为对象,string视为类;
●字符串常用方法,如:
获得字符数组、获得字符串的长度、字母大(小)写转换、字符串的连接、删除首尾空格等;
●Math类中的常见静态方法,如:
Sqrt()、Pow()、Round()、Ceiling()、Floor()、Max()、Min()等方法。
知识点:
运算符、表达式、语句;数据类型转换
●运算符是指对数据实施运算控制的符号。
以a+b为例,参与运算的a和b称为操作数,操作数可以是常量、变量、表达式和有返回值的方法;+为运算符,各类运算符应熟记。
●表达式是指由运算符和操作数连接而成,符合计算机语言语法规则,并具有特定结果值的符号序列,a+b为表达式
●算术运算符及算术表达式;关系运算符及关系表达式;逻辑运算符及逻辑表达式;赋值运算符及赋值表达式;条件运算符及条件表达式;
●运算符的优先级;运算符的结合性;
●有效表达式后加上分号就构成了语句,如:
intc=a+b;
●理解自加、自减及复合赋值运算;
●表达式中涉及不同类型的数据时,需要进行数据类型转换。
类型转换包括:
自动类型转换和强制类型转换。
知识点:
控制结构
●控制结构包括:
顺序结构、选择分支结构、循环结构、跳转结构。
●选择分支结构:
if-else、switch-case
●循环结构:
while、do-while、for、foreach
●跳转结构:
break、continue、goto、return
例如:
阅读下面程序,程序编译或运行结果是D。
publicclassTest{
staticbooleanf(charc){
Console.Write((char)(c+2));
returntrue;
}
publicstaticvoidMain(string[]args){
inti=0;
for(f('A');f('B')&&(i<2);f('C')){
i++;
f('D');
}
}
}
A)ABDCBDCBB)ABCDABCDC)编译时出现错误D)其他结果
知识点:
●每章习题
●PPT中的编程题目
二、填空题
1))C#语言的各种数据类型之间提供两种转换:
强制和自动 。
2)C#中的三元运算符是?
;。
3)C#对运算符_重载方法___进行了扩展,不仅可以连接字符串,而且还能将字符串与其它类型数据进行连接,结果是字符串。
4)当switch后面表达式的值与任一case子句中的值都不匹配时,程序执行default面的语句;break句用来在执行完一个case分支后,使程序跳出switch语句;若没有该语句,当程序执行完匹配的case语句序列后,继续向下执行,向下执行时,并不与case后面的数据进行比较,而是直接执行下面的所有语句,直到遇到break语句为止。
5)break语句最常见的用法是在switch语句中。
通过break语句退出多路分支结构。
6)引入命名空间的命令是__using________,表示制表符的转义字符是_____"\t" __________,被称为内存分配的运算符是__new__________,表示常量的关键字是_______const___。
7)面向对象编程的重要特征___封装、继承、多态________。
8)继承是指在基类的基础上建立新的类,使得新定义的类可以继承基类的成员,还可以定义新的成员;重载是指在类中定义了功能不同但名称相同的方法或属性。
构造函数不能被继承和重载,析构函数能被继承和重载。
9)要使Label控件显示给定的文字信息,应在设计状态下设置它的文本属性值。
10)事件AEvent的预订是向委托AEventHandler的调用列表中添加方法method,格式为
AEvent+=newAEventHandler(method);
11)设x=1,y=2,z=3,则表达式y+=z--/++x执行后,y的值是3。
12)C#的逻辑运算符中,异或运算符为^;与运算符为&&;非运算符为!
;或运算符为||。
13)使用关键字delegate声明委托。
对于多个相同类型的委托,使用+=对调用列表合并,
-=实现调用列表方法的移除。
14)C#中,Parse方法可以实现将字符串型表达式转换成数值型数据,Tostring方法可以将数值型转换成字符串型。
三、判断题
1)C#语言中的数组元素下标总是从0开始,下标可以是整数或整型表达式。
(对)
2)C#语言中的数组元素只能是基本数据类型而不能为对象类型。
(错)
3)intx=8;语句执行后,条件表达式x>10?
100.0:
50值为50.0。
(对)
4)类成员分为静态成员和非静态成员,静态成员属于类的对象所有,非静态成员属于类所有,只能由类名来访问。
(错)
5)C#中,对属性访问时将会调用属性的set访问器和get访问器,一般与类中的字段成员有对应关系。
(对)
6)数据在使用前一定要先声明,然后才能引用。
(对)
7)使用Length属性可以获得字符串或静态数组的长度。
(错)
8)在循环体内,使用break;语句可以跳出循环。
(对)
四、代码补充题
1)请在横线处填入适当内容将代码补充完整,使程序能正确运行。
2)下面程序对数组中每个元素赋值,然后按逆序输出。
请在横线处填入适当内容,使程序能正确运行。
classArrayTest{
staticvoid Main (stringargs[]){
inti;
int[]a=newint[5];
for(i=0;i<5; i++ )
a[i]=i;
for( i=5 ;i>=0;i--)
Console.WriteLine("a["+i+"]="+a[i]);
}
}
3)执行以下代码,输出结果是:
inti=5;
switch(i){
case3:
Console.WriteLine("java");break;
case4:
Console.WriteLine("c#");
case5:
Console.WriteLine("html");
default:
Console.WriteLine("default");
}
五、简答题
1)列举C#语言的优点:
●简洁的语法
●精心地面向对象设计
●与Web的紧密结合
●完整的安全性与错误处理
●版本处理技术
●灵活性与兼容性
2)C#中数据类型可分为基本数据类型和引用数据类型,简述C#有哪些基本数据类型,有哪些引用类型,并写出对应的关键字:
bool、byte、sbyte、char、decimal、double、float、int、uint、long、ulong、object、short、ushort、string
3)继承和多态的含义:
多态:
类的多态性主要指类成员方法的多态。
有方法的重载、重写和隐藏,这些东西只要你多写点代码理解了语法后就很容易撑握的。
你可以从怎样在类中实现方法的重载、重写和隐藏开始。
4)理解重载和重写概念:
重载的条件:
1.必须在同一个类中2.方法名必须相同3.参数列表不能相同。
重写的条件:
1.在不同的类中
2.发生方法重写的两个方法返回值,方法名,参数列表必须完全一致
3.子类抛出的异常不能超过父类相应的方法抛出的异常
4.子类方法的访问级别不能低于父类相应方法的访问级别(public,package,protected,private)
5.方法体不同
重载:
重载发生在同一个类中;重载主要是针对同一个类中方法名相同但参数(必须的)不同或返回类型(不是必须的)不同的情况
重写:
重写发生在有继承关系的类之间
重写发生在派生类上,通过override关键字来改写从其父类继承过来的具有相同返回值,方法名称和参数列表的方法。
5)理解类中字段和属性的关系:
若在类的内部记录事物的状态信息则用字段,一般用private修饰,以防对外使用
对外公布的事物则使用属性,一般用public修饰,通常和私有字段联合使用,通过属性来对私有字段赋值,或通过属性来获取私有字段的值。
6)理解委托和事件:
委托是对函数的封装,可以当作给方法的特征指定一个名称。
而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程。
委托是一种引用方法的类型。
一旦为委托分配了方法,委托将与该方法具有完全相同的行为。
委托通过delegate来声明。
而事件是说在发生其他类或对象关注的事情时,类或对象可通过事件通知它们。
事件对象用event声明。
六、编程题
1)使用循环或递归,实现对任意输入的一个整数返回它的阶乘。
提示:
循环和递归两种方式任选其一即可。
【参考代码1】递归
【参考代码2】循环
2)使用循环结构打印出九九乘法表。
最终的输出结果如下:
1*1=1
2*1=22*2=4
3*1=33*2=63*3=9
4*1=44*2=84*3=124*4=16
5*1=55*2=105*3=155*4=205*5=25
6*1=66*2=126*3=186*4=246*5=306*6=36
7*1=77*2=147*3=217*4=287*5=357*6=427*7=49
8*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=64
9*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81
【参考代码1】
【参考代码2】
3)百马问题
classProgram
{
staticvoidMain(string[]args)
{
inta,b,c;//*大马:
3;中马:
2;2匹小马:
1现在有100担100匹马
//*a表示大马b表示中马¨ªc表示小马
for(a=0;a<=33;a++)
{
for(b=0;b<=50;b++)
{
for(c=0;c<=100;c=c+2)
{
if(a+b+c==100&&3*a+2*b+0.5*c==100)
{
Console.WriteLine("大马{0}匹,中马{1}匹,小马{2}匹",a,b,c);
}
}
}
}
Console.ReadKey();
}
}
}
4)水仙花数问题
classProgram
{
staticvoidMain(string[]args)
{
inta,b,c;
Console.WriteLine("水仙花数有:
");
for(inti=100;i<1000;i++)
{
a=i/100;//获得百位上的数字
b=(i-a*100)/10;//获得十位上的数字
c=i-a*100-b*10;//获得个位上的数字
if(a*a*a+b*b*b+c*c*c==i)
{
Console.WriteLine(i.ToString());
}
}
Console.ReadKey();
}
}
}
水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身。
(例如:
1^3+5^3+3^3=153)
5)类的定义(包括:
常量、字段、属性、方法、构造方法及析构方法的定义)、对象的创建及使用。
常量:
一旦初始化就不再发生变化,也可以理解为符号化的常数,例如:
可以用常量PI来代替3.1415926,当需要修改PI精度时,只需在代码中改变PI的初始值就可以。
常量的声明:
需要指定其数据类型、常量名,以及初始值,并需要使用const关键字
例如:
[public]constdoublePI=3.1415;
其中,[public]可以用以下代替。
●public:
全局变量
●private:
局部变量
●new:
创建新变量,不继承父类同名变量
常量和变量在代码上的区别:
就是有无const,声明时有const则为常量,否则就是变量。
字段:
字段(field)用来存储数值或对象的真正实体简单说是私有变量(不一定是私有...)
是字段不过是个公开的字段
私有的话就是privateinti;这样外部就无法访问到了
最简单的字段和属性的定义
classClass1{
intval;
publicintValue{
get{returnthis.val;}
set{this.val=value;}
}
}它包含一个字段和一个有公开读写访问权的属性
属性:
读写那些私有字段的值。
通过属性访问数据,可以是指成只读、只写或者读写。
通过get关键字来设置只读,set关键字来设置可写,return返回读取属性的值,value表示外部是指的数值。
privatestringtest;//创建属性Test
publicstringTest
{
get
{
returntest;
}
set
{
test=value;
}
}
方法:
通过方法可以封装一段功能完整的代码,例如
publicdoubleGetArea()
{
doubler=10;
retunrnMath.PI*r*r;
}
很多时候,方法最后是没有返回任何数值的,那么返回类型就使用void关键字表示。
定义Student类。
其中包括四个私有字段(name,age,sex和score)、一个构造方法和show()方法。
各字段和方法的含义如下:
字段name为String类型,用于存储学生的姓名;
字段age为int类型,用于存储学生的年龄;
字段sex为boolean类型,用于存储学生性别,男生为false,女生为true;
字段score为double类型,用于存储学生的成绩;
构造方法包括四个参数,用于为字段name、age、sex和score赋值;
show()方法无参数,用于打印输出字段name、age、sex和score的信息。
编写程序测试Student类,使用构造方法创建对象并调用show()方法显示输出。
classProgram
{
staticvoidMain(string[]args)
{
Students=newStudent("zhang",18,true,90);
s.show();
}
}
classStudent
{
privatestringname;
publicstringName
{
get{returnname;}
set{name=value;}
}
privateintage;
privateboolsex;
privatedoublescore;
publicStudent(stringname,intage,boolsex,doublescore)
{
this.name=name;
this.age=age;
this.sex=sex;
this.score=score;
}
publicvoidshow()
{
Console.WriteLine(name+";"+sex+"\t"+age+"\t"+score);
}
百鸡问题
公鸡5钱一只,母鸡3钱一只,小鸡3只一钱
classProgram
{
staticvoidMain(string[]args)
{
intCock,Hen,Chick;
//For循环版本百钱百鸡|
for(Cock=0;Cock<19;Cock++)//因为公鸡最大不会超过19只,所以最多循环19
{
for(Hen=0;Hen<33;Hen++)//母鸡最大也不会超过33次,所以最多循环33次
{
Chick=100-Cock-Hen;//小鸡等于100-公鸡个数-母鸡个数
if(Cock*5+Hen*3+Chick/3==100)//判断三种鸡乘以单价的总数是否等于100元
{
Console.WriteLine("公鸡有:
{0}只,母鸡有:
{1},小鸡有:
{2}",Cock,Hen,Chick);
}
}
}
Console.WriteLine("................................................................................");
Console.ReadKey();
}
}
}
杨辉三角:
publicclassMyClass
{
publicstaticvoidMain()
{
Console.Write("请输入数组的长度:
");
intnum=Convert.ToInt32(Console.ReadLine());
int[,]arr=newint[num,num];
for(inti=0;i{
for(intj=0;j{
Console.Write("");
}
for(intj=0;j<=i;j++)
{
if(j==0||j==i)
{
arr[i,j]=1;
}
else
{
arr[i,j]=arr[i-1,j]+arr[i-1,j-1];
}
Console.Write(arr[i,j].ToString()+"");
}
Console.WriteLine();
}
Console.ReadKey();
}
}
}