案例分析题

阅读以下C代码,回答下列提出问题,将解答填入答题纸的对应栏内。

【C代码1】

float adjust Salary(int service_year,int age,float salary){

if(service_year<=5){

if(age>30)

salary*=1.2;

}

else

salary*=2.0;

return salary;

}

【C代码2】

void foo(int coin){

switch (coin){

case 1: printf("Cent\n");

case 5: printf("Nicke1\n");break;

case 10: printf("Dime\n");

case 25: printf("Quarter\n");

}

}

【C代码3】

int get Sum(int n)

{

Int t,i=0,sum=0;

while(i

scanf( "%d",&t);

if(t<0)

continue;

sum+=t

i++;

}

return sum;

}

问答题

对于【C代码1】,写出下面的函数调用后x1、x2和x3的值。

x1=adjust Salary(1,25,9000.0);

x2=adjust Salary(8,32,7000.0);

x3=adjust Salary(5,41,5000.0);

【正确答案】

(1) x1=9000.000000
(2) x2=14000.000000
(3) x3=6000.000000

【答案解析】

对于 x1, service_year=1, age=25, salary=9000.0, 首先判断 service_year<=5,因此再判断 age<30, 不进行任何运算, salary 仍为 9000.0, 由于 salary 为 float 类型数据,因此输出为 9000.000000。

对于 x2, service_year=8, age=32, salary=7000.0, 首先判断 service_year>5, 因此直接进行 else 中的运算, salary=7000.0*2.0=14000.0, 由于 salary 为 float 类型数据, 因此输出为14000.000000。

对于 x3, service_year=5, age=41, salary=5000.0, 首先判断 service_year<=5, 因此再判断 age>30, 进行运算 salary=5000.0*1.2=6000.0, 由于 salary 为 float 类型数据, 因此输出为6000.000000。

问答题

(1)写出函数调用为foo(1)的输出结果;

(2)写出函数调用为foo(5)的输出结果

(3)写出函数调用为foo(10)的输出结果;

(4)写出函数调用为foo(25)的输出结果。

【正确答案】

(1) foo(1): Cent
                        Nickel
(2) foo(5): Nickel
(3) foo(10): Dime
                          Quarter
(4) foo(25): Quarter

【答案解析】

foo(1): coin=1, 执行 printf(“ Cent\n” ), 输出 Cent 并回 车, 继续执行printf(“Nickel\n” ), 输出 Nickel 并回车, 再执行 break, 结束 foo 函数。foo(5): coin=5, 执行 printf(“Nickel\n” ), 输出 Nickel 并回车, 再执行 break, 结束 foo 函数。foo(10): coin=10, 执行 printf( “Dime\n”), 输出 Dime 并回车, 继续执行 printf( “Quarter\n”),输出 Quarter 并回车, 结束 foo 函数。
Foo(25): coin=25, 执行 printf(“Quarter\n” ), 输出 Quarter 并回车, 结束 foo 函数。

问答题

(1)简要说明【C代码3】中的函数get Sum()的功能;

(2)程序员小王将函数get Sum改写后得到下面的函数get Sum_v2(即用for语句来描述循环)。请问,get Sum_v2的功能是否与【C代码3】的get Sum完全相同,若不同请说明原因。

int get Sum_v2(int n)

{

int t,i=0,sum=0;

for(i=0;1           scanf("%d",&t);

if(t<0)

continue;

sum+=t;

}

return sum;

}

【正确答案】

(1) 函数 getSum()是求 n 个不小于 0 的整数之和。
(2) 函数 getSum_v2 的功能与函数 getSum 不同, getSum()是求 n 个不小于 0 的整数之和,计算和的数目总数是 n 个, 而 getSum_v2 是总共输入了 n 个数, 这 n 个数种有大于等于 0,也有小于 0 的数, 最终只把大于等于 0 的数进行求和, 因此最终计算的和的个数有可能是小于 n 的。

【答案解析】

(1) 函数 getSum()是求 n 个不小于 0 的整数之和。
(2) 函数 getSum_v2 的功能与函数 getSum 不同, 原因: 在 getSum 中, 当 t<0 时, 继续运行 scanf 函数获得 t, 而不会运行 i++运算, i 的值不会改变, 最终会获得 n 个不小于 0 的整数并求和; 而在 getSum_v2 中, 当 t<0 时, 首先进行 i++, 再继续 scanf 函数, 因此当输入的数出现负值时, 会导致最终运算的值可能少于 n 个。