C/C++入门004-C语言流程控制

news2024/9/21 14:26:48

文章目录

  • 流程控制
    • 顺序结构:
    • 选择结构
      • if选择结构
      • switch选择
    • 循环结构
      • while循环
      • do while
      • for循环
      • 循环优化
    • 四大跳转
      • break:
      • continue
      • goto
      • return
    • 案例

参考:https://blog.csdn.net/weixin_44617968/article/details/117656810

流程控制

控制流程(也称为流程控制)是计算机运算领域的用语,意指在程序运行时,个别的指令(或是陈述、子程序)运行或求值的顺序。不论是在声明式编程语言或是函数编程语言中,都有类似的概念。
从逻辑上,语言是为了模拟实现我们现实生活中的每件事情,通过证明只需要具有 顺序,条件分支,循环 三种流程就可以模拟我们的任何事情。
对于C语言来说,系统会按顺序执行程序中的每一行代码。但仅有顺序执行是不够的,通现实一样,C语言还需要条件分支(选择结果),循环结构。

顺序结构:

按书写顺序从上至下依次执行
在这里插入图片描述

#include <stdio.h>
int main()
{
    /*
    这是一个计算器的案例,version0.1
    输入你的数字,返回数字之和。

    */
    // 定义两个变量,用来接收输入的数字
    int numOne;
    int numTwo;
    int numOpera;
    int opera;
    // 友好提示信息
    printf("这是一个计算机的案例\n");
    printf("输入的格式为 3 5 1,返回值3+5的和为8\n");
    printf("输入的格式为 3 5 0,返回值3-5的差为-2\n");

选择结构

在这里插入图片描述

if选择结构

if(表达式){
    语句1;
}else if(表达式2){
    语句2;
}else{
    表达式3;
}
后续语句;

案例:

#include <stdio.h>

int main(){
    int a;
    printf("请输入数字,我们判断大小");
    scanf("%d",&a);

//    if(a == 10){// 错误写法, 但不会报错
    if (10 > a){
      printf("a的值小于10\n");
    }else if(10 == a){
        printf("a的值等于10\n");
    }else{
     printf("a的值大于10\n");
    }
}

基于函数封装的条件选择

#include <stdio.h>

int main()
{

    aCompare10();

}

aCompare10(int a)
{
    int a;
    printf("请输入数字,我们判断大小");
    scanf("%d",&a);
    if (10 > a)
    {
        printf("a的值小于10\n");
    }
    else if(10 == a)
    {
        printf("a的值等于10\n");
    }
    else
    {
        printf("a的值大于10\n");
    }

}

switch选择

switch(表达式){
    case 常量表达式1:
        语句1;
        break;
    case 常量表达式2:
        语句2; 
        break;
    case 常量表达式n:
        语句n;
        break;
    default:
        语句n+1;
        break;
}

案例

#include <stdio.h>

int main()
{
    aSwitch10();
}

aSwitch10()
{
    int a;
    printf("请输入功能选项,8表示XX,10表示YY,其它为ZZ\n");
    scanf("%d",&a);

    switch(a)
    {
    case 8:
        printf("当前选择了8,值为:%d",a);
        break;
    case 10:
        printf("当前选择了10,值为:%d",a);
        break;
    default:
        printf("当前为默认值");
    }
}

注意

switch 的表达式及 case 的值 的类型必须是 int ,或者可以被提升为整型的值(char,short)
case 的值不能相同
每个 case 要以 break 结尾,否则会出现穿透问题
default 不一定要放在 case 最后,只有等到所有 case 不匹配才会执行。

循环结构

在这里插入图片描述

循环条件 成立时,会反复执行 循环体 ,直到条件不成立位置

while循环

while(循环控制条件) {
    循环体中的语句;
    能够让循环结束的语句;
    ....
}

循环控制条件:循环退出的主要依据,来控制循环到底什么时候退出
循环体:循环的过程中重复执行的代码段
循环终止语句(递增、递减、真、假等):能够让循环条件为假的依据,否则退出循环

案例

#include <stdio.h>

int main()
{
// while循环
    whileTest();


}

whileTest()
{
    /*
    当输入的值为0-18的时候,输出 他还是一个孩子啊
    当输入的值为>50的时候,输出 他只是一位老人啊

    while(循环控制条件) {
        循环体中的语句;
        能够让循环结束的语句;
        ....
    }
    */

    while(1)
    {
        int a;
        printf("请输入他的年龄\n");
        scanf("%d",&a);

        if(a<=18 && a>0 )
        {
            printf("他还是一个孩子啊\n",a);
        }

        else if(a>50)
        {
            printf("他只是一位老人啊\n",a);
        }
        else
        {
            printf("年轻人就得多努力\n",a);
        }
    }

}

输出为:
在这里插入图片描述

案例,带有退出机制

#include <stdio.h>

int main()
{
    int num = 5;
    // while循环
    whileTest(num);


}

whileTest(int b)
{
    /*
    当输入的值为0-18的时候,输出 他还是一个孩子啊
    当输入的值为>50的时候,输出 他只是一位老人啊

    while(循环控制条件) {
        循环体中的语句;
        能够让循环结束的语句;
        ....
    }
    */

    while(b)
    {
        --b;
        printf("当前的b的值为:%d",b);
        int a;
        printf("请输入他的年龄\n");
        scanf("%d",&a);

        if(a<=18 && a>0 )
        {
            printf("他还是一个孩子啊\n",a);
        }

        else if(a>50)
        {
            printf("他只是一位老人啊\n",a);
        }
        else
        {
            printf("年轻人就得多努力\n",a);
        }
    }

}

输出为:
在这里插入图片描述

do while

do {
    循环体中的语句;
    能够让循环结束的语句;
    ....
} while(循环控制条件);

a. 应用场景 do while 与 while

#include <stdio.h>

int main()
{
    int num = 0;

    // 当num为0时
    // do while循环 至少允许一次
    //doWhileTest(num);
    // while可能一次也不运行
    doWhileTestVSWhile(num);


}


doWhileTest(int b)
{
    /*
        当输入的值为0-18的时候,输出 他还是一个孩子啊
        当输入的值为>50的时候,输出 他只是一位老人啊

    do {
        循环体中的语句;
        能够让循环结束的语句;
        ....
    } while(循环控制条件);
        */

    do
    {
        printf("当前的b的值为:%d",b);
        printf("请输入他的年龄\n");
        int a;
        scanf("%d",&a);
        if(a < 18 && a >0)
        {
            printf("他还是一个孩子啊\n",a);
        }
        else if(a > 50 )
        {
            printf("他是一位老人啊\n",a);
        }
        else
        {
            printf("年轻人就得多努力\n",a);
        }
    }
    while(b);





}

doWhileTestVSWhile(int b)
{
    /*
        当输入的值为0-18的时候,输出 他还是一个孩子啊
        当输入的值为>50的时候,输出 他只是一位老人啊

    do {
        循环体中的语句;
        能够让循环结束的语句;
        ....
    } while(循环控制条件);
        */

    while(b)
    {
        printf("当前的b的值为:%d",b);
        printf("请输入他的年龄\n");
        int a;
        scanf("%d",&a);
        if(a < 18 && a >0)
        {
            printf("他还是一个孩子啊\n",a);
        }
        else if(a > 50 )
        {
            printf("他是一位老人啊\n",a);
        }
        else
        {
            printf("年轻人就得多努力\n",a);
        }
    }
}

do…while 和 while 的区别

do…while 至少执行一次
while 可能一次都不执行

for循环

for(初始化表达式;循环条件表达式;循环后的操作表达式) {
    循环体中的语句;
}

对比 while 来说, for 更节约内存空间
案例

#include <stdio.h>

int main()
{
    int num = 5;
    forTest(5);

}

forTest(int b)
{
    /*

    for(初始化表达式;循环条件表达式;循环后的操作表达式) {
        循环体中的语句;
    }
    */
    for(int startNum = 0; startNum<b; startNum++)
    {
        printf("当前的startNum的值为:%d",startNum);
        printf("请输入他的年龄\n");
        int age;
        scanf("%d",&age);
        if(age < 18 && age >0)
        {
            printf("他还是一个孩子啊\n",age);
        }
        else if(age > 50 )
        {
            printf("他是一位老人啊\n",age);
        }
        else
        {
            printf("年轻人就得多努力\n",age);
        }
    }

}

输出为:
在这里插入图片描述

案例输出九九乘法表;

#include <stdio.h>

int main()
{
    forTest();
}

forTest()
{
    /*
    99 乘法表
    1*1=1
    1*2=2 2*2=4
    1*3=3 2*3=6 3*3=9
    ...
    for(初始化表达式;循环条件表达式;循环后的操作表达式) {
        循环体中的语句;
    }
    */
    // 遍历1-9 每遍历一次 输出一行
    for(int a = 1 ; a <=9; a++)
    {
        //printf("当前a的值为%d \n",a);
        for(int b =1; b<=a; b++)
        {
            //printf("当前a的值为%d ,b的值为%d ",a,b);
            printf("%d*%d=%d \t",b,a,a*b);
        }
        printf("\n");
    }

}

输出为:
在这里插入图片描述

循环优化

在多重循环中,应当将最长的循环放在最内层,最短的循环放在最外层,减少CPU跨循环层切换的次数

举个栗子🌰:
有500道菜,都需要品尝一遍,两种方案,一种方案是:是一个桌子上100道菜,一共5个桌子。另外一种方案是一个桌子上5道菜,一共100个桌子。哪种方案品尝的快一些。

for (row=0; row<100; row++)
    {
        // 低效率:长循环在最外层
        for ( col=0; col<5; col++ )
        {
            sum = sum + a[row][col];
        }
    }

    for (col=0; col<5; col++ )
    {
        // 高效率:长循环在最内层
        for (row=0; row<100; row++)
        {
            sum = sum + a[row][col];
        }
    }

四大跳转

C语言中提供了四大跳转语句, 分别是returnbreakcontinuegoto

break:

备注:无限循环电影中的那个契机,如果不热爱生活,或balabala,那么就永远在循环中,要想跳出循环,就需要一个条件,然后打破当前循环
类似与打王者荣耀,退出五人局
立即跳出switch语句或循环,一个 break 只向外跳一层,同一层, break 后面的语句不会执行
如果switch没有break

#include <stdio.h>

int main()
{
    aSwitch10();
}

aSwitch10()
{
    int a;
    printf("请输入功能选项,8表示XX,10表示YY,其它为ZZ\n");
    scanf("%d",&a);

    switch(a)
    {
    case 8:
        printf("当前选择了8,值为:%d \n",a);
        // break;
    case 10:
        printf("当前选择了10,值为:%d \n",a);
        // break;
    default:
        printf("当前为默认值\n");
    }
}

输出为:
在这里插入图片描述

案例

#include <stdio.h>

int main()
{
    breakTest();
}

breakTest()
{
    for(int a = 0;a<5;a++){
        printf("当前a的值为%d\n",a);
        if(a==3){
            break;
        }
    }
}

输出为
在这里插入图片描述

continue

结束 本轮 ,进入 下一轮 循环
类似打王者荣耀退出当前局进行下一局
案例

#include <stdio.h>

int main()
{
    continueTest();
}

continueTest()
{
    for(int a = 0;a<20;a++){

        if(a %2 ==0){
            continue;
        }
        printf("当前a的值为%d\n",a);
    }
}

输出为:
在这里插入图片描述

goto

仅在本函数内实现跳转,不能实现跨函数跳转,goto 会破坏结构化程序设计流程,它将使程序层次不清,且不易读,所以慎用

#include <stdio.h>

int main()
{
    goToTestOne();
    goToTestTwo();

}

goToTestOne()
{
    int num = 0;
// loop:是定义的标记
loop:
    if(num < 10)
    {
        printf("num = %d\n", num);
        num++;
        // goto loop代表跳转到标记的位置
        goto loop;
    }
}

goToTestTwo()
{
    while (1)
    {
        while(1)
        {
            goto out;
            printf("dfdf\n");
        }
    }
out:
    printf("跳过了所有循环");
}

输出为:
在这里插入图片描述

return

结束当前函数,将结果返回给调用者
类似打王者荣耀退出当前游戏

案例

基于for循环输出圣诞树,参考https://blog.csdn.net/qq_58417838/article/details/127562174

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
	system("color 4");//设置控制台的字体颜色
	int i, j, k,m;
//由以上两个四层字符代码可以引入第四个变量m,进行多次循环嵌套,代码如下
	for (m = 0; m < 7; m++){
		for (i = 0; i < 4; i++)//四行为一组
		{
			for (j = 0; j < 40 -(m+1)* i-m; j++)//相当于在控制台的第i行输出40-i个空格
				printf(" ");
			for (k = 0; k < (2+2*m) * i + 1+2*m; k++)//开始打印字符,每次比上一次多加了两个字符,对应的空格也在减少
				printf("^");
			printf("\n");//每一行输出完了换行
		}
	}
	for (i = 0; i < 6; i++)//和上面的每四行字符代码一样,树根设置为六行
	{
		for (j = 0; j < 38; j++)//设置38个空格
			printf(" ");
		printf("|||||");//打印树根
		printf("\n");//换行
	}
	printf("希望你天天开心,万事如意!!!\n");
	return 0;
}

输出为:
在这里插入图片描述

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

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

相关文章

HC-05蓝牙模块AT指令 ERROR问题

AT模式指令识别貌似有些问题,但不知道什么原因导致的&#xff0c;返回正常值后&#xff0c;一切通信正常。 查了一些资料&#xff0c;觉得下面两个最靠谱。 1.引脚电平问题 2.需要3.3v接EN引脚 等到故障再次发生&#xff0c;尝试EN接3.3V&#xff0c;数据收发一切正常。 结论&…

acwing基础课——bellman-ford

由数据范围反推算法复杂度以及算法内容 - AcWing 常用代码模板3——搜索与图论 - AcWing 基本思想&#xff1a; 逐遍的对图中每一个边去迭代计算起始点到其余各点的最短路径&#xff0c;执行n-1遍&#xff0c;最终得到起始点到其余各点的最短路径。&#xff08;n为连通图结点数…

CEF使用 libcef_dll_wrapper Debug版链接报错

编译后使用Release版编译链接运行正常&#xff0c;而Debug版报错如下&#xff1a; libcef_dll_wrapper.lib(cef_logging.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(CefAppEx.obj 中)具体原因是Debug版使用了Release版的库&…

图形化跟踪个股RPS走势,挖掘出源源不断的牛股!股票量化分析工具QTYX-V2.5.7...

概述RPS选股策略威廉欧奈尔把投资理念集中于他自创的CANSLIM选股系统&#xff0c;凭借着这个系统驰骋股票市场数十年&#xff0c;无论在牛市还是熊市&#xff0c;这个系统都是最稳定、表现最好的系统之一。CANSLIM选股系统中有一个RPS指标&#xff08;Relative Price Strength …

华为eNSP模拟器配置VRRP网关冗余

作用&#xff1a; 提供网关冗余功能&#xff0c;保证出口网关的高可用型。当网关发生故障的时候&#xff0c;能让PC快速的切换。 概念&#xff1a; 通过VRRP协议创建出一个虚拟网关&#xff0c;主用路由器down之后备用路由器能马上接替其主的位置&#xff0c;继续提供出口网…

【C/C++】斐波那契数列数列系列问题详解

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; C初阶 &#x1f319;励志卓越可以成为你努力的动力&#xff0c;…

1.JavaScript简介

**JavaScript ** 是什么&#xff1f;&#xff08;重点&#xff09; Js是一种专门为网页交互设计的客户端&#xff08;浏览器端&#xff09;的脚本语言&#xff1b; Js与html和css有相似之处&#xff0c;都在浏览器端解析&#xff1b; Js和java,c#,php等一样&#xff0c;是一…

Spring 通过 @Lazy 注解解决构造方法循环依赖问题

什么是循环依赖? 先定义两个类 Apple、Orange&#xff0c;如下所示&#xff1a; Component public class Apple{Autowiredprivate Orange orange; }Component public class Orange {Autowiredprivate Apple apple; }像这种在 Apple 里面有一个属性 Orange、Orange 中有一个属…

k8s 驱逐eviction机制源码分析

原理部分 1. 驱逐概念介绍 kubelet会定期监控node的内存&#xff0c;磁盘&#xff0c;文件系统等资源&#xff0c;当达到指定的阈值后&#xff0c;就会先尝试回收node级别的资源&#xff0c;比如当磁盘资源不足时会删除不同的image&#xff0c;如果仍然在阈值之上就会开始驱逐…

森林图

森林图 以统计指标和统计分析方法为基础&#xff0c;用数值计算绘制出的图形&#xff0c;通常是在平面直角坐标系中&#xff0c;以一条垂直的无效 线&#xff08;0或者1&#xff09;为中心&#xff0c;用平衡于x轴的多条线段描述每个组指标的中值和可信区间&#xff0c;最后一…

星空华文通过聆讯:吃《中国好声音》老本 华人文化是股东

雷递网 雷建平 12月9日星空华文控股有限公司&#xff08;简称&#xff1a;“星空华文”&#xff09;今日通过聆讯&#xff0c;准备在香港上市。星空华文的前身是上海灿星文化传媒股份有限公司&#xff08;简称“灿星文化”&#xff09;。2018年2月&#xff0c;灿星文化向上海证…

Web端H5播放RTSP

Web端H5播放RTSP一、要实现二、基础介绍1.RTSP是什么&#xff1f;2.RTSP播放测试工具VLC3.主流设备常用的RTSP格式三、方案1. webrtc-streamer2. 安装和配置环境3. 运行demo.html4.存疑5.参考了好多~一、要实现 不用萤石云等类似的平台&#xff0c;实现Web端直接显示监控视频。…

LwIP——以太网描述符

目录 什么是以太网DMA描述符 TX DMA描述符成员变量简介 RX DMA描述符成员变量简介 以太网DMA描述符结构 如何追踪描述符 如何创建Tx/Rx描述符 以太网发送和接收数据流程 总结 在移植LwIP之前有必要了解一下以太网DMA描述符的相关知识&#xff0c;ST以太网模块中的接收/发…

【华为OD机试真题 python】箱子之字形摆放【2022 Q4 | 100分】

■ 题目描述 【箱子之字形摆放】 有一批箱子(形式为字符串,设为str), 要求将这批箱子按从上到下以之字形的顺序摆放在宽度为 n 的空地,请输出箱子的摆放位置。 例如:箱子ABCDEFG,空地宽度为3,摆放结果如图: 则输出结果为:AFGBECD 输入描述 输入一行字符串,通过空…

19. 丢弃法(Dropout)

1. 动机 一个好的模型需要对输入数据的扰动鲁棒&#xff08;不管一张图片加入多少噪音&#xff0c;也能看清这张图片&#xff09; 使用有噪音的数据等价于Tikhonov正则丢弃法&#xff1a;在层之间加入噪音 输入数据加入随机扰动可以防止过拟合&#xff0c;泛化性更好&#xf…

Python学习基础笔记四十四——模块

1、看一个例子&#xff1a; 创建一个demo.py文件&#xff1a; print(in demo.py)def hello():print(in hello function) 然后我们在另外一个文件中import这个demo文件&#xff1a; import demo# 调用demo.py文件中的hello()函数 demo.hello() 注意&#xff0c;demo后面没有…

Linux系统网络编程——第二十节 多路复用之epoll 模型

目录 epoll相关系统调用 1、epoll_create&#xff1a; 2、epoll_ctl() 3、epoll_wait epoll模型原理 epoll的使用场景 各位好&#xff0c;博主新建了个公众号《自学编程村》&#xff0c;拉到底部即可看到&#xff0c;有情趣可以关注看看哈哈&#xff0c;关注后还可以加博主…

Redis原理篇

目录Redis数据结构动态字符串SDS整数集合Intset键值型Dict压缩链表 ZipList快速链表QuickList跳表SkipList对象RedisObjectRedis网络模型Redis通信协议-RESP协议Redis内存回收过期key处理内存淘汰策略Redis数据结构 动态字符串SDS Redis构建了一种新的字符串结构&#xff0c;…

从C#5.0说起:再次总结C#异步调用方法发展史

本篇继续介绍WaitHandler类及其子类 Mutex&#xff0c;ManualResetEvent&#xff0c;AutoResetEvent的用法。 .NET中线程同步的方式多的让人看了眼花缭乱&#xff0c;究竟该怎么去理解呢&#xff1f; 其实&#xff0c;我们抛开.NET环境看线程同步&#xff0c;无非是执行两种操…

软件测试基础知识总览【纯知识,建议收藏慢慢学】

1. 软件测试定义 首先要明确测试的定义,所谓测试,就是以检验产品是否满足需求为目标。 而软件测试,自然是为了发现软件(产品)的缺陷而运行软件(产品) 比较标准的软件测试的定义是:在规定的条件下对程序进行操作&#xff0c;以发现错误&#xff0c;对软件质量进行评估。 IEE…