Bootstrap

Day3输入输出流程控制语句2.0

1.    考虑到多重循环对程序效率的影响,以下哪种实现效率较高?为什么?(泰华智慧)
(a)循环次数大的放在外层,循环次数小的放在内层;
(b)循环次数小的放在外层,循环次数大的放在内层;

答案:(b),循环次数多的放在内层能减少cache更新数据的次数,从而效率相对较高。

2.请简述以下两个 for 循环的优缺点。(山大华天,登虹科技)

(1)、

for(i=0; i<N; i++)

{

    if(condition)

        DoSomething();

    else

        DoOtherthing();

}

(2)、

if(condition)

{

    for(i=0; i<N; i++)

        DoSomething();

}

else

{

    for(i=0; i<N; i++)

        DoOtherthing();

}

答案:前者代码简洁,但判断嵌套在循环里使得循环总需要等待先判断。后者代码虽然略显繁琐,但是在判断之后只进行循环,相对于前者循环判断交叉进行拥有更快的效率。

3.do-while语句的循环体( ) (鲁科安全)

A. 可能一次都不执行           B. 至少执行一次

C. 由循环条件决定次数       D. BC均正确

答案:B

分析:先执行再判断,所以无论判断结果是真是假至少都会执行一次。

4.求1~100的和,写作for(int s=0,i=1;________;++i) ________;(富士安全)

答案:i<=100   s+=i

分析:规定范围,确定i最大到100,通过“+=”在每次循环之中将输出的i加到s上从而实现求和。

5.程序如下,运行结果为:(中科四平)

#include <stdio.h>

#define N 4

void main()

{

    int i;

    int x1=1,x2=2;

    printf("\n");

    for(i=1;i<=N;i++)

    {

        printf("%4d%4d",x1,x2);

        if(i%2==0)

        printf("\n");

        x1=x1+x2; //3 8 21

        x2=x2+x1; //5 13 34

    }

}

答案 :    1    2    3    5

                8  13  21  34

分析:两次循环换行一次。

6.有以下程序段,int k=0; while(k=1) k++;则while循环执行的次数是( ) (杭州快越科技,山东大齐通讯,山东信通电子)

A. 一次也不执行                    B. 执行1次

B. 有语法错,不能执行       D. 无限次

答案:A

分析:while判断的表达式为0,判断结果为假,循环不执行

7.语句while(!E)中表达式!E等价于( ) (杭州快越科技)

A.E == 1           B. E != 0           C. E != 1           D. E==0

答案:D

分析:E不为0判断为假,E为0判断为真。A,E只在不为1的时候判断为假B,E为0时判断为假,E不为0时判断为真。C,E不为1时判断为真,E为1时判断为假D,E为0时判断为真,E不为0时判断为假。综上D

8.goto语句有什么作用?(深圳元征信息科技)

答案:无条件的跳转到指定标签代码处,并在跳转之后的代码处继续往下执行代码。

9.语句for( ;1 ;) 有问题吗?它是什么作用?(深圳元征信息科技)

答案:没有问题,它是for循环中死循环的一种写法。用于重复执行for循环语句中的代码。

10.下面代码是否有错,如果有,错在哪里?(深圳元征信息科技)

int main()

{

   float a=3;

    switch(a)

    {

      case 3:

         printf("a");

    }

    return 0;

}

答案:错,switch后的表达式可以是任意表达式,但是其结果只能是整型或字符。题目中的虽是合法的表达式,但是其实际的结果却是浮点数,不符合switch语句的正常使用规范。

11.break 语句的正确的用法是 ( ) (福建新大陆)

A. 无论在任何情况下,都中断程序的执行,退出到系统下一层

B. 在多重循环中,只能退出最靠近的那一层循环语句

C. 跳出多重循环

D. 只能修改控制变量

答案:B

分析:break语句用于跳出与之最近的循环结构和switch语句,所以选B

12.若输入 B,则以下程序运行后的输出结果是 ( ) (智洋创新)

int main(void)

{

    char grade;

    scanf("%c", &grade);

    switch (grade)

    {

        case 'A':

                            printf(">=85");

        case 'B':

        case 'C':

                            printf(">=60") :

                   case 'D':

            printf("<60");

        default:

            printf("error.");

    }

}

A. error. B. >=60   C. >=85   D. >=60<60error.

答案:D

分析:输入为‘B’符合分支case‘B’:执行相应语句,但由于后面的语句都没有break返回,所以switch结构后面的语句全部执行,从而输出结果与D相同。

13.下列各个错误中,哪一个不属于编译错误 ( ) (苏州特点电子科技)

A. 改变x 原值 3 为 5 ,写作“ x==5 ;”

B. 花括号不配对

C. 复合语句中的最后一条语句后未加分号

D. 变量有引用、无定义

答案:A

分析:A,虽然按照要求是错误的书写方式,但是书写格式符合规范,并不会使编译错误。

14.下面代码的功能是输出以下形式的金字塔图案是:(华三外协,紫光云数,新华三)

*

***

*****

*******

int  i, j;

for(i = 1; i<= 4; i++)

{

        for(j = 1; j<= 4 - i; j++)

        {

            printf(“ “);

        }

        for(j = 1; j <= _______; j++)

        {

            printf(“*”);

        }

        printf(“\n”);

}

在下划线处应填入的是:(  )

A. i           B. 2 * i - 1                  C. 2 * i + 1                 D. i + 2

答案:B每行与i值相关,空格数为4-i个,*数为2i-1个

分析:i为1234时空格j为3210*j为1357构成等差为2的等差数列。

15.请实现如下功能:(威海精讯畅通)

输入一排n个数,第一个数为后面所有的数的个数。统计这后面所有数中,正数、零和负数的个数。

输入:

XXX

输出:

正数个数:XXX

零个数:XXX

负数个数:XXX

示例:

输入 7 -2 0 6 5 -3.2 0 2.5

程序输出 正数个数:3

零个数:2

负数个数:2

答案:

分析:第一个输入的数作为循环次数,后面对输入的值进行正负判断。虽然未对第一个输入的数进行判断,但实际上当第一个数为小于等于零时后面直接得出结果三种数的个数均为0

16.请实现一下功能:(威海精讯畅通)

输入任意两个数,输出两数之间(包括这两个数)偶数之和。

输入:

XXX XXX

输出:

XXX 到XXX偶数之和为:XXX

示例:

输入 1 10

程序输出 1到10偶数之和为:30

答案:

分析:输入两数需要比较,从小到大确定循环上下限,然后通过传参i进行等量的数值计算保证最后输出中两初始输入的解过不变。而循环体是累加能被2整除的数。

17.编程求 2000 以内的所有“完数”。所“完”是指一个数恰好等于它的因子值之和,例如:6是完数,因为 6=1+2+3。 (戈尔特西斯)

答案:

分析:见注释

18.完成一个 32 位整数型数按 10 进制倒置的程序;当越界后返回值为 0。 (北京君正集成电路)

例如: 输入 1234;输出为 4321

输入-1234;输出为-4321

输入为 1023456789,输出为 0

答案:

分析:通过取余数得到各位的数值,再循环乘以十实现整体逆序。首先注意输入值不要超过所设定的值的范围。

;