循环嵌套习题

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语句的循环体( D   ) 

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

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

4、求1~100的和,写作for(int s=0,i=1;________;++i) ________;

for(int   s=0,i=1; i<=100; ++i)

s=s+i;

 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

    }

}

 运行结果:

 6、有以下程序段,int k=0; while(k=1) k++;则while循环执行的次数是( D   ) 

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

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

解析: k=1是赋值语句,所以k始终等于1,一直循环满足条件

7、语句while(!E)中表达式!E等价于(  ) 

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

8、goto语句有什么作用?

       goto语句可以随意跳转,通过和if语句的有效组合也可以实现循环结构。但过多使用goto语句,很容易造成程序结构混乱。

9、语句for( ;1 ;) 有问题吗?它是什么作用?

        有问题,可以省略表达式1和表达式3,但表达式2为1时,执行死循环。

10、下面代码是否有错,如果有,错在哪里?

int main()

{

   float a=3;

    switch(a)

    {

      case 3:

         printf("a");

    }

    return 0;

}

        有错,由于 switch后面的表达式必须是整形或字符型,但switch(a),的常量a是一个浮点型。

 11、break 语句的正确的用法是 (   B  ) 

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

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

        C. 跳出多重循环

        D. 只能修改控制变量

12、若输入 B,则以下程序运行后的输出结果是 (  D  ) 

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. 

        解析:由于没有break语句,从case 'B'一直执行到default结束,输出>=60<60error.

13、下列各个错误中,哪一个不属于编译错误 (  A  )

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

B. 花括号不配对

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

D. 变量有引用、无定义

解析:B:花括号必须是配对的

           C:在C语言中语句结束后加分号

           D:变量应该引用和定义

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”);

}

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

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

        解析:可以看出第一行有1个*,第二行有3个*,第二行有5个*,第二行有7个*

每行递增两个*,此时for循环的控制条件应该是2 * i - 1   

15、请实现如下功能:

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

输入:XXX

输出:正数个数:XXX

零个数:XXX

负数个数:XXX

示例:输入 7 -2 0 6 5 -3.2 0 2.5

程序输出 正数个数:3

零个数:2

负数个数:2

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
	int n;
	float num;
	
	printf("请输入一行数:");
	scanf("%d",&n);   //输入n个数
	
	int count1=0 ,count2= 0 ,count3=0;
	
	for(int i=0;i<n;i++)
	{
		scanf("%f",&num);
		if(num>0)
            //统计正数个数
			count1++;
		else if(num==0.0)
            //统计0的个数
			count2++;
		else
            //统计负数个数
			count3++;
	}
	printf("正数个数为:%d\n",count1);
	printf("零的个数为:%d\n",count2);
	printf("负数个数为:%d\n",count3);
 
	return 0;
}

 

16、请实现一下功能:

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

输入:XXX XXX

输出:c

示例:输入 1 10

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

#include <stdio.h>

int main()
{
	int start;  //起始数
   
	int end;     //结束数
	
	int sum=0;
	scanf("%d %d",&start,&end);
	for(int i=start;i<=end;i++)  //起始数与结束数两者之间的数
	{
	if(i%2==0)   //判断是否偶数值
	sum=sum+i;   //求和
	}
	printf("sum=%d\n",sum);
	return 0;
}

 

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

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
	int i ,sum=0;
	for(i=1;i<=2000;i++)    //输出1到2000以内的所有数
	{
		int j;
		for(j=1;j<i;j++)   //统计i的真因子之和
		{
		    if(i%j==0)
		    {
			sum=sum+j;     
		    }
		}
		if(sum==i)    //判断真因子之和是本身,在输出
		{
			printf("%d是完数\n",i);
		}

		sum=0;
	}

	return 0;
}

18、完成一个 32 位整数型数按 10 进制倒置的程序;当越界后返回值为 0

例如: 输入 1234;输出为 4321

输入-1234;输出为-4321

输入为 1023456789,输出为 0

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
int main(int argc, const char *argv[])
{
	int n,sum=0;
	printf("请输入一个数:");
	scanf("%d",&n);

	if(n<INT_MIN||n>INT_MAX/10)     //超过int的取值范围
	{
		printf("0\n");      	//输出0
		return 0;
	}

	while(n!=0)
	{
		int ys=n%10;    			//计算余数
		n=n/10%10;                 //取十位
        sum =sum*10+ys;             //sum求和
	}
	printf("逆序数字是%d\n",sum);
	return 0;
}

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值