9.4C语言循环结构习题

1.考虑到多重循环对程序效率的影响,以下哪种实现效率较高?为什么?

(a)循环次数大的放在外层,循环次数小的放在内层;

(b)循环次数小的放在外层,循环次数大的放在内层;

答:b方法效率高。这种布局方式能够更有效的利用缓存,减少不必要的重复计算,从而提高程序的执行效率。

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均正确

答案:D

解析:do-while循环体遵循先执行后判断,所以至少有一次执行A不对。

4.求1~100的和,写作for(int s=0,i=1;__i<=100_;++i) _{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循环执行的次数是( ) 

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

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

答案:D

解析:while里的条件为k=1相当于为真导致进入死循环无限次执行。

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

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

答案:D !E=0所以等价于E==0

8.goto语句有什么作用?

答:实现程序的跳转,可以跳转到任意位置开始执行后面程序段。

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

答:书写格式没有问题但循环条件永远为真,不停地进行循环操作,除非循环体中有强制退出循环的语句才能终止循环,其实功能就相当于while(1)。

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

int main()

{

   float a=3;

    switch(a)

    {

      case 3:

         printf("a");

    }

    return 0;

}

答:switch中括号内的表达式,其值的类型应为整数类型,而该函数定义的a为浮点型。

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

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

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

C. 跳出多重循环

D. 只能修改控制变量

答案:B

解析:与continue不同的是,break是跳出整个循环过程,如果是多重循环则只能退出最靠近的那一层循环。

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.

答案:B

解析:因为题目中没有break,switch从上向下遍历到B后从caseB一直执行到default。结果是>=60<60error。

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

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

B. 花括号不配对

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

D. 变量有引用、无定义

答案:A

解析:编译错误是指再编译过程中,代码不符合语法规则或存在逻辑错误无法生成可执行文件。A选项是想要将5这个值赋予给x。而x==5是判断x是否等于5。编译过程中不会报错。

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

解析:行数*2-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[])
{
//定义c1、c2、c3作为计数器
	int c1=0,c2=0,c3=0;
//n当作第一个输入的数字,又作循环次数
	int n;
//题目中有小数所以设置一个浮点型变量
	float x;
//输入第一个数字,也是整个数列的总数字个数
	scanf("%d ",&n);
//设置循环条件依次输入
	while(n!=0){
			scanf(" %f",&x);
//每输入一个做一次判断正数负数还是零
			if(x<0){
				++c1;
			}
			else if(x>0){
				++c2;
			}
			else{
			c3=n-c1+c2;
			}
//每完成一次判断n自减1,直到n为零时跳出循环完成输出
			n--;
	}
	printf("正数个数为:%d\n零个数为:%d\n负数个数为:%d\n",c2,c3,c1);
	return 0;
}

16.请实现一下功能:

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

输入:

XXX XXX

输出:

XXX 到XXX偶数之和为:XXX

示例:

输入 1 10

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

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
//定义a,b作为起始输入的两个数字
	int a,b;
//sum作为偶数和
	int sum=0;
//设置t作为交换变量,方便进行交换
	int t;
	printf("请输入两个整数中间用空格隔开\n");
	scanf("%d %d",&a,&b);
//首先判断如果输入的两个数字不是从小到大输入需要进行交换
	if(b<a){
	t=a;
	a=b;
	b=t;
	}
	int x;
//定义循环条件,x每次自加2保证每次sum加的数为偶数
	for(x=a;x<=b;x+=2){
//判断第一个数字是否为奇数,如果是则减掉因为循环中初始就自加一个x
		if(x%2!=0){
			sum=sum-x;
			}
//判断最后一个数字是否为偶数如果是提前先加上
			if(b%2==0){
				sum=sum+b;
				}
			sum+=x;
	}
	printf("%d到%d的偶数和是%d",a,b,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,j,sum=0;
	printf("1-2000以内的完数有:\n");
//设置最外层循环,从2-1000一个数一个数的执行判断
	for(i=2;i<=1000;i++)
	{
//每次循环前清空因数和sum
		sum=0;
//设置第二层循环,j作为除数依次与被除数i作取余运算找出因数
		for(j=1;j<i;j++)
		{
//如果余数为0则为因数将其与sum相加
			if(i%j==0){
			sum+=j;
			}
		}
//如果sum因数和等于i被除数则找到一个完数
		if(sum==i)
		{
		printf("%d ",i);
		}
	}
	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);
//判断题目中如果越界输出0
	if(n<INT_MIN||n>INT_MAX/10){
	printf("0\n");
//因为越界直接结束运行
	return 0;
	}
//设置while循环条件是当n等于0时跳出循环
	while(n!=0){
//定义余数,执行一次取出个位数
	int ys = n%10;
//每次乘10类似于sum左移1位加余数
	sum = sum*10+ys;
//将n取商,删掉上面得到的余数,使得可以跳出循环直到n没有商变为0
	n=n/10;
	}
	printf("逆序后的数字是%d\n",sum);
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值