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<stdio.h>

int  main()

{

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

if(x<y)

if(y<0) z=0; 

else    z+=1;

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

}

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

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

#include<stdio.h>

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<stdio.h>

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<stdio.h>

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<stdio.h>

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 <stdio.h>

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<stdio.h>

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 <iostream>
using namespace std;
int main()
{int c,t;double m;//输入上衣和裤子的数量cout << "请输入购买上衣的数量: ";cin >> c;cout << "请输入购买裤子的数量: ";cin >> t;//根据输入计算应付款int suits=c<t?c:t;//计算可以组成多少套服int tops=c-suits;//计算剩余上衣数量int pants=t-suits;//计算剩余裤子数量if(suits>=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 <iostream>
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;语句永远不会被执行。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/680350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式Qt Qt Creator安装与工程介绍

一.Qt概述 什么是Qt&#xff1a;Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 二.Qt Creator下载安装 下载地址&#xff1a;Index of /a…

如何编译zlib?

学习文章&#xff1a;windows zlib库编译步骤_nmake 编译 zlib-CSDN博客 记录关键步骤&#xff1a; 打开 执行&#xff1a; 先cd到该目录&#xff1a; C:\Users\xxx\Downloads\zlib-1.2.11\contrib\masmx86 (这是我的zlib源码的下载路径&#xff09; 执行bld_ml32.bat 再…

【每日一题】03 不同路径Ⅱ(DP2)

问题描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上…

LeetCode.145. 二叉树的后序遍历

题目 145. 二叉树的后序遍历 分析 上篇文章我们讲了前序遍历&#xff0c;这道题目是后序遍历。 首先要知道二叉树的后序遍历是什么&#xff1f;【左 右 根】 然后利用递归的思想&#xff0c;就可以得到这道题的答案&#xff0c;任何的递归都可以采用 栈 的结构来实现&#…

Python||数据分析之pyecharts 绘图(词云、气泡)

1. echarts 和 Pyecharts 简介 1.1echarts 简介: • echarts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求。 • echarts 遵循 Apache-2.0 开源协议,免费商用。 • ECharts 最初由百度团队开源,并于 2018 年初捐赠给 Apache 基金会,成为 AS…

【Tauri】(2):使用Tauri应用开发,使用开源的Chatgpt-web应用做前端,使用rust 的candle做后端,本地运行小模型桌面应用

视频演示地址 https://www.bilibili.com/video/BV17j421X7Zc/ 【Tauri】&#xff08;2&#xff09;&#xff1a;使用Tauri应用开发&#xff0c;使用开源的Chatgpt-web应用做前端&#xff0c;使用rust 的candle做后端&#xff0c;本地运行小模型桌面应用 1&#xff0c;做一个免…

ClickHouse--03--数据类型

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 数据类型1. Int2.FloattoFloat32(...) 用来将字符串转换成 Float32 类型的函数toFloat64(...) 用来将字符串转换成 Float64 类型的函数 3.DecimaltoDecimal32(value…

视觉开发板—K210自学笔记(五)

本期我们来遵循其他单片机的学习路线开始去用板子上的按键控制点亮LED。那么第一步还是先知道K210里面的硬件电路是怎么连接的&#xff0c;需要查看第二节的文档&#xff0c;看看开发板原理图到底是按键是跟哪个IO连在一起。然后再建立输入按键和GPIO的映射就可以开始变成了。 …

Linux第48步_编译正点原子的出厂Linux内核源码

编译正点原子的出厂 Linux 内核源码&#xff0c;为后面移植linux做准备。研究对象如下&#xff1a; 1)、linux内核镜像文件“uImage” 路径为“arch/arm/boot”&#xff1b; 2)、设备树文件“stm32mp157d-atk.dtb” 路径为“arch/arm/boot/dts” 3)、默认配置文件“stm32m…

C++入门篇——类与对象重点解析(中篇)

1. 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 class Date {}; 默认成员函数&#xff1a;用户没有显式实现&a…

WordPress修改所有用户名并发送邮件通知的插件Easy Username Updater

前面跟大家介绍了『如何修改WordPress后台管理员用户名&#xff1f;推荐2种简单方法』一文&#xff0c;但是对于有很多用户的站长来说&#xff0c;操作有点复杂&#xff0c;而且无法发邮件通知对方&#xff0c;所以今天boke112百科向大家推荐一款可以直接在WordPress后台修改所…

全面详细对比@Resource和@Autowired

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Resource和Autowired概述 在Java的Spring框架中&#xff0c;Resource和Autowired都是用于实现依赖注入&#xff08;Dependency Injection, DI&#xff09;的重要注解。依赖…

洛谷UVA题目Unknown Error

UnexpectedResponseStatus: expect status code: 301 Moved Permanently on https://onlinejudge.org/index.php?optioncom_comprofiler&tasklogin, got: 200 OK 如果你绑定了账号&#xff0c;去原站Online Judge - Home 登录一下&#xff0c;好久没登陆&#xff0c;需要激…

[2-远程开发-01]idea远程连接开发

背景 因为本次的项目使用到一些网络相关的库只在linux可使用&#xff0c;项目本身也会在linux运行&#xff0c;而且如果在mac上进行开发的话&#xff0c;也涉及到部署的问题&#xff0c;而且也不能调试。 所以直接在本专栏第一篇的centos主机上进行开发&#xff0c;以远程连接…

【开源】SpringBoot框架开发校园疫情防控管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生2.2 老师2.3 学校管理部门 三、系统展示四、核心代码4.1 新增健康情况上报4.2 查询健康咨询4.3 新增离返校申请4.4 查询防疫物资4.5 查询防控宣传数据 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBoot…

【Java程序设计】【C00253】基于Springboot的在线考试管理系统(有论文)

基于Springboot的在线考试管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的在线考试系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;系统登录&#xff0c;管理…

WordPress后台编辑个人资料页面直接修改用户名插件Change Username

前面跟大家介绍了『如何修改WordPress后台管理员用户名&#xff1f;推荐2种简单方法』一文&#xff0c;但是对于新站长或者有很多用户的站长来说&#xff0c;操作有点复杂&#xff0c;所以今天向大家推荐一款可以直接在WordPress后台编辑个人&#xff08;用户&#xff09;资料页…

【GameFramework框架内置模块】1、全局配置(Config)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog.csdn.net/q7…

vue安装使用less,解决与webpack的冲突

第077个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…