附录B  部分习题参考答案
第1章
1. A
2. D
3. D
4. A C
5. C# 源程序由代码和代码注释组成,代码又可以分为引用部分和主体部分。主体代码都在命名空间之中,包括各种类型及其成员的定义。
6. 启动MSIL反汇编程序,通过菜单“文件| 打开”定位到系统Windows文件夹的“Microsoft.NET\Framework\v2.0.XXXXX”子目录下(后5位表示.NET Framework 2.0的详细版本号),打开其中的mscorlib.dll文件,从中可查看System等命名空间下的类型组织,如图A.1所示:
A.1 System程序集反汇编
第2章
1. AC
2. B
3. BD
4. CD
5. C
6. B
7. D
8. (1)结构类型和枚举类型都是复合类型。结构类型是多个简单值类型的组合,因而结构类型的变量就是多项内容的组合而成的一个实体。枚举类型则表示一组逻辑上相关联的内容,枚举类型的变量在某一时刻只体现其中的一项内容。
(2)值类型的变量直接包含自身的所有数据,每创建一个变量,就在内存中开辟一块区域;只有通过变量才能修改它所包含的数据。而引用类型的变量只存储对目标数据的引用,每创建一个变量,就增加一个指向目标数据的指针;有可能出现多个引用类型的变量指向同一份数据的情况,这时修改一个变量就会影响到其它所有的变量。
9. 代码段的输出为:
Hi    Frank
Welcome
10. 程序的输出为:
星期Wednesday
月份Apr
季节3
11. 参考源代码如下:
Console.WriteLine("SByte: {0} ~ {1}", SByte.MinValue, SByte.MaxValue);
Console.WriteLine("Byte: {0} ~ {1}", Byte.MinValue, Byte.MaxValue);
Console.WriteLine("Int16: {0} ~ {1}", Int16.MinValue, Int16.MaxValue);
Console.WriteLine("UInt16: {0} ~ {1}", UInt16.MinValue, UInt16.MaxValue);
Console.WriteLine("Int32: {0} ~ {1}", Int32.MinValue, Int32.MaxValue);
//……
12. 不可以,因为整数和枚举都是值类型,而数组转换要求数据元素的类型都是引用类型。
13. 可以,但要利用装箱和拆箱技术,看下面的程序:
    class Program
    {
        static void Main()
        {
            object[][] d = new object[3][];
            d[0] = new object[] { 1, 2, 3 };
            d[1] = new object[] { 1.5F, 2.5F, 3.0F };
            d[2] = new object[] { 1.25, 2.5, 3.14 };
            for (int i = 0; i < 3; i++)
                for (int j = 0; j < 3; j++)
                    Console.WriteLine(d[i][j]);
        }
    }
14. (略)
第3章
1. AD
2. AB
3. AD
4. 方法MyMethod1的重载形式不合法,因为访问限制修饰符和返回类型都不是方法的标识;而方法MyMethod2的重载形式合法。
5. 方法的返回值在方法的执行代码中通过return语句得到,而输出型参数则需要在执行代码中赋值。它们都用于得到方法的执行结果,当方法只返回一个结果时通常使用返回值,而返回多个结果时应利用输出型参数;二者还可以同时使用。
6. 程序的输出为:
0
5
0
0
5
5
7. 对于局部变量、方法的输出参数,以及传递给方法的其它类型的参数,未赋值会导致编译错误。而对于类或结构的字段,以及数组元素,未赋值时其值等于类型的默认值,并且会导致编译警告。
8. 程序主方法Main中的最后一行代码是错误的:
    Console.WriteLine(OuterClass.inner.z);
因为在类OuterClass的定义中并未对InnerClass类型的变量inner进行初始化,因此只能使用其常数常量y,而不能使用其非静态的只读常量z。修改方法有二,一是将类InnerClass的字段z定义为静态的,然后在Main方法通过类的原型访问该字段:
    public static readonly int z = 13;
    Console.WriteLine(OuterClass.InnerClass.z);
二是在类OuterClass的定义中对变量inner进行初始化:
    public static readonly InnerClass inner = new InnerClass();
9. (略)
10. (1)重力加速度g,它可作为只读常量,在不同的环境下进行不同的构造初始化,如在地球上是9.8,而在月球上是4.9;(2)万有引力常量,它应作为常数常量,因为其值始终保持不变。
第4章
1. C
2. A
3. BC
4. A
5. A
6. 设北京时间为bj,巴黎时间为paris(二者均为int类型的变量),那么从北京时间到巴黎时间的转换表达式为:
    paris = (24 + bj - 7) % 24;
而从巴黎时间到北京时间的转换表达式为:
    bj = (paris + 7) % 24;
7. 当两个操作数均为布尔类型时,与运算“&”和逻辑与运算“&”的求值效果相同,或运算“|”和逻辑或运算“||”的求值效果相同。但异或运算“^”不存在对应的条件逻辑运算。
8. (略)
9. 和类型判断操作符is相比,as操作符强制要求左操作数为引用类型,而且表达式返回结果不同:如果左右操作数类型兼容,is运算返回布尔值true,而as运算将左操作数转换为右操作数所代表的类型,并返回其值;如果转换失败,is运算返回布尔值false,而as运算返
回空值null。
    在左右操作数类型兼容时,as类型转换表达式与一般的强制类型转换表达式效果相同;不同之处在于:类型转换失败时,as表达式将返回空值null,而不会引发异常。
10. 程序的输出为:
True True False True False
第5章
1. CD
2. C
windows程序设计第7版pdf3. D
4. A
5. B
6. D
7. BC
8. 代码如下(注意即使变量ch在循环体内赋值,也要事先声明,否则while子句中就不能使用该变量):
    char ch = '0';
    do
    {
        Console.WriteLine("请输入分数(按X键退出):");
        ch = Console.ReadKey().KeyChar;
        switch (ch)
        {
            case '5':
                Console.WriteLine("优秀");
                break;
            case '4':
                Console.WriteLine("良好");
                break;
            case '3':
                Console.WriteLine("及格");
                break;
            case '2':
                Console.WriteLine("不及格");
                break;
            case '1':
                Console.WriteLine("不及格");
                break;
            default:
                Console.WriteLine("请输入~之间的整数");
                break;
        }
    }
    while (ch != 'x' && ch != 'X');
9. 可以,但break和continue语句都只能跳出本层循环,只有使用return语句或goto语句才有可能跳出外层循环,其中return语句会直接结束当前方法的执行。
10. 参考代码如下(注意数据类型转换)
a) while循环:
int i = 1;
double s = 1.0;
while (i < 100)
    s += (double)i++ / i;
b) do-while循环:
int i = 1;
double s = 1.0;
do
    s += (double)i++ / i;
while (i < 100)
c) for循环:
double s = 1.0;
for(int i = 1; i<100; i++)
    s += (double)i / (i + 1);
11. 参考代码如下:
    public static long Fib(int n)
    {
        if (n == 0)
              return 0;
        long x = 0, y = 1, tmp;
        for (int i = 1; i <= n; i++)
        {
            tmp = y;
            y += x;
            x = tmp;
        }
        return y;
    }
12. 循环语句用于代码段的重复执行,其中while、do-while和for语句都是通过循环变量来控制循环的过程,它们之间可以互换,也就是说其中一种循环语句能够实现的功能,也可以通过另外两种来实现。而foreach语句则对于集合中的每个元素都执行一次循环,它的功能总是可以通过前三种循环语句来实现;反之则不然,即while、do-while和for语句所实现的功能未必都可以使用foreach语句来实现。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。