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

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

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


流程控制


控制流程(也称为流程控制)是计算机运算领域的用语,意指在程序运行时,个别的指令(或是陈述、子程序)运行或求值的顺序。不论是在声明式编程语言或是函数编程语言中,都有类似的概念。

从逻辑上,语言是为了模拟实现我们现实生活中的每件事情,通过证明只需要具有 顺序,条件分支,循环 三种流程就可以模拟我们的任何事情。

对于C语言来说,系统会按顺序执行程序中的每一行代码。但仅有顺序执行是不够的,通现实一样,C语言还需要条件分支(选择结果),循环结构。


顺序结构:

按书写顺序从上至下依次执行

bde657c8293290749f301760f544b513_5330937d22ae4239b18d01ff05b7f5aa.png


#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");

选择结构

e0faff3a7d92d8f218dbac6a56b70e3d_9ff3d81b65c44ba691a6001de2731a70.png


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 不匹配才会执行。


循环结构

2e20e246d6d34c89ae71071918c9057e_6bf84eb0d1924912b6f5ed5d50585293.png


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


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

输出为:

2ea57313fa556208d6cf8a76859848db_7d57249fb2fd45948f523e85d4708069.png


案例,带有退出机制


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

输出为:

78f71f91a489edd1efbe5ac1aaa3aadf_d03ab9c3821144b081a87b54baae27d0.png


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

输出为:

f832280e54d5a486d953d1ddc3043812_deeddab0606d44489c96b31a6a1cc425.png


案例输出九九乘法表;


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

输出为:

7ebfef89dc7afe958bd768e8c58f8a48_a6f9e66c4e1844a8913f325a276d7fcd.png


循环优化

在多重循环中,应当将最长的循环放在最内层,最短的循环放在最外层,减少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语言中提供了四大跳转语句, 分别是return、break、continue、goto


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");
    }
}

输出为:

ec5b81f04cd4a0e8fcac55a4b37670ae_7100c778994b4975a3b9135aea5329f2.png


案例


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

输出为

586a8aa3cfea4ef410795a6305cbda2a_80171756a4444669bae417b771106fbe.png


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

输出为:

a4eaf2b647dbe2dc5bf2f53c529c1164_11f123009c834a18931e4215f0e5380d.png


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("跳过了所有循环");
}

输出为:

b641f6cce47d1564890a37c8d01ebfa1_95bd3265ae4a436c882f3954324d1bdd.png


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

输出为:

ee3b5b923c5a5b1c344edd9c56a216fc_783ddf8668304686a9bb46b7fd56cf72.png

相关文章
|
28天前
|
C++
C++ 语言异常处理实战:在编程潮流中坚守稳定,开启代码可靠之旅
【8月更文挑战第22天】C++的异常处理机制是确保程序稳定的关键特性。它允许程序在遇到错误时优雅地响应而非直接崩溃。通过`throw`抛出异常,并用`catch`捕获处理,可使程序控制流跳转至错误处理代码。例如,在进行除法运算或文件读取时,若发生除数为零或文件无法打开等错误,则可通过抛出异常并在调用处捕获来妥善处理这些情况。恰当使用异常处理能显著提升程序的健壮性和维护性。
42 2
|
1月前
|
安全 编译器 程序员
【C++初阶】C++简单入门
【C++初阶】C++简单入门
|
28天前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
45 0
|
15天前
|
编译器 Linux C语言
C++基础入门
C++基础入门
|
6天前
|
JavaScript 前端开发 测试技术
一个google Test文件C++语言案例
这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
9 0
|
1月前
|
安全 编译器 C++
C++入门 | 函数重载、引用、内联函数
C++入门 | 函数重载、引用、内联函数
25 5
|
1月前
|
存储 安全 编译器
C++入门 | auto关键字、范围for、指针空值nullptr
C++入门 | auto关键字、范围for、指针空值nullptr
48 4
|
1月前
|
编译器 C语言 C++
C++入门 | 命名空间、输入输出、缺省参数
C++入门 | 命名空间、输入输出、缺省参数
33 4
|
1月前
|
编译器 程序员 C语言
C++入门
C++入门
31 5
|
30天前
|
C++
c++学习笔记03 程序流程结构
C++学习笔记,主要介绍了程序流程结构,包括顺序结构、选择结构和循环结构。选择结构中详细解释了if语句、三目运算符和switch语句的用法和注意事项。循环结构部分则涵盖了while循环、do-while循环和for循环的语法和使用技巧。此外,还介绍了跳转语句,包括break、continue和goto语句的用途和用法。
27 0