2013C#习题集

更新时间:2023-03-10 01:15:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C#程序设计 习题集

辛晓辉

2012年12月

中国地质大学(北京)信息工程学院

第1章 C#简介

一.选择题

1.C#中程序的入口方法是【 】。

A) main B) Main C) begin D) Program 2.假设变量x的值为25,要输出x的值,下列正确的语句是【 】。

A) System.Console.writeline(“x”); B) System.Console.WriteLine(“x”); C) System.Console.WriteLine(“x={0}”,x); D) System.Console.WriteLine(“x={x}”); 3.要退出应用程序的执行,应执行下列的【 】语句。

A) Application.Exit(); B) Application.Exit; C) Application.Close(); D) Application.Close; 4.关于C#程序的书写,下列不正确的说法是【 】。

A) 区分大小写 B) 一行可以写多条语句 C) 一条语句可以写成多行

D) 一个类中只能有一个Main()方法,因此多个类中可以有多个Main()方法。 5.下列关于命名空间的说法,错误的是【 】。

A) 在C#中,命名空间可有可无,看需要来定义和使用

B) 使用命名空间的好处是,不但在不同命名空间中的成员可以重名,而且在同一个命名空间中的成员也可以重名

C) 不同命名空间中的成员可以重名,同一个命名空间中的成员不可以重名 D) 命名空间为程序的逻辑结构提供了一种良好的组织方式 6.公共语言运行库即【 】。

A) CRL B) CLR C) CRR D) CLS 7..NET平台是一个新的开发框架,【 】是.NET的核心部分。

A) C# B) .NET Framework C) VB.NET D) 公共语言运行库 8.C#应用程序项目文件的扩展名是【 】。

A) csproj B) cs C) sln D) suo 9.C#应用程序解决方案文件的扩展名是【 】。

A) csproj B) cs C) sln D) suo 10.利用C#开发应用程序通常有三种类型,不包括【 】。

A) 控制台应用程序 B) Web应用程序 C) SQL程序 D) Windows应用程序 11.运行C#程序可以通过按【 】键实现。

A) F5 B) Alt+F5 C) Ctrl+F5 D) Alt+Ctrl+F5 12.C#语言中类模块代码文件的扩展名是【 】。

A) csproj B) cs C) sln D) suo 13.构建桌面应用程序需要.NET提供的类库是【 】。

A) ADO.NET B) Windows Form C) XML D) ASP.NET 14.与C++等语言相比,C#中增加的一个类成员访问修饰符是【 】。

A) private B) public C) protected D) internal 15.C#中导入某一命名空间的关键字是【 】。

A) use B) using C) import D) include

二.填空题

1..NET框架包括【 】和.NET类库。

2.为便于管理多个项目,在VS.NET集成环境中引入【 】,用来对企业级解决方案涉及的多个

项目进行管理。

3.C#是作为【 】语言的替代品种出现的。 4.要使lable控件显示给定的文字“您好。”,应在设计状态下设置它的【 】属性值。 5.C#要求程序中的每个元素都要属于一个【 】,

6.在C#程序中,程序的执行总是从【 】方法开始的。

7.在C#中,进行注释有两种方法:使用“//”和使用“/* */”符号对,其中【 】只能进

行单行注释。

8.要在控制台程序运行时输入信息,可使用Console类的【 】方法。

三.问答题

1.C#语言的特点是什么?

2.说明Visual Studio.NET、.NET Framework和C#之间的联系。 3.Visual Studio 2008包含哪几种开发语言? 4.控制台应用程序有哪些输入输出方法? 5.简述命名空间的作用。

6.什么是解决方案?什么是项目?解决方案与项目有什么关系?

第2章 基本数据类型与表达式

一.选择题

1.在C#语言中,下列能够作为变量名的是【 】。

A) if B) 3ab C) a_3b D) a-bc 2.在C#语言中,转义字符不可以表示【 】。

A) 任何字符 B)字符串 C)字母 D)小数点 3.表达式5/2+5%2-1的值是【 】。

A) 4 B) 2 C) 2.5 D) 3.5 4.下列数值类型的数据精度最高的是【 】。

A) int B) float C) decimal D) ulong 5.在C#语言中,下面的运算符中,优先级最高的是【 】。

A) % B) ++ C) *= D) > 6.能正确表示逻辑关系“a≥10 或 a≤0”的C#语言表达式是【 】。

A) a>=10 or a<=0 B) a>=10 | a<=0 C) a>=10 && a<=0 D) a>=10 || a<=0 7.以下程序的输出结果是【 】。 using System; class Program { public static void Main(string[] args) { int a=5,b=4,c=6,d; Console.WriteLine(“{0}”,d=a>b?(a>c?a:c):b); } }

A) 5 B) 4 C) 6 D) 不确定 8.要使用变量score来存储学生某一门课程的成绩(百分制,可能出现小数部分),则最好将其定义为【 】类型的变量。 A) int B) decimal C) float D) double 9.下列标识符中,非法的是【 】。

A) MyName B) c sharp C) abc2cd D) _123 10.已定义下列变量:

int n; float f; double df; df=10; n=2;

下列语句正确的是【 】。 A) f=12.3; B) n=df; C) df=n=100; D) f=df; 11.下列表达式或语句中,有语法错误的是【 】。

A) n=12%3.0;(n为int型) B) 12/3.0 C) 12/3 D) ?a?>?b?

12.下列语句中,不能正确定义长度为4的数组a的语句是【 】。

A) int[] a=new int[]{1,2,3,4}; B) int[] a= {1,2,3,4}; C) int[] a=new int[4]{1,2,3}; D) int[] a=new int[4]{1,2,3,4}; 13.若二维数组a有4行6列,那么该数组中第15个元素的访问方法是【 】。

A) a[15]; B) a[3,3] C) a[3][3] D) a[2,2] 14.以下装箱、拆箱语句中,错误的有【 】。

A) object obj=100; int m=(int)obj; B) object obj=100; int m=obj;

C) object obj=(int)100; int m=(int)obj; D) object obj=(object)100; int m=(int)obj; 15.下面有关变量和常量的说法,正确的是【 】。

A) 在程序运行过程中,变量的值是不能改变的,而常量是可以改变的 B) 常量定义必须使用关键字const

C) 在给常量赋值的表达式中不能出现变量 D) 常量在内存中的存储单元是固定的,变量则是变动的 16.C#中的值类型包括三种,它们是【 】。

A) 整型、浮点型和基本类型 B) 数值类型、字符类型和字符串类型 C) 简单类型、枚举类型、结构类型 D) 数值类型、字符类型、枚举类型 17.代码public static const int A=1;中的错误是【 】。

A) A需要定义类型 B) 格式错误 C) const不能用static修饰符 D) const不能用public修饰符

二.填空题

1.在C#中,使用【 】关键字来声明符号常量。 2.在C#中,表达式Math.Pow(2,-2)的值是【 】。

3.为计算表达式ex+y的值,应使用的C#语言的表达式是【 】。 4.C#语言规定,变量在使用之前必须先【 】。

5.下列程序完成的功能是:从键盘上输入一个直角三角形的斜边长度和一个角的度数,计算出另两

条直角边的长度并输出。请填空。

using System;

class Program { public static void Main(string[] args) { double a, b, c, d, jd; c= Convert.Tosingle(Console.ReadLine()); //输入斜边的长度 jd=Convert.Tosingle(Console.ReadLine()); //输入角的度数 d=【 】; a=c*Math.Sin(d); b=【 】; Console.WriteLine(“a={0},b={1}”,a,b); //输出两直角边的值 } }

6.设x为int型变量,请写出描述“x是奇数”的C#语言表达式【 】。 7.请写出描述“-10≤x≤10”的C#语言表达式【 】。

8.在代码中明确表示将某种数据类型转换为另一种数据类型称为【 】。

三.问答题

1.什么是字符类型和字符串类型?两者有何区别和联系?

2.是否可以定义这样的数组:它即包含int类型数据,也包含float类型数据?为什么? 3.变量与常量有何区别?

4.什么是数据类型转换?有哪几种方法?

5.数据类型的隐式转换和显式转换分别在什么场合使用?它们可以相互替换吗? 6.除(/)运算对整型数据和浮点型数据有何不同? 7.下列程序段的输出结果是什么? int a=1,b=2,c=3; Console.WriteLine(a>b&&b==c||a

8.说明C#值类型与引用类型数据的区别。 9.什么是装箱和拆箱?

第3章 结构化程序设计语句

一.选择题

1.在C#语言中,if语句后面的表达式应该是【 】。

A) 逻辑表达式 B) 条件表达式 C) 关系表达式 D) 布尔类型的表达式 2.在C#语言中,if语句后面的表达式,不能是【 】。

A) 逻辑表达式 B) 算数表达式 C) 关系表达式 D) 布尔类型的表达式 3.在C#语言中,switch语句用【 】来处理不匹配case语句的值。

A) default B) anyelse C) break D) goto 4.下列程序的输出结果是【 】。

using System;

class Program { public static void Main(string[] args) { int x=1,a=0,b=0; switch(x) { case 0: b++; break; case 1: a++; break; case 2: a++; b++; break; } Console.WriteLine(“a={0},b={1}”,a,b); } }

A) a=2,b=1 B) a=1,b=1 C) a=1,b=0 D) a=2,b=2 5.以下叙述正确的是【 】。

A) do??while语句构成的循环不能用其他语句构成的循环来代替 B) do??while语句构成的循环只能用break语句结束循环

C) 用do??while语句构成的循环,在while后的表达式为true时结束循环

D) 用do??while语句构成的循环,在while后的表达式应为关系表达式或逻辑表达式 6.以下关于for循环的说法不正确的是【 】。

A) for循环只能用于循环次数已经确定的情况 B) for循环是先判定表达式,后执行循环体 C) 在for循环中,可以用break语句跳出循环体

D) for循环体语句中,可以包含多条语句,但要用花括号括起来 7.以下关于if语句和switch语句的说法,正确的【 】。

A) 如果在if语句和switch语句中嵌入break语句,则在程序执行过程中,一旦执行到break语句,就会结束相应的执行,转向执行其后面的语句

B) 凡是能够使用if语句的地方就可以使用switch语句,反之亦然 C) if语句有3种基本形式:if?、if?else?和if?else if?else?

D) if语句是实现“单判断二分支”的选择结构,switch语句是实现“单判断多分支”的选择结构。

8.以下关于for循环的说法,不正确的是【 】。

A) for语句中的3个表达式都可以省略

B) for语句中的3个表达式中,若第2个表达式的值为true,则执行循环体中的语句,直到第3个表达式的返回值为false C) for语句中的3个表达式中,第2个表达式必须是布尔类型的表达式,其他两个可以是任意类型的表达式。

D) for语句中的3个表达式中,第1个表达式执行且仅执行一次;每当循环体语句被执行后,第3个表达式都跟着被执行一次。

9. C#提供的4种跳转语句中,不推荐使用的是【 】。

A) return B) break C) continue D) goto

二.填空题

1.在switch语句中,在每个分支的最后应有一条【 】语句。 2.在C#中,实现循环的语句主要有【 】、do??while和【 】语句。

3.在循环执行过程中,希望当某个条件满足时强行退出循环,应使用【 】语句。 4.continue语句的作用是【 】。

5.下列程序完成的功能是求出所有的水仙花数。(所谓水仙花数是指这样的数:该数是三位数,其

各位数字的立方和等于该数。例如:153=13+53+33,所以153是一个水仙花数。)请填空。

using System;

class Program { public static void Main(string[] args) { int a, b, c, t; for(i=100;i<=【 999 】; i++)

{ t=i;

a=t; t=t/10; b=t; c=t/10; if(【 i==a*a*a+b*b*b+c*c*c 】)

Console.WriteLine(“i={0}”,i); } } }

6.WriteLine()方法和Write()方法的区别是【 】。

7.下列程序的功能是:输出100以内能被3整除且个位数为6的所有整数。请填空。

using System;

class Program { public static void Main(string[] args) { int i, j; for(i=100;【 】; i++)

{ j=i*10+6;

if(【 】) continue;

Console.WriteLine(“{0} ”, j); } } }

7.下列程序的功能是:输出200以内的所有素数。请填空。

using System;

class Program

{ public bool sushu(int x)

{ int i,k;

}

8.下列程序的功能是:产生100个两位随机正整数,求这些数中所有能被3整除的数的和,以及所

有不能被3整除的数的各位数字和。请填空。

static void Main(string[] args)

{ float sum1=0,sum2=0; int i,num;

Random randObj1=new Random(); for(i=1;i<=100;i++)

{ num=【randObj1.Next(10,100) 】;

if(num%3==0)

{ sum1=sum1+num; 【 continue; 】 } sum2=sum2+num;

sum2=sum2+num/10; }

Console.WriteLine(\能被3整除的数的和为:{0}\

Console.WriteLine(\不能被3整除的所有数的各位数字和为:{0}\ Console.Read (); }

9. 下列程序完成的功能是采用二分查找方法在给定的有序数组a中查找用户输入的值,并提示相应

的查找结果。请填空。 public static void Main(string[] args) { double [] a=new int[10]{0, 1.2, 2.5, 3, 4.6, 5.0, 6.7, 7.6, 8.2, 9}; double k; int low=0, high=9, mid; Console.Write(\输入查找数据:\ k=double.Parse(Console.ReadLine());

while (【(9)】)

{ mid=(low+high)/2; if (a[mid] == k) { Console.WriteLine(\ return; } else if (a[mid] > k) 【(10)】; else low = mid + 1;

k=Convert.ToInt32(Math.Sqrt(x))

for(i=2;i<=k;i++) if (x%i==0) return false; 【 】; }

public static void Main(string[] args) { int i, j; for(i=3;i<=200; i=i+2)

{ if(【 】)

Console.WriteLine(“{0} ”,i);

} }

}

}

Console.WriteLine(\未找到{0}\

三.读程序题

1.请写出下列代码段的运行结果,并说明原因。 int i=1,n=-1; if(i==0); n=100; Console.Write(n); 100

2.请写出下列代码段的运行结果,并说明原因。 int x=0; int y=-1; if(x!=0) if(x>0) y=1; else y=0; x=0,y=-1 3.下列程序的运行结果是【 】。 class Program { public static void Main(string[] args) { int i=0,s=1; do { s/=s+1;

i++; }while(i<=10);

Console.WriteLine(“i={0},s={1}”,i,s); } }

4.下列程序的运行结果是【 】。 class Program { public static void Main(string[] args) { int i=0,m=0,n=0; while(i<=100) { if(i%2==0) m+=1; else n=n+1; i++;

}

Console.WriteLine(“m={0},n={1}”,m,n); } }

第4章 数组

一.选择题

1.假定int类型变量占用4个字节,若有定义:

int[] x=new int[10]{0,2,4,4,5,6,7,8,9,10}; 则数组x在内存中所占字节数是【 】。 A) 10 B) 20 C) 40 D) 80 2.下列程序的输出结果是【 】。

using System;

class Program { public static void Main(string[] args) { int i; int[] a=new int[10]; for(i=9;i>=0;i--) a[i]=10-i; Console.WriteLine(“{0}{1}{2}”,a[2],a[5],a[8]); } }

A) 258 B) 741 C) 852 D) 369 3.有定义语句:int[,] a=new int[5,6];

则下列正确的数组元素引用是【 】。 A) a(3,4) B) a(3)(4) C) a[3][4] D) a[3,4] 4.以下的数组定义语句中,不正确的是【 】。

A) int[] a=new int[5]{1,2,3,4,5}; B) int[,] a=new int[3][4]; C) int[][] a=new int[3][]; D) int[] a={1,2,3,4,5};

5.对于foreach语句和for语句,下列说法错误的是【 】。

A) for语句与foreach语句在结构上不一样,前者有3个表达式,表达式间用分号隔开;后者仅有一个“表达式”,形式为“数据类型 变量 in 集合表达式” B) 语句for(;true;);是合法的,但是个死循环;“foreach(true);”也是合法的,也是一个死循环 C) 语句for(;true;);是合法的,但是个死循环;而“foreach(true);”是非法的 D) 语句块“ int[] a={1,2}; foreach(int i in a);”是合法的。

二.填空题

1.数组定义与赋初值语句如下:int[] a={1,2,3,4,5}; 则a[2]的值为【 3 】。

2.下列程序段执行后,a[4]的值为【 4 】。 int[] a={1,2,3,4,5}; a[4]=a[a[2]];

3.下列数组定义语句中:int[] a=new int[3]; ,定义的数组a占的字节数为【 12 】。 4.下列数组定义语句中,数组将在内存中占用【 160 】个字节。 double[,] d=new double [4,5];

5.要定义一个3行4列的单精度二维数组f,使用的定义语句为【 float[,] f=new float [3,4]; 】。 6.要定义一个int型的参差数组a,数组有两行,第一行一个元素,第二行两个元素并赋初值3和4,

使用的语句如下,请填空。

int[][] a=【new int[2][] 】; a[0]=【 new int[1] 】; a[1]=【 new int[2]{3,4} 】;

三.读程序题

1.下面程序的运行结果是【 】。

using System;

class Program { public static void Main(string[] args) { const int SIZE=10;

int[] y={1,2,3,4,5,6,7,8,9,10}; int[] z=new int[SIZE];

for (int i = 0; i < z.Length; i++) { z[i] = i * 2 + y[i];

Console.Write(\

}

Console.Read(); }

2.下面程序的运行结果是【 】。

static void Main(string[] args) { const int M = 5; int[][] yhsj = new int[M][]; int i, j;

for (i = 0; i < M; i++) yhsj[i] = new int[i + 1]; for (i = 0; i < M; i++)

{ yhsj[i][0] = 1; yhsj[i][i] = 1; } for (i = 2; i < M; i++) for (j = 1; j < i; j++) yhsj[i][j] = yhsj[i - 1][j - 1] + yhsj[i - 1][j]; for (i = 0; i < M; i++)

{ for (j = 0; j <= i; j++) Console.Write(\ \ Console.WriteLine(); }

Console.Read(); }

3.下面程序的运行结果是【 】。

class Program

{ public static void Main(string[] args)

{ string str1=\星期一\\\\星期二\\\\星期三\ string str2=@\星期一\\\\星期二\\\\星期三\ Console.WriteLine(\ Console.WriteLine(\ } }

第5章 其他常用数据类型

一.选择题

1.下列程序的执行结果是【 】。

using System;

class Program { enum team{my,your=4,his,her=his+10};

public static void Main(string[] args)

{ Console.WriteLine(\

(int)team.his, (int)team.her);

} }

A) 0,1,2,3 B) 0,4,0,10 C) 0,4,5,15 D) 1,4,5,15 2.以下对枚举类型的定义,正确的是【 】。

A) enum a={one,two,three}; B) enum a{a1,a2,a3}; C) enum a{?1?,?2?,?3?}; D) enum a{ “one”,”two”,”three” }; 3.有下列语句:

struct Birthday{public int year; public int month; public int day;}; struct Student{ int no; string name; int age; public Birthday bir; }; ??

Student Stu;

如果要把Stu的出生年份赋值为1988,正确的语句是【 】。 A) Stu.bir.year=1988; B) Stu.year=1988; C) Stu. Birthday.year=1988; D) Student. Birthday.year=1988; 4.枚举型常量的值不可以是【 】类型。

A) int B) long C) ushort D) double 5.对于下面声明的委托和定义的类:

delegate int Mydelegate(int n); class A

{ public int f(int i) { return 0; } public void g(int j) { } public static int h(int k) { return 0; } }

下面语句中哪些是正确的【 】。 Mydelegate d1=new Mydelegate(A.h); //语句1 A a=new A(); Mydelegate d2=new Mydelegate(a.f); //语句2

Mydelegate d3=new Mydelegate(a.g); //语句3 Mydelegate d4=new Mydelegate(a.h); //语句4 A) 语句1、语句2、语句3、语句4 B) 语句1、语句2 C) 语句3、语句4 D) 语句2、语句3 6.委托声明的关键字是【 】。

A) delegate B) sealed C) operator D) event

7.有声明语句:delegate void TimeDelegate(string s),则以下语句可以和委托TimeDelegate绑定的方

法是【 】。 A) void f(){ } B) string f(){ } C) void f(string a){ } D) string f(string a){ }

8.声明一个委托类型public delegate int myCallBack(int x); 则以下语句可以和委托myCallBack绑定

的方法是【 】

A) void myCallBack(int x); C) string receive(int x);

B) int receive(int num); D) 不确定的

二.填空题

1.C#中的字符串有两类:规则字符串和逐字字符串,定义逐字字符串时,应在其前面加上【 @ 】号。

2.下列程序的执行结果是【 False 】。 class Program { public static void Main(string[] args) { string str1,str2; str1=\ str2=\

Console.WriteLine(\

} }

3.已知str的值为”abcdefgh”,则表达式str.Substring(1,3)的值为【 bcd 】。

4.若要从字符串str的第3个字符开始取5个字符作为一个子串赋给sstr,可以使用语句

【 sstr=str.Substring(3,5) 】实现。 5.以下程序的执行结果是【 123 】。

class Program

{ public static void Main(string[] args) { string str=\ int i; for(i=0;i='0'&& str[i]<='9') Console.Write(str[i]); } }

6.将一个值类型隐式或显示地转换成一个object类型称为【 】。所谓拆箱就是将一个【 】显

式地转换成一个值类型。

7.声明一个委托类型MyFun1,该委托类型可以与无参且返回值为int类型的方法相关联,则该声

明语句应为【 】。

第6章 面向对象程序设计基础

一.选择题

1.下面有关类和对象的说法中,不正确的是【 】。

A) 类是系统提供的一种数据类型 B) 对象是类的实例

C) 类和对象的关系是抽象和具体的关系 D) 任何一个对象只能属于一个具体的类

2.下列关于构造函数的描述中,不正确的是【 】。

A) 构造函数中,不可以包含return语句 B) 一个类只能有一个构造函数

C) 实例构造函数在生成类实例时被自动调用 D) 用户可以定义无参构造函数 3.面向对象的特点主要概括为【 】。

A) 可分解性、可组合型性和可分类性 B) 继承性、封装性和多态性

C) 封装性、易维护性、可扩展性和可通用性 D) 抽象性、继承性和封装性

4.要使一个类能被同一命名空间中的其他类访问,但不能被这个命名空间以外的类访问,该类可以【 】。

A) 不使用任何修饰符 B) 使用private修饰符 C) 使用public修饰符 D) 使用internal修饰符 5.类的字段和方法的默认访问修饰符是【 】。

A) public B) private C) protected D) internal 6.下列关于构造函数的描述中,【 】是正确的。

A) 构造函数名必须与类名相同 B) 构造函数不可以重载 C) 构造函数不能带参数 D) 构造函数可以声明返回类型 7.C#中的TestClass为一自定义类,其中有如下属性定义: public void Property{??}

使用以下语句创建了该类的对象,并让变量obj引用该对象。 TestClass obj=new TestClass();

那么,可通过【 】方式访问类TestClass的Property属性。 A) MyClass. Property B) obj. Property C) TestClass. Property D) obj. Property() 8.关于C#语言的方法,下列叙述正确的是【 】。

A) 方法的定义不能嵌套,但方法的调用可以嵌套 B) 方法的定义可以嵌套,但方法的调用不能嵌套 C) 方法的定义和调用都不能嵌套 D) 方法的定义和调用都可以嵌套

9.以下所列的各方法头部中,正确的是【 】。

A) void play(var a:Integer, var b:Integer) B) void play(int a, b) C) void play(int a, int b) D) Sub play(a as integer, b as integer) 10.下列程序的输出结果是【 】。

class Program

{ static long fib(int n) { long f1=1, f2=1, f=0; int i;

if(n==1||n==0) return(1); for(i=2; i<=n; i++)

{ f=f1+f2; f1=f2; f2=f; } return(f);

}

public static void Main(string[] args) { Console.WriteLine(\}

}

A) 2 B) 3 C) 4 D) 5 11.下列程序的输出结果是【 】。 class Program { static void sub(int x, int y, int z)

{ z=x*x+y*y; }

public static void Main(string[] args) { int a=30; sub(5,2,a);

Console.WriteLine(\}

}

A) 0 B) 29 C) 30 D) 无定值 12.调用重载方法时,系统根据【 】来选择具体的方法。

A) 参数的类型 B) 参数的个数和类型 C) 参数个数 D) 方法的返回值类型 13.下列的【 】不是构造函数的特征。

A) 构造函数的函数名与类名相同 B) 构造函数可以重载 C) 构造函数可以带有参数 D) 可以指定构造函数的返回值类型

14.类ClassA有一个名为M1的方法,在程序中有如下一段代码,假设该段代码是可以执行的,则声明M1方法时一定使用了【 】修饰符。 ClassA Aobj=new ClassA(); ClassA.M1();

A) public B) public static C) private D) virtual

15.已知类B是由类A继承而来,类A中有一个名为M的非虚方法,现在希望在类B中也定义一个名为M的方法,且两方法的参数个数和类型完全相同,若希望编译时不出现警告信息,则在类B中声明该方法时,应使用【 】关键字。 A) static B) new C) override D) virtual 16.下列关于类的定义,错误的是【 】。

A) class A B) class A { void f(){ } { void f(){}

} }; C) class A D) class A { private void f(){ return; } { f(){}

} }

17.在类A中定义了属性y:

class A

{ public int y

{ get { return 1; } set { } }

并试图通过下列代码来实现对属性y的访问: A b=new A(); b.y=2; int x=b.y;

对此,下列说法正确的是【 】。

A) 属性y可读可写,因此变量x的值为2

B) 属性y可读,但不可写,因此语句“b.y=2;”是错误的 C) 属性y可写,但不可读,因此语句“int x=b.y;”是错误的 D) 属性y可读可写,变量x的值为1

18.关于静态成员,下列说法正确的是【 】。

A) 同一个类中的静态成员,类实例化后,在不同的对象中形成不同的静态成员 B) 在类实例化后,同类型的对象都共享类的静态成员,静态成员只有一个版本 C) 在类定义时静态成员属于类,在类实例化后静态成员属于对象 D) 在类实例化后静态成员已被实例化,因此不同的对象有不同的静态成员 19.下列代码在类A中重载了减号“-”:

class A

{ private int x;

public static A operator -(A b,A c) { A a=new A(); a.x=b.x * c.x; return a; } public void setx(int x) { this.x=x; } public int getx(){ return x; } }

执行下列语句: A a=new A(); a.setx(3); A b=new A(); b.setx(6);

A c=a-b; int n=c.getx();

结果n的值为【 】。 A) -3 B) -6 C) 18 D) 9 20.假设类B继承了类A,下列说法错误的是【 】。

A) 类B中的成员可以访问类A中的公有成员 B) 类B中的成员可以访问类A中的保护成员 C) 类B中的成员可以访问类A中的私有成员 D) 类B中的成员可以访问类A中的静态成员 21.关于多态,下列说法正确的是【 】。

A) 多态实际上就是重载,它们本质上是以一样的

B) 多态可以分为编译时多态和运行时多态。前者的特点是在编译时就能确定要调用成员方法的哪个版本,后者则是在程序运行时才能确定要调用成员方法的哪个版本。 C) 编译时多态是在程序运行时才能确定要调用成员方法的哪个版本,而运行时多态在编译时就能确定要调用成员方法的哪个版本。

D) 多态和重载是两个完全不同的概念,前者是通过定义虚方法和重写虚方法来实现,后者是通过对同一函数名编写多个不同的实现代码来实现。

22.下列关于接口的说法,正确的是【 】。

A) 接口中定义的方法都必须是虚方法 B) 接口中定义的方法可以编写其实现代码

C) 继承接口的类可提供被继承接口中部分成员的实现代码 D) 接口中的所有方法都必须在其派生类中得到实现。 23.执行下列两条语句后,结果s2的值为【 】。 string s=“abcdefgh”; string s2=s.Substring(2,3);

A) “bc” B) “cd” C) “bcd” D) “cde” 24.下列关于虚方法的描述中,正确的是【 】。

A) 虚方法能在程序执行时动态确定要调用的方法,因此比非虚方法更灵活 B) 在定义虚方法时,基类和派生类的方法定义语句中都要带上virtual修饰符 C) 在重写基类的虚方法时,为消除隐藏基类成员的警告,需要带上new修饰符 D) 在重写基类的虚方法时,需要同时带上virtual和override修饰符 25.下列方法定义中,【 】是抽象方法。

A) static void func(){ } B) virtual void func(){ } C) abstract void func(){ } D) overridel void func(){ } 26.下列关于接口的说法,错误的是【 】。

A) 一个类可以有多个基类和多个基接口 B) 抽象类和接口都不能被实例化

C) 抽象类自身可以定义成员,而接口不可以 D) 类不可以多重继承,而接口可以。 27.已知类Base、Derived的定义如下:

class Base

{ public void Hello()

{ System.Console.Write(“Hello in Base!”); } }

class Derived: Base

{ public new void Hello()

{ System.Console.Write(“Hello in Derived!”); } }

则下列语句段在控制台中的输出结果是【 】。 Derived x=new Derived(); x.Hello();

A) Hello in Base! B) Hello in Base! Hello in Derived! C) Hello in Derived! D) Hello in Derived!Hello in Base! 28.关于继承,下列说法正确的是【 】。

A) 子类将继承父类所有的成员 B) 子类将继承父类的非私有成员 C) 子类只继承父类public成员

D) 子类只继承父类的方法,而不继承属性 29.【 】是用readonly修饰符声明的字段,它只能在字段声明或构造函数中赋值,在其他任何地

方都不能改变字段的值。 A) 只读字段 B) 静态字段 C) 实例字段 D) 读写字段 30.下列关于静态方法的说法,错误的是【 】。

A) 静态方法不对特定实例进行操作,不与实例相关联 B) 使用静态方法的语法格式:类名.静态方法(实参列表)

C) 静态方法只能访问类中的静态成员,不能访问非静态成员 D) 静态方法不能访问类中的静态成员

31.下列关于函数重载的说法中,完全正确的是【 】。

A) 重载函数的参数个数必须不同 B) 重载函数必须具有不同的形参列表 C) 重载函数必须具有不同的返回值类型 D) 重载函数的参数类型必须不同 32.已知: int a=100; void Func(ref int b) { ?? } 则下列函数调用正确的是【 】。

A) Func(ref(10*a)) B) Func(ref 10) C) Func(ref(a) ) D) Func(ref a) 33.下面对方法中的ref和out参数说明错误的是【 】。

A) ref和out参数传递方法相同,都是把实参的内存地址传递给形参,实参与形参指向同一个内存存储区域,但ref要求实参必须在调用之前明确赋过值

B) ref是将实参传入形参,out只能用于从方法中传出值,而不能从方法调用处接受实参数据。 C) ref和out参数因为传递的是实参的地址,所以要求实参和形参的数据类型必须一致 D) ref和out参数要求实参和形参的数据类型或者一致,或者实参能被隐式地转化为形参的类型 34.设方法Max的签名为:public void Max(out int max, params int[] a),maxval是一个int型的值类

型变量,arrayA是一个int型的数组对象,则下列调用该方法的语句中有错的是【 】。 A) Max(out maxval) B) Max(out maxval,4,5,3) C) Max(out maxval, array A) D) Max(out maxval,4,4.5) 35.下列的关键字中可用于引用类的当前实例的是【 】。

A) base B) this C) new D) override 36.下列是抽象类的声明的是【 】。

A) abstract class figure{ } B) class abstract figure{ } C) seald class figure{ } D) static class figure{ }

37.Abstract修饰的方法是抽象方法,抽象方法只有声明而无主体,且【 】。

A) 只能存在于抽象类中 B) 可以在任何类中 C) 只能在接口中 D) 只能在密封类中

38.重写一个基类的虚方法时,应与原虚方法的方法名相同,并且【 】。

A) 不能改变方法的参数类型、个数和返回值 B) 可以改变方法的参数类型、个数和返回值 C) 可以改变方法的返回值

D) 可以改变方法的参数类型和个数

39.下面有关继承的说法中,正确的是【 】。

A) A类和B类均有C类需要的成员,因此可以从A类和B类共同派生出C类 B) 在派生新类时,可以指明是公有派生、私有派生或保护派生 C) 派生类可以继承基类中的成员,同时也继承基类的父类中的成员 D) 在派生类中,不能添加新的成员,只能继承基类的成员

40.为了防止从所修饰的类派生出其他类,可以将此类定义为【 】。

A) 抽象类 B) 密封类 C) 静态类 D) 私有类 41.若想从派生类中访问基类的成员,可以使用【 】。

A) this关键字 B) me关键字 C) base关键字 D) override关键字 42.下面有关派生类的描述中,不正确的是【 】。

A) 派生类可以继承基类的构造函数 B) 派生类可以隐藏和重载基类的成员 C) 派生类不能访问基类的私有成员 D) 派生类只能有一个直接基类 43.下列程序错误的原因是【 】。 Sealed class SealedClass{ } Class Derived:SealedClass{ }

A) SealedClass类不能被继承 B) 没有Main()入口 C) SealedClass没有被实例化 D) 以上皆是 44.下面关于接口的叙述中,不正确的是【 】。

A) 接口只是由方法、属性、索引器或事件组成的框架,并没有描述任何对象的实例代码 B) 接口的所有成员都被自动定义为公有的,不可使用访问修饰符来定义接口成员 C) 类可以通过在类型定义语句中包括冒号和接口名来表明它正在实现接口 D) 一个类只能实现一个接口

45.接口可以包含一个或多个成员,以下选项中【 】不能包含在接口中。

A) 方法 B) 属性 C) 事件 D) 常量 46.下列叙述中,正确的是【 】。

A) 接口中可以有虚方法 B) 一个类可以实现多个接口 C) 接口能被实例化 D) 接口中可以包含已实现的方法 47. 关于虚方法实现多态,下列说法错误的是【 】。

A) 定义虚方法使用关键字virtual B) 关键字virtual可以与override一起使用 C) 虚方法是实现多态的一种应用形式 D) 派生类是实现多态的一种应用形式 48. 有以下的程序:

class A { } class B:A { }

class Program { }

public static void Main() { }

B b = new B(); Console.ReadLine(); public B() {

Console.WriteLine(\} public A( ) {

Console.WriteLine(\}

上述代码运行后,将在控制台窗口输出 。

9.怎样定义基类虚方法,并在派生类中重写基类虚方法? 10.抽象方法和虚方法有什么异同?

11.什么是抽象类?它有什么特点?它和接口有何异同? 12.什么是方法重载?重载的方法有何特点? 13.简述抽象类和接口有何异同。

五.编程题

1.创建一个Student类,要求:

? 该类封装学生的姓名、性别和成绩等信息。 ? 通过构造函数给姓名和性别信息赋值。

? 成绩信息通过属性进行读写,对成绩属性进行赋值时,若成绩大于100分赋100分,若成绩

低于0分赋0分。

? 具有一个判断成绩等级的方法

2.声明一个用于检查用户合法性及用户级别的类CheckUser,具体要求如下:

? 该类包含UserName(用户名)和UsePwd(密码)两个string类型的属性。 ? 包含一个带有两个string类型参数的构造函数。

? 包含一个返回值为int类型的UserLevel()方法,返回值为0表示高级用户,为1表示普通用

户,为2表示用户不存在。若用户名为“zhangsan”,密码为”123456”,则为高级用户。若用户名为“lisi”,密码为”654321”,则为普通用户。所有其他用户均为不合法用户。

3.声明一个名为MyCar的类,具体要求如下:

? MyCar类可以被任何类访问

? 该类包含有两个属性:string类型的CarType和double类型的CarPrice

? 该类具有两个重载构造函数:一个无参数,一个包含两个参数(对应CarType和CarPrice属

性)。使用无参数构造函数初始化MyCar类对象时,CarType属性值默认为“SUV”,CarPrice属性值默认为24.5。

4.编写一个名为CTimer1的类,该类能够存放时间信息(设定三个域分别用来存放时分秒信息),

并且具有设置时间和显示时间的功能(设置和显示时间可定义成类的方法)。 5.创建一个名为Person的类,具体要求如下:

? 含有静态字段total(存放学生总数),实例字段ID(学号)、name(姓名)、sex(性别) ? 创建构造函数,为新实例设置变量值,并记录实例个数。 ? 创建静态方法,显示当前学生总数。

? 创建实例方法,显示学生的学号、姓名和性别。 ? 在主函数中调用实例化Person类,并调用静态方法和实例方法,要求第一次实例化显示自己

的学号和姓名等。

class Person

{ public static int total=0;

public int num; public string name; public string sex;

public Person(int n, string a, string s) { num = n; name = a; sex = s; total++; } public static void displayNum() { Console .WriteLine (\public void DisplayAll() { Console.WriteLine(\学号:{0}\\t姓名:{1}\\t性别:{2}\}

}

public class test

{ static void Main()

{ Person myPerson = new Person(1001, \张小为\女\

Person.displayNum(); myPerson.DisplayAll(); }

}

6.创建一个复数类Complex,可以实现复数的赋值(通过构造函数)、显示(通过实例方法)和加

法运算(通过“+”运算符重载)。 class Complex

{ int real, imag;

public Complex(int a, int b)

{ real = a; imag = b; } public void Display()

{ Console.WriteLine(\ }

public static Complex operator +(Complex p1, Complex p2)

{ Complex p=new Complex(0,0); p.real = p1.real + p2.real; p.imag = p1.imag + p2.imag; return p; } }

7.定义一个Shape抽象类,在该类中定义两个抽象方法GetArea和GetPerim。然后以Shape抽象类

作为基类派生出Rectangle和Circle类,在这两个类中分别对GetArea和GetPerim方法进行重写,实现求特定形状的面积和周长。

8.设计一个抽象类Calculate(计算),该类包含OptA、OptB、OptC三个double类型的字段,包含

一个带有两个double类型参数的构造函数和一个名为SqrtForSum的抽象方法,该方法带有三个double类型参数、返回值类型为double型。再设计一个继承于Calculate的派生类Cal,该类包含一个带有三个double类型参数的构造函数,并重写SqrtForSum方法用于计算三数和的平方根。 9.编写一个通用的人员类(Person),该类具有姓名(Name)、年龄(Age)、性别(Sex)等字段。

然后通过对Person类的继承得到一个学生类(Student),该类能够存放学生5门课的成绩,并能求出平均成绩,要求对该类构造函数进行重载,至少给出三种形式,最后编程对Student类的功能进行验证。

10.请设计一个类,用来模拟栈及其操作。

说明:栈是一种重要的数据结构,在内存中占用连续的存储单元。栈有两个端点,固定的栈底和浮动的栈顶。栈有两种基本操作:push(压栈)和pop(出栈)。压栈是向栈顶位置写入一个元素,然后使栈顶指示器加1;出栈是先使栈顶指示器减1,再把该位置的元素读出来。

提示:可用一个数组成员(假设为buffer)表示栈的空间,用一个整型成员(假设为sp)表示栈顶指示器,并在构造函数中分配栈的空间和设置sp的值为0。出栈与压栈均用类的方法来实现,一般设其方法名分别为push和pop。

11.设计一个控制台应用程序,含一个学生类Stud(每个学生有学号xh、姓名xm和分数fs私有字

段),向ArrayList对象中添加若干个学生对象,并按分数递减输出所有学生信息。

class Program {

class Stud {

int xh; //学号

string xm; //姓名 int fs; //分数 public int pfs //pfs属性 {

get { return fs; } }

public Stud(int no, string name, int degree) {

xh = no; xm = name; fs = degree; }

public void disp() {

Console.WriteLine(\ } }

public class myCompareClassfs : IComparer {

int IComparer.Compare(object x, object y) {

Stud a = (Stud)x; Stud b = (Stud)y;

if (a.pfs < b.pfs) return 1; else if (a.pfs == b.pfs) return 0; else return -1; } }

static void disparr(ArrayList myarr, string str) {

Console.WriteLine(str);

Console.WriteLine(\学号\\t姓名\\t分数\ foreach (Stud s in myarr) s.disp(); }

static void Main(string[] args) {

int i, n = 4;

IComparer myComparerfs = new myCompareClassfs(); ArrayList myarr = new ArrayList();

Stud[] st = new Stud[4] { new Stud(1, \ new Stud(4, \ new Stud(2, \ for (i = 0; i < n; i++) myarr.Add(st[i]); myarr.Sort(myComparerfs);

disparr(myarr, \按分数降序排序后:\ } }

12.设计一个控制台应用程序,定义如下接口Ia:

interface Ia { }

float getarea();

//求面积

//声明接口Ia

从它派生Rectangle(长方形类)和Square(正方形)两个类,包含getarea方法的实现。并分别输出长2宽3的长方形和长5的正方形的面积。

interface Ia {

float getarea(); }

public class Rectangle : Ia //类Rectangle继承接口Ia {

float x, y;

public Rectangle(float x1, float y1) //构造函数 {

x = x1; y = y1; }

float Ia.getarea() //显式接口成员实现,带有接口名前缀,不能使用public {

return x * y; } }

public class Square : Ia {

float x;

public Square(float x1) //构造函数 {

x = x1; }

float Ia.getarea() //显式接口成员实现,带有接口名前缀,不能使用public {

return x * x; } }

class Program {

static void Main(string[] args) {

Rectangle box1 = new Rectangle(2.0f, 3.0f); //定义一个类实例 Ia ia = (Ia)box1;

//定义一个接口实例

Console.WriteLine(\长方形面积: {0}\

Square box2 = new Square(5.0f); //定义一个类实例 Ia ib = (Ia)box2; } }

//定义一个接口实例

Console.WriteLine(\正方形面积: {0}\

//接口成员声明

//声明接口Ia

13. 编写一个控制台应用程序项目,实现学生和教师数据输入和显示功能。学生类Student有编号、

姓名、班号和成绩等字段,教师类有编号、姓名、职称和部门等字段。要求将编号、姓名输入和显示设计成一个类Person,并作为Student和Teacher的基类。需用相关数据进行测试。

public class Person //人类 { private int no; //编号 private string name; //姓名 public void input()

{ Console.Write(\编号:\

no = int.Parse(Console.ReadLine()); Console.Write(\姓名:\

name = Console.ReadLine(); }

public void disp()

{ Console.WriteLine(\编号:{0}\ Console.WriteLine(\姓名:{0}\ } }

public class Student : Person //学生类 { private string sclass; //班号 private int degree; //成绩 public void input() { base.input();

Console.Write(\班号:\ sclass = Console.ReadLine(); Console.Write(\成绩:\

degree = int.Parse(Console.ReadLine()); }

new public void disp() { base.disp();

Console.WriteLine(\班号:{0}\ Console.WriteLine(\成绩:{0}\ } }

public class Teacher : Person //教师类 { private string prof; //职称 private string depart; //部门 public void input() { base.input();

Console.Write(\职称:\ prof = Console.ReadLine(); Console.Write(\部门:\ depart = Console.ReadLine(); }

new public void disp() { base.disp();

Console.WriteLine(\职称:{0}\ Console.WriteLine(\部门:{0}\ } }

class Program {

static void Main(string[] args) { Student s1 = new Student(); Teacher t1 = new Teacher();

Console.WriteLine(\输入一个学生数据:\ Console.WriteLine(\输入一个教师数据:\ Console.WriteLine(\显示一个学生数据:\ Console.WriteLine(\显示一个教师数据:\ } }

14. 设计一个控制台应用程序项目a,输入若干个学生的英语和数学成绩,求出总分,并按总分从高

到低排序。要求设计一个学生类Student,所有学生对象存放在一个Student对象数组中,通过一个方法对其按照总分进行降序排序,最出输出排序后的结果,类似于图1所示。

图1 控制台应用程序项目a的执行结果

public class Student {

private string name; private int eng, math, sum; public int psum {

get { return sum; } }

public void inscore() {

Console.Write(\姓名:\ name = Console.ReadLine(); Console.Write(\英语:\

eng = int.Parse(Console.ReadLine()); Console.Write(\数学:\

math = int.Parse(Console.ReadLine()); sum = eng + math; }

public void display() {

Console.WriteLine(\ } }

class Program {

const int Max = 100;

static void sort(int n, params Student[] p) {

int i, j; bool exchange; Student tmp;

for (i = 0; i < n - 1; i++) {

exchange = false;

//采用冒泡排序法排序

for (j = n - 2; j >= i; j--) if (p[j + 1].psum > p[j].psum) {

tmp = p[j + 1]; p[j + 1] = p[j]; p[j] = tmp; exchange = true; }

if (exchange == false) break; } }

static void Main(string[] args) {

int n, i;

Student[] p = new Student[Max]; //定义对象引用数组 Console.Write(\

n = int.Parse(Console.ReadLine());

for (i = 0; i < n; i++) //创建对象引用的实例 p[i] = new Student(); for (i = 0; i < n; i++) {

Console.WriteLine(\输入第{0}个学生数据:\ p[i].inscore(); }

Console.WriteLine(\排序前:\

Console.WriteLine(\姓名\\t英语\\t数学\\t总分\ for (i = 0; i < n; i++) {

Console.Write(\序号{0}:\ p[i].display(); }

sort(n, p); //按总降序排序 Console.WriteLine(\排序后:\

Console.WriteLine(\姓名\\t英语\\t数学\\t总分\ for (i = 0; i < n; i++) {

Console.Write(\第{0}名:\ p[i].display(); } } }

//p[j+1]<->p[j]

说明:可以采用任一种排序方法,也可以用数组的Sort方法。

15. 设计一个控制台应用程序项目b,设计一个普通职工类Employee,其工资为基本工资(1000)

加上工龄工资(每年增加30元)。从Employee类派生出一个本科生类UEmployee,其工资为普通职工算法的1.5倍。并用相关数据进行测试,类似于图2所示。

图2 控制台应用程序项目b的执行结果

public class Employee {

//普通职工类

private double bsalary= 1000; //基本工资 private double psalary; //实际工资 private int n; //工作年数 public int pn {

get { return n; } set { n = value; } }

public double compsalary() //计算普通员工工资 {

Console.Write(\工作年数:\

pn = int.Parse(Console.ReadLine()); psalary = bsalary+30*pn; return psalary; } }

public class UEmployee : Employee //本科生职工类 {

new public double compsalary() {

return 1.5 * base.compsalary(); } }

class Program {

static void Main(string[] args) {

Console.WriteLine(\普通职工:\ Employee emp1 = new Employee();

Console.WriteLine(\该普通职工工资:{0}\ Console.WriteLine(\本科生职工:\ UEmployee emp2 = new UEmployee();

Console.WriteLine(\该本科生职工工资:{0}\ } } }

说明:本题需采用继承方法,用虚函数等均可。

第7章 异常处理

一.选择题

1.一般情况下,异常类存放在【 】中。

A) System.Exception命名空间 B) System.Diagnostics命名空间 C) System命名空间 D) Exception命名空间 2.分析下列程序代码: int num;

try

{ num= Convert.ToInt32(Console.ReadLine()); } Catch { //捕获异常 }

当输入\时,会抛出【 】异常。 A) FormatException B) IndexOutOfRangException C) OverflowException D) TypeLoadException 3.用户定义的异常应该从【 】类中继承。

A) ArgumentException B) IOException C) SystemException D) Exception

4..NET Framework中,处理异常是很有用的功能。一个try代码块可以有多个catch块与之对应。在多个catch块中,下面【 】异常应该最后捕获。 A) Exception B) StackOverflowException C) SystemException D) FormatException 5.下列关于try?catch?finally语句的说明中,不正确的是【 】。

A) catch块可以有多个 B) finally块是可选的 C) catch块是可选的 D) 可以只有try块

6.为了能够在程序中捕获所有异常,在catch语句的括号中使用的类名为【 】。

A) Exception B) DivideByZeroException C) FormatException D) 以上三个均可 7.关于异常,下列说法中不正确的是【 】。

A) 用户可以根据需要抛出异常

B) 在调用方法中可通过throw语句把异常传回给调用方法 C) 用户可以自己定义异常 D) 在C#中有的异常不能被捕获 8.下列说法正确的是【 】。

A) 在C#中,编译时对数组下标越界将作检查

B) 在C#中,程序运行时,数组下标越界也不会产生异常

C) 在C#中,程序运行时,数组下标越界是否产生异常由用户确定 D) 在C#中,程序运行时,数组下标越界一定会产生异常 9.异常处理使用【 】关键字来捕捉可能会引发异常的程序。

A) Click B) try C) catch D) throw 10.关于catch代码块说法正确的是【 】。

A) 包含有可能会引发异常的语句块 B) 声明有可能会引发异常的类型 C) 一般不与try块配合使用,单独使用 D) 异常处理程序位于catch代码块中

11.Throw语句抛出的异常类型必须是【 】。

A) System.Exception或从System.Exception派生的类型 B) System.Show类型 C) System类型 D) 任意类型

二.填空题

1.与try块相关的【 】块将一定被执行。 2.异常对象均是从【 】类派生而来的。 3.【 】块封装了可能引发异常的代码。

4.如果方法Convert.ToInt32的参数不是一个有效的整数值,可以抛出一个【 】异常。 5.在整型运算中发生算术溢出时,为了强制发生异常,使用运算符【 】。 6.数组下标越界时产生的异常是【 】类型的异常。

7.Exception类有两个重要的属性,其中【 】属性包含对异常原因的描述信息。

8.在catch语句中列举异常类型时,DivideByZeroException异常应列在Exception异常的【 】。(填前面或后面)

9.常用的异常处理关键字包括【 try 】、【 catch 】、【 finally 】、【 throw 】。

三.填空题和改错题

1.对于下列代码段,执行后输出结果是【 】。 int n,m;

int[] a=new int[5]; n=10; m=10; try

{ for(int i=0; i<=a.Length; i++) a[i]=i;

n=1/(n-m); }

catch(DivideByZeroException e1) { Console.WriteLine(“产生零除异常!”); } catch(IndexOutOfRangeException e2) { Console.WriteLine(“产生数组访问越界异常!”); } 答:输出“产生数组访问越界异常!”。

2.下列代码段中试图用try-catch-catch结构捕获和处理异常,其中有的地方是错误的,请将错误的地方纠正过来。 int m;

int[] a=new int[5]; n=10; m=10; try

{ m=int.Parse(“2000$”);

for(int i=0; i<=a.Length; i++) a[i]=i; }

catch(Exception e1) { Console.WriteLine(“产生异常:{0}”,e1.Message); } catch(IndexOutOfRangeException e2) { Console.WriteLine(“产生异常:{0}”,e2.Message); } 答:需要将两个catch块的位置顺序对调过来。

本文来源:https://www.bwwdw.com/article/r38a.html

Top