当前位置: 首页 > news >正文

06-C语言:第06天笔记

C语言:第06天笔记

内容提要

  • 循环结构
    • 循环定义
    • 当型循环的实现
    • 直到型循环的实现
    • 循环的嵌套
    • 循环的应用场景
    • 基础算法模型
    • break与continue

回顾

  • 分支结构

    • 单分支:if…

    • 双分支:

      • if…else…

      • 三目运算符:表达式1(条件表达式)? 表达式2(语句1):表达式(语句2);输出型单语句的双分支

      • 需求:判断一个数是偶数还是奇数

      • 实现:

        #include <stdio.h>int main()
        {int num 5;// 双分支:if..elseif (num % 2 == 0)  printf("%d是偶数!\n");else printf("%d是奇数!\n");// 双分支:三目运算符// 方式1(num % 2 == 0) ? printf("%d是偶数!\n") : printf("%d是奇数!\n");// 方式2printf("%s\n",(num % 2 == 0) ? "偶数":"奇数");// 方式3char *p = (num % 2 == 0) ? "偶数":"奇数";printf("%d是%s!\n",num,p)}
        
    • 多分支:

      • if…else…嵌套(不推荐)
      • if…else if…else
      • switch…case…

循环结构

什么是循环结构

代码在满足某种条件的前提下,重复执行,就叫做循环结构。

循环的分类

  • **无限循环:**其实就是死循环,程序设计中要谨慎使用。
  • **有限循环:**循环限定循环次数(for)或者终止循环的条件(while,do…while)

循环的构成

  • 循环条件: 如循环次数或者循环的出口。
  • **循环体:**需要重复执行的代码(也就是{}包裹的内容)

当型循环的实现

特点:先判断,后执行,如果条件不满足,循环体一次都不执行。

**代表:**while、for

while循环

语法:

1】循环变量;
while (2】循环条件)
{3】循环语句;4】更新循环变量;
}// 注意:如果循环语句是单语句,可以省略{}
while (循环条件) 循环单语句;
while (循环条件)循环单语句;// 注意:有些特殊场景下,循环体语句糅合到了循环条件中,所以省略掉循环体
while (循环条件);  // int i = 1;  while(i++ <= 5); printf("%d\n",i);// 7

说明:

  1. 循环条件的返回值必须是逻辑值(使用非0表示真,使用0表示假,C语言底层使用1表示真)C99版本引入了一个stdbool.h,可以使用true或者false来表示真假,这里的true和false实际上就是定义的两个符号常量,true的值是1,false的值0。
  2. {}包起来的内容整体称之为循环体。
  3. 我们要在循环体中控制循环条件的变化,也可以在循环条件中控制循环条件的变化,否则产生死循环。

执行过程:

image-20241202095113355

特点: 先判断,后执行,循环体语句有可能一次都不执行。

案例
  • 需求:求1~100的累加和(例如:1+2+3+4+…+100)

  • 分析:

    • 创建一个变量sum = 0,用来接收累加和
    • 创建一个循环变量i,用来表示计算数,给一个默认值1,每次循环的时候 i++
    • 在循环中,使用 sum += i(sum = sum + i),完成累加和运算
    • 同时我们要限定循环的条件,也就是i的范围:i <= 100
      • 第1次:sum += i = 0 + 1 = 1
      • 第2次:sum += i = 1 + 2 = 3
      • 第3次:sum += i = 3 + 3 = 6
  • 代码:

    #include <stdio.h>

    int main(int argc,char *argv[])
    {
    // 需求:求1~100的累加和

    // 创建一个变量sum = 0,用来存储累加和,因为参与计算,所以必须有初始值
    int sum = 0;// 创建一个 循环变量并初始化
    int i = 1;// 通过一个循环生成1~100的自然数,并实现累加和运算
    while(i <= 100)  // ()循环条件,限制循环变量的变化,循环的出口限制
    {// 累加和运算sum += i;// 更新循环变量,逼近出口i++;// 等价于 i = i + 1  i+=1 ++i
    }printf("1~100的累加和是%d\n",sum);return 0;
    

    }

    
    
  • 运行结果:

案例
  • 需求:求1~100以内的偶数和

  • 分析:

    • 创建一个变量sum = 0,用来存储累加的偶数和
    • 创建一个循环变量i = 2,存储参与运算的自然数(最小的偶数是2)
    • 创建一个循环,设置循环条件 i <= 100
    • 在循环体内,需要用一个if校验i是否是偶数,如果满足条件,就实现偶数和的计算:sum += i
    • 在循环体的最后一行,需要更新循环变量,作用是逐渐逼近循环的出口
    • 循环结束后,才能输出sum。
  • 代码:

***********/

#include <stdio.h>

int main(int argc,char *argv[])
{
// 创建一个变量sum = 0,用来存储累加的偶数和
int sum = 0;
// 创建一个循环变量i = 2,存储参与运算的自然数(最小的偶数是2)
int i = 2;
// 创建一个循环,设置循环条件 i <= 100
while (i <= 100)
{
// 在循环体内,需要用一个if校验i是否是偶数,如果满足条件,就实现偶数和的计算:sum += i
if (i % 2 == 0)
sum += i;
// 在循环体的最后一行,需要更新循环变量,作用是逐渐逼近循环的出口
i++;

	// if (i % 2 == 0) sum += i; i++;   // 等价于上面代码
}
// 循环结束后,才能输出sum。
printf("1~100以内的偶数和是%d\n", sum);return 0;

}


- 运行结果:##### **案例**- 需求:通过键盘录入一个整数,判断这个整数是否是水仙花数。- 分析:- 拆分一个n位的数,比如拆分为如:个位、十位、百位...- 要求这个n位数的每一位的n次幂相加等于这个数本身:> 比如一个三位数:>> 个位的3次幂 + 十位的3次幂 + 百位的3次幂 = 这个数本身- 代码:```c#include <stdio.h>
#include <math.h>int main(int argc,char *argv[])
{int num, originalNum, n = 0, sum = 0;// 从控制台录入一个数printf("请输入一个整数:");scanf("%d", &num);// 用一个变量记录这个整数originalNum = num;// 计算数字的位数while (num != 0){num /= 10;n++;// 统计位数}// 恢复原始数据num = originalNum;// 计算各位数的n次幂之和while (num != 0){// 将需要的位数拆出来int digit = num % 10;// 计算这个数的n次幂,并相加sum += pow(digit,n);// pow(运算数,运算数的n次方)// 将需要拆除的位保留在个位num /= 10;}// 校验并输出if (sum == originalNum)printf("%d 是水仙花数。\n", originalNum);elseprintf("%d 不是水仙花数。\n", originalNum);return 0;
}
  • 编译命令:

    gcc demo06.c -lm  // math.h中有些函数属于GNU扩展函数,不是C语言标准,需要指定链接
    

    解释:-lm 意思是链接数学库,数学库中有一些函数不是C语言标准定义的,属于其他扩展库,C语言标准库是自动链接的,但是扩展库不会自动链接,需要我们指定链接。

  • 运行效果:

while的特殊写法:

while(1)   // 死循环
for循环

原则上:for循环能实现的,while循环也可以实现,for循环可以看做是while循环的一种特殊写法,for循环胜在结构清晰,非常适合于直到循环次数的循环。

语法:

for (1】循环变量;2】循环条件;4】更新循环变量)
{3】循环语句;
}// 如果循环体语句是单语句,也是可以省略{}
for (1】循环变量;2】循环条件;4】更新循环变量)3】循环语句;
for (1】循环变量;2】循环条件;4】更新循环变量)3】循环语句;

说明:

()中可以仅保留两个;;,举例:for (;;),此时这种写法就是死循环的一种体现。

循环变量:需要赋初始值,循环变量可以是单个,也可以是列表,多个循环变量之间使用逗号分隔,举例:

// 循环变量是单个
for (int i = 0;..;..) {..}// 循环变量是多个
for (int i = 0,j = len -1;..;..){..}

循环条件:用来限制循环的次数,循环条件支持任意表达式(常用的有关系表达式,逻辑表达式),举例:

for (..;i < 10 && j >= 0;..){..}

④:更新循环变量:支持列表,列表使用逗号分隔,这里可以使用赋值表达式,举例:

for (..;..;i++,j--){..}

⑤ 执行顺序:①②③④ → ②③④ → ②③④ → … → ②

执行过程:

image-20241202103701476

**特点:**先判断,后执行,循环体语句有可能一次都不执行。

案例:

  • 需求:计算1~100以内的偶数和

  • 代码:

    
    #include <stdio.h>/*** 使用while实现*/ 
    int while_test()
    {int sum = 0;// 循环变量(需要初始化)int i = 2;// 循环条件while (i <= 100){// 循环语句if (i % 2 == 0) sum += i;// 更新循环变量i++;}// 打印输出printf("1~100以内的偶数和是%d\n", sum);return 0;
    }/*** 使用for实现(不推荐)*/ 
    int for_test()
    {int sum = 0;// 循环变量(需要初始化)int i = 2;// 循环条件for (;i <= 100;){// 循环语句if (i % 2 == 0) sum += i;// 更新循环变量i++;}// 打印输出printf("1~100以内的偶数和是%d\n", sum);return 0;
    }/*** 使用for实现(推荐)*/ 
    int for_test2()
    {int sum = 0;// 循环条件for (int i = 2; i <= 100; i++){// 循环语句if (i % 2 == 0) sum += i;}// 打印输出printf("1~100以内的偶数和是%d\n", sum);return 0;
    }int main(int argc,char *argv[])
    {while_test();for_test();for_test2();return 0;
    }

案例:

  • 需求:用户通过键盘输入一个整数n,求n的阶乘。例如:n = 4,n的阶乘 1 * 2 * 3 * 4

  • 代码:

    #include <stdio.h>
    // 数学库对应的头文件
    #include <math.h>

    int main(int argc,char *argv[])
    {
    // 创建一个变量,用来存储计算数
    unsigned long n;
    // 创建一个变量,用来存储乘积 size_t 是C语言中 unsigned long的别名
    size_t r = 1;

    // 通过控制台,给n赋值
    printf("请输入一个整数:\n");
    scanf("%lu", &n);// 通过for循环计算
    for (int i = 1; i <= fabs(n); i++) r *= i;printf("1~%lu的乘积结果是%lu\n",(size_t)fabs(n), r);
    return 0;
    

    }

    
    
  • 注意:阶乘计算,如果乘积超过变量存储的范围,会溢出,结果计算可能不准确。

for实现死循环:

 for(表达式1;;表达式3) {..}for(表达式1;;) {..}for(;;表达式3) {..}for(;;) {}for(表达式1;表达式2;) {}...
循环实现的三要素
  • 循环变量的初始化,举例:int i = 2
  • 循环条件,举例:i <= 100
  • 循环变量的更新,举例:i++

案例:

  • 需求:求斐波拉契数列前20个

  • 分析:

    • 斐波拉契数列指的是是符合一定规则的数列,举例:1,1,2,3,5,8…
    • 斐波拉契数列的特点:第3个数等于前两个数之和,最开始的第1,2个数是固定的,都是1
  • 代码:

    #include <stdio.h>

    int main(int argc,char *argv[])
    {
    // 创建一个变量,存储第1,2个数,默认都是1
    int f1 = 1, f2 = 1;

    // 定义循环变量
    int i = 1; // 每一次循环产生2个数,也就是循环10次// 通过循环产生数列
    for (; i <= 10; i++)
    {// 输出当前两个数列printf("%-12d%-12d\n",f1,f2);// 1,1 // 计算得到新的f1,f2f1 += f2; // f1 = f1 + f2; // 第1次:f1 = 1+1 = 2 ..f2 += f1; // f2 = f2 + f1;  // 第1次:f2 = 1 + 2 = 3 ..
    }return 0;
    

    }

    
    
  • 运行结果:

课堂练习

int main(int argc,char *argv[])
{
// 创建一个变量,存储第1,2个数,默认都是1
int f1 = 1, f2 = 1;

  // 定义循环变量int i = 1; // 每一次循环产生2个数,也就是循环10次// 通过循环产生数列for (; i <= 10; i++){// 输出当前两个数列printf("%-12d%-12d\n",f1,f2);// 1,1 // 计算得到新的f1,f2f1 += f2; // f1 = f1 + f2; // 第1次:f1 = 1+1 = 2 ..f2 += f1; // f2 = f2 + f1;  // 第1次:f2 = 1 + 2 = 3 ..}return 0;

}


- 运行结果:[外链图片转存中...(img-omjEXuLI-1752589450028)]##### 课堂练习**需求**:求1~max_value 以内的所有水仙花数,max_value的范围自己指定。

文章转载自:
http://anion.wsgyq.cn
http://carpentaria.wsgyq.cn
http://chartism.wsgyq.cn
http://buttonhold.wsgyq.cn
http://celsius.wsgyq.cn
http://anthropophobia.wsgyq.cn
http://anatase.wsgyq.cn
http://beamwidth.wsgyq.cn
http://bellicose.wsgyq.cn
http://arbalest.wsgyq.cn
http://arithmetization.wsgyq.cn
http://bessarabian.wsgyq.cn
http://accipitral.wsgyq.cn
http://carapace.wsgyq.cn
http://cercarial.wsgyq.cn
http://cdplay.wsgyq.cn
http://anathematise.wsgyq.cn
http://anteversion.wsgyq.cn
http://aubrietia.wsgyq.cn
http://bacalao.wsgyq.cn
http://abut.wsgyq.cn
http://amalgamative.wsgyq.cn
http://animatism.wsgyq.cn
http://anisodactylous.wsgyq.cn
http://chloralose.wsgyq.cn
http://angelino.wsgyq.cn
http://athanasy.wsgyq.cn
http://chemoreception.wsgyq.cn
http://caelian.wsgyq.cn
http://bleareye.wsgyq.cn
http://www.dtcms.com/a/281799.html

相关文章:

  • 数据分析与AI丨从传感器到智能决策:数据驱动企业发展与 ESG 创新的全链路实践
  • 18.理解 Python 中的切片赋值
  • OpenCV-Python Tutorial : A Candy from Official Main Page(三)
  • Redis原理之持久化
  • 【构建 SHAP 解释器】X:每个样本的特征表(不能含 label,否则解释不纯粹)。
  • 隐私计算四大主流开源框架:从学术研究到工业落地,附PySyft实战Demo
  • 梁的振动特征函数分析2
  • 智驾芯片软件分层测试
  • kdump生成转储文件调试内核崩溃、死机
  • 电涡流位移测量技术深度解密
  • View2 UI聊天框架源码分享 - 支持[图文视频]混排 加入AI 分享一套功能强大的View2 UI聊天框架源码
  • Python初学者笔记第十四期 -- (自定义模块与包)
  • NFS磁盘共享
  • 基础专有术语
  • Model Control Protocol 一种开放的应用层协议,让大模型与工具能够协调配合起来,了解他的定义、定位、组成及实现机制...
  • 手提式干粉灭火器检查工作,如何做到可执行、可追溯、可管理?
  • 移动碰撞法 ——套料排版算法——CAD c#
  • java基础(day08)-面向对象
  • Redis 高频面试题
  • 【删库跑路】一次删除pip的所有第三方库
  • vllm本地部署qwen3-4b
  • 场景设计题+智力题
  • windows下安装difi(无docker desktop版)
  • 7.15 腾讯云智面经整理
  • Wiz笔记二次开发
  • AI大模型开发架构设计(22)——LangChain的大模型架构案例实战
  • 记忆力训练day41
  • 1-Nodejs介绍与安装
  • 基于STM32的智能火灾报警系统设计
  • 【人工智能99问】激活函数有哪些,如何选择使用哪个激活函数?(5/99)