Day05:C语言学习作业

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

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

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

答案:

循环小的在外层效率高,因为CPU中会对循环次数进行缓存,当循环多后CPU需要进行多次缓存,减少效率


请简述以下两个 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();

}

答案:

第一个循环:书写简洁,减少程序的耦合性,便于阅读

第二个循环:相较第一个循环,这个循环事件复杂度更低,执行效率更好,只需执行一个if就可以进入for循环 


do-while语句的循环体( ) 

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

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

答案:D

分析:do while至少do一次再判断条件,while先判断再循环


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

答案:i<=100   s+=i

分析:1~100的和,包括100,所以要包括=


程序如下,运行结果为:

#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; 

        x2=x2+x1; 

    }

}

答案:

1 2 3 5

8 13 21 34

分析:i%2==0是判断偶数,则if中是偶数换行


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

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

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

答案:D

分析:循环的判断条件是赋值符号,k=1,循环内k++,恒为真,无限次循环


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

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

答案:D

分析:!E为真,则E为假,所以E==0


goto语句有什么作用?

答案:无条件跳转到标记处,等于进行简单循环


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

答案:写法上没有问题,这个主要是死循环,需要设置断点,不然就会一直循环下去


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

int main()

{

   float a=3;

    switch(a)

    {

      case 3:

         printf("a");

    }

    return 0;

}

答案:有错,switch只能处理整形数据,a是float浮点数 


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

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

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

C. 跳出多重循环

D. 只能修改控制变量

答案:B


若输入 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

分析:switch需要设置break断点,不然会从复合条件的地方,一直往下执行


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

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

B. 花括号不配对

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

D. 变量有引用、无定义

答案:A

解析:A是逻辑错误


下面代码的功能是输出以下形式的金字塔图案是:

*

***

*****

*******

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

分析:金子塔形,横线处的 j 是输出 * 的地方,规律是1 3 5 7,则B最符合;


请实现如下功能:

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

输入:

XXX

输出:

正数个数:XXX

零个数:XXX

负数个数:XXX

示例:

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

程序输出 正数个数:3

零个数:2

负数个数:2

//这里其实可以使用数组的方式记录键盘输入的内容
//但根据现在的进度,只能使用简单的记录方法
//而且使用数组来进行计数有种得不偿失的感觉,没必要
//当我们需要输出数值的时候就很使用

//创建正数,负数,零的计数容器
int positive = 0,negative = 0,zero = 0;

//创建记录和比较容器
double temp;

//创建数字计数容器,并通过键盘键入记录
int count;
printf("How many numbers do you want to enter?\n");
scanf("%d",&count);

//记录你输入的数字,并依次对比,通过if函数判断并计数,断点是count的数量
printf("Enter %d num:\n",count);
for (int i = 0; i < count; ++i) {
    scanf("%lf",&temp);
    if(temp > 0){
        positive++;
    } else if(temp == 0){
        zero++;
    } else if(temp < 0){
        negative++;
    }
}

//打印结果
printf("The number of Positive number : %d\n
        The number of Negative number : %d\n
        The number of Zero number : %d\n",positive,negative,zero);

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

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

输入:

XXX XXX

输出:

XXX 到XXX偶数之和为:XXX

示例:

输入 1 10

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

//创建num1 num2容器,并通过键盘键入
int num1,num2;
printf("Enter two numbers:\n");
scanf("%d %d",&num1,&num2);

//规定大小顺序为num1 < num2
if(num1 > num2){
    num1 = num2 + num1;
    num2 = num1 - num2;
    num1 = num1 - num2;
}

//创建并初始化和容器
int sum = 0;

//遍历num1 到 num2 中所有的数字
for (int i = num1; i <= num2; ++i) {

    //当是偶数的时候相加
    if(i % 2 ==0)
        sum += i;
}

//打印结果
printf("The sum of even numbers between %d and %d is : %d\n",num1,num2,sum);

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

//在这里提一个地方,for循环内计算完数的起始节点都为1;不能为0
//为0可以正常编译运行,但无法得出结果

//定义和容器,并初始化
int sum = 0;

//外层循环时在限定范围内循环
for (int i = 1; i < 2000; ++i) {
        
    //内层循环是对当前数进行计算将其所有因子求和
    for (int j = 1; j < i; ++j) {
        if(i % j == 0){
            sum += j;
        }
    }

    //当因子和等于当前值的时候,输出
    if(sum == i)
        printf("%d ",sum);
    
    //重置和容器
    sum = 0;
}

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

例如: 输入 1234;输出为 4321

输入-1234;输出为-4321

输入为 1023456789,输出为 0

//这题有个难点,保证值不越界,我看了很多解释都没有说明白
//其实就一句话,保证倒置后的结果也不越界
//所有的结果都让我们除个十就行,但是除10后会少很多数,但没办法,为了保证正确,需要丢失一点精度

//创建数字容器,并从记录键盘键入值
int num;
printf("Enter a number:\n");
scanf("%d",&num);

//规定范围,保证在int的范围内,正数需要除10,保证倒置后的结果也不越界
if(num < (int)pow(2,-31) || num > ((int)pow(2,31) - 1) / 10){
    printf("Incorrect input!\n");
    return 0;
}

//创建结果容器
int result = 0;
//创建余数容器
int reminder;

//循环计算,依次求出最小位的值并乘10
while (num){
    reminder = num % 10;
    result = result * 10 + reminder;
    num /= 10;
}

//输出结果
printf("Result is %d\n",result);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值