2.12 分支、循环练习

1、选择题

1.1、以下程序的输出结果是  A  

    main()

   {  

 int k1=1,k2=2,k3=3,x=15;

if(!k1)  x--;

else if(k2)

 if(k3)  x=4;

else x=3;

       printf(“x=%d\n”,x);

    }

   A x=4      B x=15     C x=14      D x=3

解析:if(!k1) x--; 检查 k1 是否为0。因为 k1 的值为1,所以该条件不成立,x 的值不变(仍为15)。接下来,else if(k2) 检查 k2 是否为非0值。因为 k2 的值为2,该条件成立。进入 if(k3) x=4;k3 的值为3,所以该条件成立,x 被赋值为4。由于 k3 的条件成立,所以 else x=3; 这部分代码不会被执行。所以打印出x=4

1.2、有以下程序,while循环执行   A   次。

int   main()

{

int  k=2; 

while(k=1)  

printf(“%d”,k);  

k--;  

printf(“\n”);

}

 A) 无限次       B) 2  C 1     D 0

解析:while 循环的条件是 k=1,这是一个赋值表达式,它将 k 的值设置为 1,并返回 1 作为表达式的值。赋值表达式的结果是被赋的值,因此 k=1 的结果是 1,这是一个非零值,所以 while 循环的条件始终为真。由于 while 循环的条件始终为真,循环将无限次地执行,直到被外部因素(如用户干预或程序崩溃)中断。每次循环迭代都会执行 printf(“%d”,k); 语句,打印当前 k 的值,然后 k-- 语句将 k 的值减 1。然而,由于 while 循环的条件是 k=1(它总是将 k 重新设置为 1),k 的值永远不会减小到 0 或负数,因此循环不会自然终止。所以,while 循环将执行无限次

1.3有以下程序

int  main()

{

   int  a=1,b;

   for(b=1;b<=10;b++)

   {

      if(a>=8)   break;

      if(a%2==1)  {  a+=5;  continue;} 

      a-=3;             

   }

   printf("%d\n",b);

}

程序运行后的输出结果是       B      

A)3     B)4    C)5     D)6

解析:在每次循环中,程序首先检查a是否大于等于8。如果是,则使用break语句退出循环。如果不是,则继续执行。接下来,程序检查a是否是奇数(即a%2==1)。如果是奇数,a增加5,并使用continue语句跳过当前循环的剩余部分,进入下一次循环。如果a是偶数,则a减去3,然后继续执行下一次循环。第一次循环:a是奇数,a加5,a变为6,continue,跳过剩余部分,进入下一次循环。第二次循环:a是偶数,a减3,a变为3,继续执行下一次循环。第三次循环:a是奇数,a加5,a变为8,continue,跳过剩余部分,进入下一次循环。a大于等于8,break,退出循环。所以最终b的值是4

1.4有以下程序

#include <sthio.h>

int  main()

{

int s=0,n;

for (n=0;n<3;n++)     0   1  2

{

switch(s)

{ case 0:

case 1:s+=1;

case 2:s+=2;break;

case 3:s+3;

case 4:s+=4;

}

printf((%d\n,s);

}

}

程序运行后的结果是        C       

A)1,2,4 B) 3,10,10 C) 3,6,10 D) 3, 7, 7

解析:初始时,s 被赋值为 0。进入第一个 for 循环迭代(n = 0)。s 的值是 0,进入 case 0:,执行 s += 1;s 变为 1。由于没有 break 语句,继续执行 case 2:,执行 s += 2;s 变为 3。输出 s 的值,即 3。进入第二个 for 循环迭代(n = 1)。s 的值是 3,进入 case 3:,执行 s += 3;s 变为 6。输出 s 的值,即 6。进入第三个 for 循环迭代(n = 2)。s 的值是 6,进入 case 4:,执行 s += 4;s 变为 10。输出 s 的值,即 10

1.5、有以下程序

#include<stdio.h>

int  main()

{int a=1b=0;

if(-a) b++;

else if(a=0)b+=2else b+=3;

printf("%d\n"b)

)

程序运行后的输出结果(   B   )。 

A)0 B)1 C)2 D)3

解析:int a=1, b=0;:变量 a 初始化为1,变量 b 初始化为0。if(-a) b++;:由于 -a 的值是 -1(因为 a 是1),这是一个非零值,所以条件为真,执行 b++,此时 b 的值变为1。else if(a==0) b+=2;和else b+=3;都不会执行,所以打印出b为1

1.6有以下程序

#include<stdio.h> 

int  main()

{

int a=7

while(a--)

printf("d\n"a)

}

程序运行后的输出结果(  B  )

A)-1 B)0 C)1 D)7

解析:while(a--);:这是一个 while 循环,其条件是 a--。在每次循环迭代中,a 的值会减1,并且由于 a-- 是一个后缀递减操作,它在表达式中保持其原始值(在递减之前)。循环将一直执行,直到 a 的值变为0。由于 a 初始值为7,循环将执行7次。printf("%d\n", a);:在 while 循环结束后,a 的值将是0(因为循环执行了7次,每次减1)。这行代码将打印出 a 的值,即0。因此,程序运行后的输出结果是 0

2、填空题

  2.1、以下程序运行结果是(  2  )。

#include

int  main()

{

int x=2,y=-1,z=2;

if(x

if(y<0) z=0; 

else    z+=1;

printf("%d\n",z);

}

解析:初始时,x 的值为 2,y 的值为 -1,z 的值为 2。程序首先检查 if(x。由于 x 的值是 2,而 y 的值是 -1,2 不小于 -1,所以这个条件为假。因此,接下来的 if(y<0) z=0; else z+=1; 代码块不会被执行。所以,z 的值保持为初始值 2,并且最终程序输出 z 的值,即 2。

2.2以下程序的执行结果是(  20  )。

#include

int   main()

{

int a,b,c,d,x;

a=c=0;

b=1;

d=19;

if(a)  d=d-10;

if(!c)

x=15;

else 

x=25;

d++ ;  

printf("d=%d\n",d);

}

解析:由于 a 的值为 0,所以条件 if(a) 为假,不会执行 d=d-10d 的值仍然是 19。由于 c 的值为 0,!c(即 c 的非值)为真,因此会执行 x=15,将 x 的值设置为 15。d 的值增加 1,从 19 变为 20。最后,程序输出 d 的值:20

2.3以下程序的执行结果是(   first      third    )。

#include

int main()

int x=1,y=0;

switch(x)

{

case 1:

switch(y)

{

case 0:printf("first\n");break;

case 1:printf("second\n");break;

}

    case 2:printf("third\n");

}

}

解析:初始化变量 x 为 1,y 为 0。进入外层 switch 语句,检查 x 的值。由于 x 的值为 1,执行 case 1: 下的代码块。进入内层 switch 语句,检查 y 的值。由于 y 的值为 0,执行 case 0: 下的 printf("first\n");,并遇到 break; 语句,退出内层 switch 语句。由于内层 switch 语句中没有其他 break; 语句来退出外层 switch 语句,因此会继续执行外层 switch 语句中 case 1: 之后的代码,即 case 2: 下的 printf("third\n");。因此,程序的执行结果是:first  third

2.4 以下程序在输入52之后的执行结果是(  s=2,t=3  )。

#include

int  main()

{

int s,t,a,b;

scanf("%d,%d",&a,&b);

s=1;

t=1;

if(a>0)  s=s+1;

if(a>b)  t=s+t;

else if(a==b) 

t=5;

else 

t=2*s;

printf("s=%d,t=%d\n",s,t);

}

解析:因为a是5,大于0,所以s将增加1,变为2。if(a>b):因为a是5,b是2,所以a大于b,条件成立,t将被赋值为s+t,即2+1=3。由于if(a>b)的条件已经成立,后面的else ifelse块将不会被执行。最后,程序输出st的值:s=2,t=3

2.5 以下程序的执行结果是(   #   )

#include

int  main()

{

int a=2,b=7,c=5;

switch(a>0)

{

case 1:

switch(b<0)

   {

       case 1:printf("@");break;

       case 2:printf("!");break;

   }

case 0:

switch(c==5)

   {

       case 0:printf("*");break;

           case 1:printf("#");break;

       case 2:printf("$");break;

   }

default:printf("&");

}

printf("\n");

}

解析:因为 a 的值是 2,显然 a > 0 是真的,所以外层 switch 语句将执行 case 1: 下的代码块。接下来,我们进入内层第一个 switch 语句:由于 b 的值是 7,b < 0 是假的,因此内层第一个 switch 语句不会执行任何 case。由于缺少 break 语句,控制流将继续执行到外层 switch 语句的下一个 case。现在,进入外层 switch 语句的 case 0:因为 c 的值是 5,所以 c == 5 是真的,内层第二个 switch 语句将执行 case 1: 下的代码块输出字符 #,并且由于有 break 语句,内层第二个 switch 语句结束。

2.6 以下程序运行结果是(   5   5   5   )。

#include 

int main()

{

int x,y=1;

if(y!=0) x=5;

printf("\t%d\n" ,x);

if(y==0) x=4;

else x=5;

printf("\t%d\n" ,x);

x=1;

if(y<0)

if(y>0) x=4;

else x=5;

printf("\t%d\n" ,x);

}

解析:第一个 if 语句检查 y 是否不等于0。由于 y 的值为1,这个条件为真,因此 x 被赋值为5。第一个 if 语句检查 y 是否不等于0。由于 y 的值为1,这个条件为真,因此 x 被赋值为5。打印 x 的值,此时 x 为5。第二个 if-else 语句检查 y 是否等于0。由于 y 的值为1,这个条件为假,因此执行 else 分支,x 再次被赋值为5。再次打印 x 的值,此时 x 仍为5。第三个 if-else 语句是嵌套的。首先检查 y 是否小于0,这个条件为假,因此不会执行内部的 if (y > 0) 分支。而是直接执行 else 分支,将 x 赋值为5。最后,打印 x 的值,此时 x 仍为5。

2.7 以下程序的运行结果是(   4 -2 4 0 -2 -2   )

#include

int   main()

{

int x , y=-2, z=0;

if ((z=y)<0)  x=4;

else if (y==0)

x=5;

else 

x=6;

printf("\t%d\t%d\n" ,x, z);

if(z=(y==0))

x=5;

x=4;

printf("\t%d\t%d\n" ,x,z);

if(x=z=y)  x=4;

printf("\t%d\t%d\n" ,x,z);

解析:变量y被初始化为-2,z被初始化为0。在if语句中,(z=y)y的值-2赋给z,并返回-2,因此(z=y)<0为真,所以x被赋值为4。z的值为-2。输出为4 -2,z=(y==0)会检查y是否等于0,由于y的值为-2,所以(y==0)为假,即0。因此,z被赋值为0,并且if语句的条件为假,所以不会执行x=5。接下来,x被明确赋值为4。输出为4 0,x=z=y会先将y的值-2赋给z,然后再将z的值-2赋给x。因此,xz现在都等于-2。然后,if(x=z=y)的结果为-2,这是一个非零值,所以条件为真,但由于x=4前面没有else,所以这个赋值不会执行。输出为-2 -2,

3编程题、

3.1 编写程序实现:服装店经营套服,也单件出售,若买的不少于50套,每套80元;不足50套的每套90元;只买上衣每件60元;只买裤子每条45元。输入所买上衣c和裤子t的件数,计算应付款m

#include 
using namespace std;
int main()
{
    int c,t;
    double m;
    //输入上衣和裤子的数量
    cout << "请输入购买上衣的数量: ";
    cin >> c;
    cout << "请输入购买裤子的数量: ";
    cin >> t;
    //根据输入计算应付款
    int suits=c=50)
    {
        //如果套服数量不少于50套,每套80元
        m=suits*80.0;
    }
    else
    {
        //如果套服数量不足50套,每套90元
        m=suits*90.0;
    }
    //加上剩余上衣和裤子的费用
    m+=tops*60.0;
    m+=pants*45.0;
    //输出应付款
    cout << "应付款为: " << m << "元" << endl;
    return 0;
}

结果:

4.思考题

4.1  下面是C语言中两种if语句判断方式。请问哪种写法更好?为什么?

     int n;

     if (n == 10) // 第一种判断方式

     if (10 == n) // 第二种判断方式

答:在C语言中,两种if语句的判断方式都是有效的,并且可以产生相同的结果。然而,从编程习惯和可读性的角度来看,通常推荐使用“常量在前,变量在后”的写法,即第二种判断方式 if(10==n)。因为:

  1. 防止误操作:将常量放在前面可以防止因为误输入赋值操作符(=)而导致的逻辑错误。例如,如果你不小心写成了 if (n = 10),这实际上是一个赋值操作,而不是比较操作,这将导致n被赋值为10,而条件判断始终为真。但如果使用 if (10 = n),编译器会立即报错,因为这个表达式是不合法的。
  2. 提高可读性:将常量放在前面是一种广泛接受的编程习惯,这有助于其他开发者更快地理解代码的逻辑。这种写法在C语言社区中更为常见。
  3. 一致性:保持代码风格的一致性对于维护代码的可读性和可维护性非常重要。如果你在一个项目中混合使用这两种写法,可能会使代码看起来混乱。

综上所述,虽然两种写法在功能上是等效的,但从避免错误和提高代码可读性的角度来看,推荐使用第二种判断方式 if(10==n)

4.2   思考一下,计算1+2+3+……+100的和,最优化的算法是? 编程实现

答:C++中,计算1到100的和的最优化算法是使用高斯求和公式,也被称为等差数列求和公式。这个公式是:S=n/2*(a1+an)其中,S 是和,n 是项数,a1 是第一项,an 是最后一项。对于1到100的序列,n=100a1=1an=100。将这些值代入公式,我们得到:S=100/2*(1+100)=50*101=5050

#include 
using namespace std;
int main()
{
    int n=100;//求和的总项数
    int a1 = 1;//首项a1的值
    int an = 100; //尾项an的值
    int sum = n/2 * (a1 + an);//高斯公式
    cout << "The sum of numbers from 1 to 100 is: " << sum << endl; 
    return 0;
}

结果:

4.3   嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?

答:在程序末尾加一句while(1);

while(1)创建了一个无限循环,因为1在C语言中始终为真。printf语句会在每次循环迭代时执行,打印出一条消息。由于循环是无限的,所以return 0;语句永远不会被执行。

注意,无限循环可能会消耗大量的系统资源,因此在嵌入式系统中使用时需要格外小心。在大多数情况下,你应该在循环中添加一些条件来中断循环,或者提供一个退出循环的方法。

你可能感兴趣的:(算法)