首页 > 其他分享 >第3讲:分支和循环(上)

第3讲:分支和循环(上)

时间:2024-10-22 15:20:37浏览次数:3  
标签:语句 break 运算符 while 循环 表达式 分支

文章目录

第3讲:分支和循环(上)

C语言:结构化的程序设计语言

  • 顺序结构
  • 选择结构:if语句、switch语句
  • 循环结构:while循环、for循环、do-while循环

1. if 语句

1.1 if

语法形式:

if (表达式)
  语句

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

在C语言中,0为假,非0表示真

在这里插入图片描述

1.2 else

语法形式:

if ( 表达式 )
   语句1
else
   语句2
1.3 分支中可以包含多条语句

默认在 if 和 else 语句中默认都只控制⼀条语句

解决办法:使用 {} 将代码括起来,可以同时控制多条语句

1.4 嵌套 if

在 if else 语句中, else 可以与另⼀个 if 语句连用,构成多重判断。

例如:

if(num==0)
   printf("输入的数字是0");
else if(num>0)
   printf("输入的数字是正数");
else
   printf("输入的数字是负数");
if(num>0)
{
   if(num%2 == 0)
      printf("偶数\n");
   else
      printf("奇数\n");
}
else
{
   printf("⾮正数\n");
}
  • 判断语句不能写18<=age<=40,应写成

    age>=18 && age<=40

1.5 悬空else问题

else 总是跟最接近的 if 匹配

2. 关系操作符

用于比较的表达式,称为 “关系表达式”,里面使用的运算符就称为“关系运算符”,如下:

  • > 大于运算符
  • < 小于运算符
  • >= 大于等于运算符
  • <= 小于等于运算符
  • == 相等运算符
  • != 不相等运算符

3. 条件操作符

也称三目操作符,需要接受三个操作数,形式:

exp1 ? exp2 :exp3

计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果 exp1 为假, exp3 计算,计算的结果是整个表达式的结果。

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

  • ! :逻辑取反运算符(改变单个表达式的真假)。
  • && :逻辑运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
  • || :逻辑运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。
4.1 逻辑取反运算符 !
a!a
非00
01

如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真

4.2 逻辑与运算符
aba&&b
非0非01
非010
0非00
000

&& 就是与运算符,也是并且的意思, && 是⼀个双目操作符,使用的方式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。

4.3 逻辑或运算符
aba||b
非0非01
非001
0非01
000

|| 就是或运算符,也就是或者的意思, || 也是⼀个双目操作符,使用的方式是 a || b , ||两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。

4.4 练习:闰年的判断

输入一个年份year,判断year是否是闰年

闰年判断的规则:

  1. 能被4整除并且不能被100整除是闰年

  2. 能被400整除是闰年


4.5 短路

5. switch语句

switch 语句是一种特殊形式的 if…else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。

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

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

5.1 if语句和switch语句的对比
5.2 switch语句中的break
5.3 switch语句中的default
5.2 switch语句中的case和default的顺序问题

case语句和default语句没有顺序要求

通常是把 default 子句放在最后处理的

6. while循环

while(表达式)
   语句;

如果循环体包含多个语句,加上大括号

6.1 if和while的对比

区别:while语句是可以实现循环效果的

6.2 while语句的执行流程

在这里插入图片描述

首先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。

6.3 while循环的实践

练习:在屏幕上打印 1~10 的值

int i = 1;
while(i<=10)
{
   printf("%d ", i);
   i++;
}
6.4 练习
  • 题目:输入一个正的整数,逆序打印这个整数的每一位

    例如:输入:1234,输出:4 3 2 1;输入:521,输出:1 2 5

  • 解析:数n%10取余得到的就是最低位;n/10除10可以去掉最低位

  • 实现:

    int n = 0;
    scanf("%d",&n);
    while(n)
    {
       printf("%d",n%10);
       n /= 10;
    }
    

调试:
在这里插入图片描述

7. for循环

三种循环中使用最多的

7.1 语法形式
for(表达式1;表达式2;表达式)
   语句;

表达式1 用于循环变量的初始化

表达式2 用于循环结束条件的判断

表达式3 用于循环变量的调整

7.2 for循环的执行流程

在这里插入图片描述

7.3 for循环的实践

练习:在屏幕上打印1~10的值

int i = 0;
for(i=1;i<=10;i++)
{
   printf("%d ", i);
}
7.4 while循环和for循环的对比

for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部分非常集中,便于代码的维护,而如果代码较多的时候 while 循环的三个部分就比较分散,所以从形式上 for 循环要更优一些。

7.5 练习

例:计算1~100之间3的倍数的数字之和

分析:

  1. 产生1-100之间的数字 for()
  2. 找出3的倍数 if()
  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;
}

优化:

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

8. do-while 循环

在循环语句中 do while 语句的使用最少

8.1 语法形式
do
   语句;
while(表达式);

while 和 for 这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;

而 do while 循环则是先直接进入循环体,执行循环语句,然后再执行 while 后的判断表达式,表达式为真,就会进进行下一次,表达式为假,则不再继续循环。

8.2 do while循环的执行流程

在这里插入图片描述

8.3 do while循环的实例

例:在屏幕上打印1~10的值

int i = 1;
do
{
   printf("%d ", i);
   i = i + 1; 
}while(i<=10);
8.4 练习

输入一个正整数,计算这个整数是几位数?

int n = 0;
scanf("%d", &n);
int cnt = 0;
do
{
   cnt++;
   n = n / 10;
} while (n);
printf("%d\n", cnt);

9. break和continue语句

  • break 的作用是用于永久的终止循环
  • continue 的作用是跳过本次循环中 continue 后边的代码
9.1 while循环中的break和continue
9.1.1 break举例
while(i<=10)
{
   if(i == 5)
      break;//当i等于5后,就执⾏break,循环就终⽌了
   printf("%d ", i);
   i = i+1;
}

打印了1,2,3,4后,当i等于5的时候,循环在 break 的地方终止,不再打印,不再循环。

9.1.2 continue举例
while(i<=10)
{
   if(i == 5)
      continue;
   printf("%d ", i);
   i = i+1;
}

跳过了i = i+1,所以i⼀直为5,程序陷入和死循环

9.2 for循环中的break和continue
9.2.1 break 举例
for(i=1; i<=10; i++)
{
   if(i == 5)
      break;
   printf("%d ", i);
}

输出:1 2 3 4

9.2.2 continue举例
for(i=1; i<=10; i++)
{
   if(i == 5)
      continue;
   printf("%d ", i);
}

输出:1 2 3 4 6 7 8 9 10

9.3 do-while循环中的break和continue
9.3.1 break 举例
do
{
   if(i == 5)
      break;
   printf("%d ", i);
   i = i + 1;
}while(i<=10);

输出:1 2 3 4

9.3.2 continue举例
do
{
   if(i == 5)
      continue;
   printf("%d ", i);
   i = i + 1;
}while(i<=10);

跳过了i = i+1,所以i⼀直为5,程序陷入和死循环

10. 循环的嵌套

10.1 练习

找出100~200之间的素数,并打印在屏幕上。

注:素数又称质数,只能被1和本身整除的数字。

10.2 题目解析

1.产生100-200之间的数字

for(i=100;i<=200;i++)

2.判断是否是质数

10.3 参考代码
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);
}

11. goto语句

goto 语句可以实现在同⼀个函数内跳转到设置好的标号处

 printf("hehe");
 goto next;
 printf("heihei");
next:
 printf("haha")

goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以我们的建议是能不用尽量不去使用。

嵌套循环中goto语句可以直接跳出循环,不用使用多个break。

  • 使用goto语句写一个关机程序

    system("shutdown -s -t 60");
    //system是一个库函数,这个函数是执行系统命令的
    

标签:语句,break,运算符,while,循环,表达式,分支
From: https://blog.csdn.net/m0_74322260/article/details/143159096

相关文章

  • Java中的控制结构中的顺序结构和分支结构
    文章目录前言1.顺序结构2.分支结构2.1选择语句if2.2if格式12.3if语句格式22.3if语句格式3if语句与三元运算符2.1选择语句switch前言我是一名来自延边大学人工智能专业的热爱街舞的大四学生,目前在学习Java,我会根据我的学习路线给大家分享学习经验,这章我们学习Java中......
  • C语言第三学:分支和循环
       C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分为这三种结构或者这三种结构的组合。我们可以使⽤if、switch实现分⽀结构,使⽤for、while、dowhi......
  • 分支与循环:猜数字游戏的代码实现
    在我们学习分支和循环之后我们可以简单的写一个小游戏了——猜数字思维构想    一、预期效果         实现随机生成0~100之间的数字,玩家进行猜测,按结果进行判断。对于结果实现如果玩家猜大了给予玩家“猜大了”的提示;如果猜小了,给予玩家“猜小了”的提示;若......
  • 四,增强for循环
    增强for循环:简化数组和集合遍历的详细指南在Java编程中,遍历数组和集合是一个基本且频繁的操作。传统的for循环虽然可以实现这一功能,但它的语法较为繁琐,尤其是在需要遍历集合中的每个元素时。为了简化这一过程,Java引入了增强for循环(也称为for-each循环),它提供了一种更加简洁和易读......
  • 浏览器中的 事件循环 event loop
    当浏览器碰到异步代码:异步代码会放到队列。队列有两种。微任务队列和宏任务队列。执行栈与任务队列JS在解析一段代码时,会将同步代码按顺序排在某个地方,即执行栈,然后依次执行里面的函数。当遇到异步任务时就交给其他线程处理,待当前执行栈所有同步代码执行完成后,会从一个队列中去......
  • 合并分支:Git merge 和 rebase 的区别
    结论:直接merge会产生合并提交记录,而rebase是会形成线性的提交记录,如果该合并是有意义的合并,则可以使用merge,记录合并提交记录,如果是日常个人的合并,则使用rebase,减少无意义的合并提交记录使用rebase要注意在自己的分支上进行,不然会导致其他人由于指向的commitid不同,导致同步问......
  • SpringBoot循环依赖
    在SpringBoot(以及Spring框架)中,循环依赖是指两个或多个Bean互相依赖,导致Spring在创建这些Bean时无法正常进行依赖注入。例如,假设有两个类A和B,A依赖于B,而B又依赖于A。在这种情况下,Spring框架在尝试实例化其中一个Bean时,会发现另一个Bean尚未创建,从而产生循环依赖问题。循环依赖......
  • 测开必备-java基础-for、while和do-while循环使用场景
    在编程中,选择使用for循环、while循环还是do-while循环,主要取决于你的具体需求和代码逻辑。下面我们来详细讨论一下这三种循环的使用场景。for循环的使用场景for循环通常用于已知循环次数的场景,特别是当你需要遍历数组、集合或执行固定次数的迭代时。for循环的语法结构清晰地定义......
  • 时间序列预测(六)——循环神经网络(RNN)
    目录一、RNN的基本原理1、正向传播(ForwardPass):2、计算损失(LossCalculation)3、反向传播——反向传播通过时间(BackpropagationThroughTime,BPTT)4、梯度更新:二、RNN的常用结构 1、N——N结构2、N——1结构3、1——N结构4、N——M结构(Encoder-Decoder,也称Seq2Seq)三......
  • mysql对结果集进行遍历(mysql双重for循环如何写)
    原文链接:mysql对结果集进行遍历(mysql双重for循环如何写)–每天进步一点点0.背景有这么一个需求:对以下的类型结果集进行更新。更新的原则是type为c的currentValue的值=(type为b的currentValue)/((type为b的currentValue)+(type为a的currentValue))*100。上面这个需求......