分支和循环 三


C语言结构有三种:顺序、选择、循环,用此三种结构就可以表示日常的所有情况。可用if、swhitch实现选择结构,用for、while、do while实现循环结构。

1.if语句

1.1 if

语法形式:

if ( 表达式 )
 语句

表达式成立(为真),语句执行;表达式不成立(为假),语句不执行。

C语言中,0为假,非0为真。

例:输⼊⼀个整数,判断是否为奇数

#include <stdio.h>
int main()
{
   int num = 0;
   scanf("%d", &num);
   if(num % 2 == 1)
     printf("%d 是奇数\n", num);
   return 0;
}

在这里插入图片描述

1.2 else

仍然是上面1.1中的例子,一个数如果不是奇数就是偶数,如何表示呢?
此时就需要if...else...语句了,语法形式:

if ( 表达式 )
  语句1
else
  语句2

例:

#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
 if(num % 2 == 1)
   printf("%d 是奇数\n", num);
 else
   printf("%d 是偶数\n", num);
 return 0;
}

1.3分支中包含多条语句

默认ifelse语句是只控制一条语句,若想控制多条语句需要在ifelse后加{}
例:

#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(age >= 18) 
 {
   printf("成年了\n");
   printf("可以恋爱咯\n");
 }//if后加了一个{},如果age>=18成立执行if后{}中的两条语句
 else 
 {
   printf("未成年\n");
   printf("不可以早恋哦\n");
 }//else后加了一个{},如果age>=18不成立执行else后{}中的两条语句
 return 0;
}

1.4嵌套if

1.在if else语句中,else可与另一if语句连用构成多重判断。
例:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数:

#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
 if(num == 0)
   printf("输⼊的数字是0\n");
 else if(num > 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
   printf("输⼊的数字是正数\n");
 else
   printf("输⼊的数字是负数\n");
 
 return 0;
}

2.还有一种就是嵌套在if语句中,构成了嵌套if语句。
例:要求输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出不是整数:

#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
  if(num>0)
 {
   if(num%2 == 0)
     printf("偶数\n");
   else
     printf("奇数\n");
 }
 else
 {
   printf("输⼊的值是负数\n");
 }
 return 0;
}

1.5悬空else问题

若有多个ifelse,只需记住else总是跟最接近if匹配。
例:

#include <stdio.h>
int main()
{
   int a = 0;
   int b = 2;
   if(a == 1)
     if(b == 2)
       printf("hehe\n");
   else
     printf("haha\n");
   return 0;
}

上例相当于:

#include <stdio.h>
int main()
{
 int a = 0;
 int b = 2;
 if(a == 1)
 {
   if(b == 2)
     printf("hehe\n");
   else
     printf("haha\n");
 }
 return 0;
}

2.关系操作符

⽤于⽐较的表达式,称为 “关系表达式”,⾥⾯使⽤的运算符就称为“关系运算符”,主要有:
• < ⼩于运算符
• >= ⼤于等于运算符
• <= ⼩于等于运算符
• == 相等运算符
• != 不相等运算符
·关系表达式通常返回 0 或 1 ,表⽰真假。
·关系表达式常⽤于 ifwhile 结构。

另⼀个需要避免的错误是:多个关系运算符不宜连⽤。
例:

i < j < k

上例中,因为关系运算符是从左到右(接合方向)计算,所以实际执⾏为:

(i < j) < k

又因为i < j 返回 01 ,所以最终是 01 与变量 k 进⾏⽐较。如果想要判断变量 j的值是否在 ik 之间应写为:

 i < j && j < k

3.逻辑操作符:&& , || , !

• ! :逻辑取反运算符(改变单个表达式的真假)。
• && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
• || :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

注:C语⾔中,⾮0表⽰真,0表⽰假

3.1短路

C语⾔逻辑运算符有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值。如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
例:

if(month >= 3 && month <= 5)

上例中,程序先判断month>=3,如果month>=3不成立,则右边month<=5将不再被执行,整个表达式的结果为假。
||同理,
例:

if(month == 12 || month==1 || month == 2)

如果month==12成立,则右边的表达式都将不再被执行,整个表达式的结果为真。

4.switch语句

switch语句是一种特殊的if else结构,用于判断有多个结果的情况。

switch (expression) 
{
  case value1: statement
  case value2: statement
  default: statement
}

上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,就执⾏ default 分⽀。

注:
switch 后的 expression 必须是整型表达式
case 后的值,必须是整形常量表达式

例:

#include <stdio.h>
int main()
{
 int n = 0;
 scanf("%d", &n);
 switch(n%3)
 {
 case 0:
   printf("整除,余数为0\n"); 
   break;
 case 1:
   printf("余数是1\n"); 
   break;
 case 2:
   printf("余数是2\n"); 
   break;
 }
 return 0;
}

上例中,需注意:

  1. case 和后边的数字之间必须有空格
  2. 每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。

4.1switch语句中的break

在上面的switch语句例子中,如果去掉break

#include <stdio.h>
int main()
{
 int n = 0;
 scanf("%d", &n);
 switch(n%3)
 {
 case 0:
   printf("整除,余数为0\n"); 
 case 1:
   printf("余数是1\n"); 
 case 2:
   printf("余数是2\n"); 
 }
 return 0;
}

打印结果为:
在这里插入图片描述
会发现打印结果中多了一行“余数是2”的打印。原因是在switch语句中是用break跳出switch语句的,如果case后无break语句,代码就会继续向下执行。

4.2switch语句中的case和default顺序问题

switch 语句中 case 语句和 default 语句是没有顺序要求的,即default语句既可以放在最后也可以放在中间、前面等任意位置,不过我们一般把default语句放在最后处理。

5.while循环

while循环格式:

while(表达式)
 语句;

5.1while语句的执行流程

在这里插入图片描述

5.2练习

输⼊⼀个正的整数,逆序打印这个整数的每⼀位。
例:

输⼊:1234,输出:4 3 2 1
输⼊:521,输出:1 2 5

题目解析:

  1. 要想得到n的最低位,可以使⽤n%10的运算,得到的余数就是最低位,如:1234%10得到4
  2. 要想去掉n的最低位,找出倒数第⼆位,则使⽤ n=n/10 操作就可以去掉最低位的,如:n=1234/10得到123,123%10就得到倒数第⼆位3。
  3. 循环1和2两个步骤,在n变成0之前,就能到所有的位。
    代码实现如下:
#include <stdio.h>
int main()
{
 int n = 0;
 scanf("%d", &n);
 while(n)
 {
   printf("%d ", n%10);
   n /= 10;
 }
 return 0;
}

6.for循环

6.1语法形式

for 循环是三种循环中使⽤最多的, 其语法形式如下:

for(表达式1; 表达式2; 表达式3)
  语句;

表达式1 ⽤于循环变量的初始化
表达式2 ⽤于循环结束条件的判断
表达式3 ⽤于循环变量的调整

6.2 for循环的执行流程

在这里插入图片描述

6.3练习

计算1~100之间3的倍数的数字之和。
参考代码:

#include <stdio.h>
int main()
{
 int i = 0;
 int sum = 0;
 for(i=1; i<=100; i++)
 {
 if(i % 3 == 0)
 sum += i;
 }
 printf("%d\n", sum);
 return 0;
}
//⼩⼩的优化
//如果能直接产⽣3的倍数的数字就省去了多余的循环和判断
#include <stdio.h>
int main()
{
 int i = 0;
 int sum = 0;
 for(i=3; i<=100; i+=3)
 {
 sum += i;
 }
 printf("%d\n", sum);
 return 0;
}

7.do while循环

7.1语法格式

do
 语句;
while(表达式)

前面的whilefor两种循环都是先判断再循环,而do while则是先循环再判断。所以在 do while 语句中循环体是⾄少执⾏⼀次的,这是 do while 循环⽐较特殊的地⽅。

7.2do while循环的执行流程

在这里插入图片描述
⼀般 do while 使⽤在循环体⾄少被执⾏⼀次的场景下,所以较少⼀些。

7.3练习

输⼊⼀个正整数,计算这个整数是⼏位数?
例如:
输⼊:1234 输出:4
输⼊:12 输出:2
参考代码:

#include <stdio.h>
int main()
{
 int n = 0;
 scanf("%d", &n);
 int cnt = 0;
 do
 {
 cnt++;
  n = n / 10;
 } while (n);
 printf("%d\n", cnt);
 return 0;
}

8.break和continue语句

在循环执行过程中,若遇到某些情况发生需提前结束循环则需用到breakcontinue两关键字。
break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执
⾏。
continue 的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所
差异的。

8.1while循环中的break和continue

8.1.1break举例


```c
#include <stdio.h>
int main()
{
 int i = 1;
 while(i<=10)
 {
 if(i == 5)
 break;//当i等于5后,就执⾏break,循环就终⽌,跳出循环。
 printf("%d ", i);
 i = i+1;
 }
 return 0;
}

运行结果:

在这里插入图片描述

8.1.2continue举例

仍旧是上面的例子,将break换成continue后:

#include <stdio.h>
int main()
{
 int i = 1;
 while(i<=10)
 {
 if(i == 5)
 continue;
 //当i等于5后,就执⾏continue,直接跳过continue后的代码,去执行判断语句
 //因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊和死循环
 printf("%d ", i);
 i = i+1;
 }
 return 0;
}

8.2for循环中的break和continue

8.2.1 break举例

其与while循环中的break一样。
例:

#include <stdio.h>
int main()
{
 int i = 1;
 for(i=1; i<=10; i++)
 {
 if(i == 5)
 break;
 printf("%d ", i);
 }
 return 0;
}

运行结果:
在这里插入图片描述

8.2.2 continue举例

还是上面的例子,将break换成continue后:

#include <stdio.h>
int main()
{
 int i = 1;
 for(i=1; i<=10; i++)
 {
 if(i == 5)
 continue;//这⾥continue跳过了后边的打印,直接来到了i++的调整部分
 printf("%d ", i);
 }
 return 0;
}

所以在 for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码,直接去到循环的调整部分。与while循环中的continue有区别。

8.3 do while循环中的break和continue

do while 语句中的 breakcontinue 的作⽤和 while 循环中⼏乎⼀样。

9.循环的嵌套

前⾯介绍了三种循环 while , do while , for ,这三种循环往往会嵌套在⼀起才能更好的解决问题。
例:
找出100~200之间的素数,并打印在屏幕上。
注:素数⼜称质数,只能被1和本⾝整除的数字。

题目解析:

  1. 要从100-200之间找出素数,⾸先得有100~200之间的数,这⾥可以使⽤循环解决。
  2. 假设要判断i是否为素数,需要拿2-i-1之间的数字去试除i,需要产⽣2~i-1之间的数字,也可以使⽤
    循环解决。
  3. 如果2~i-1之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数。

参考代码:

#include <stdio.h>
int main()
{
 int i = 0;
 //循环产⽣100~200的数字
 for(i=100; i<=200; i++)
 {
 //判断i是否为素数
 //循环产⽣2~i-1之间的数字
 int j = 0;
 int flag = 1;//假设i是素数
 for(j=2; j<i; j++)
 {
 if(i % j == 0)
 {
 flag = 0;
 break;
  }
 }
 if(flag == 1)
 printf("%d ", i);
 }
 return 0;
}

10.goto语句

C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数
内跳转到设置好的标号处。
例:

#include <stdio.h>
int main()
{
 printf("hehe\n");
 goto next://直接跳转到到next,执行next后面的代码
 printf("haha\n");
 
next:
 printf("跳过了haha的打印\n"); 
 return 0;
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值