C语言基础之【程序流程结构】

往期《C语言基础系列》回顾:
链接:
C语言基础之【C语言概述】
C语言基础之【数据类型】(上)
C语言基础之【数据类型】(下)
C语言基础之【运算符与表达式】


概述

程序的流程结构 :决定了程序的执行顺序和逻辑。

C语言中的流程结构主要包括以下三种:

  1. 顺序结构:顺序结构是程序最基本的流程结构,代码按照从上到下的顺序依次执行。
  2. 选择结构(分支结构):根据条件判断执行不同的代码块。
  3. 循环结构:重复执行某段代码,直到满足特定条件。

选择结构

if语句

在这里插入图片描述

语法:

if (条件) 
{
    // 条件为真时执行的代码
}

示例:

#include <stdio.h>

int main()
{
	int a = 1;
	int b = 2;

	if (a > b)
	{
		printf("%d\n", a);
	}

	return 0;
} 

if…else语句

在这里插入图片描述

语法:

if (条件) 
{
    // 条件为真时执行的代码
} 
else 
{
    // 条件为假时执行的代码
}

示例:

#include <stdio.h>

int main()
{
	int a = 1;
	int b = 2;

	if (a > b)
	{
		printf("%d\n", a);
	}
	else
	{
		printf("%d\n", b);
	}
	return 0;
}

小练习:“三只小猪体重比较”

编写一个程序,比较三只小猪的体重,并输出最重的一只小猪的体重。

#include <stdio.h>   // 包含 printf 和 scanf 函数的头文件
#include <stdlib.h>  // 包含 system 函数的头文件

int main(void)
{
    int pig1, pig2, pig3;

    printf("请输入三只小猪的体重: ");
    scanf("%d %d %d", &pig1, &pig2, &pig3);

    if (pig1 > pig2)
    {
        if (pig1 > pig3)
        {
            printf("第一只小猪最重,体重为:%d\n", pig1);
        }
        else
        {
            printf("第三只小猪最重,体重为:%d\n", pig3);
        }
    }
    else
    {
        if (pig2 > pig3)
        {
            printf("第二只小猪最重,体重为:%d\n", pig2);
        }
        else
        {
            printf("第三只小猪最重,体重为:%d\n", pig3);
        }
    }

    system("pause");
    return 0;
}

交互过程:

请输入三只小猪的体重: 50 60 55
第二只小猪最重,体重为:60

if…else if…else语句

在这里插入图片描述

语法:

if (条件1) 
{
    // 条件1为真时执行的代码
} 
else if (条件2) 
{
    // 条件2为真时执行的代码
} 
else 
{
    // 其他情况执行的代码
}

示例:

#include <stdio.h>

int main()
{
	int a = 1;
	int b = 2;

	if (a > b)
	{
		printf("%d\n", a);
	}
	else if (a < b)
	{
		printf("%d\n", b);
	}
    else
    {
        printf("a==b\n");
    }
	return 0;
}

小练习:“三只小猪体重比较”

编写一个程序,比较三只小猪的体重,并输出最重的一只小猪的体重。

#include <stdio.h>   // 包含 printf 和 scanf 函数的头文件
#include <stdlib.h>  // 包含 system 函数的头文件

int main(void)
{
    int pig1, pig2, pig3;

    // 提示用户输入三只小猪的体重
    printf("请输入三只小猪的体重: ");
    scanf("%d %d %d", &pig1, &pig2, &pig3);

    if (pig1 > pig2 && pig1 > pig3)
    {
        printf("第一只小猪最重,体重为:%d\n", pig1);
    }
    else if (pig2 > pig1 && pig2 > pig3)
    {
        printf("第二只小猪最重,体重为:%d\n", pig2);
    }
    else
    {
        printf("第三只小猪最重,体重为:%d\n", pig3);
    }

    // 暂停程序,等待用户按键继续(Windows 系统)
    system("pause");

    // 程序正常结束
    return 0;
}

交互过程:

请输入三只小猪的体重: 50 60 55
第二只小猪最重,体重为:60

三目运算符

#include <stdio.h>

int main()
{
	int a = 10;
	int b = 20;
	int c;

	if (a > b)
	{
		c = a;
	}
	else
	{
		c = b;
	}
	printf("c1 = %d\n", c);

	a = 1;
	b = 2;
	c = ( a > b ? a : b );
	printf("c2 = %d\n", c);

	return 0;
}

输出:

c1 = 20
c2 = 2

嵌套的三目运算符:

#include <stdio.h>   // 包含 printf 函数的头文件
#include <stdlib.h>  // 包含 EXIT_SUCCESS 和 system 函数的头文件

int main()
{
    int a = 40;
    int b = 4;

    // 嵌套的三目运算符
    int m = a < b ? 69 : a < b ? 3 : 5;

    // 输出 m 的值
    printf("m = %d\n", m);

    // 输出三目运算符的结果
    printf("%d\n", a > b ? 69 : 100);

    // 暂停程序,等待用户按键继续(Windows 系统)
    system("pause");

    // 程序正常结束
    return EXIT_SUCCESS;
}

输出:

m = 5
69


三目运算符

  • a > b ? 69 : 100
    • 如果 a > b 为真,输出 69
    • 如果 a > b 为假,输出 100

嵌套的三目运算符

  • a < b ? 69 : a < b ? 3 : 5
    • 如果 a < b 为真,m 赋值为 69
    • 如果 a < b 为假,进一步判断 a < b
      • 如果 a < b 为真,m 赋值为 3
      • 如果 a < b 为假,m 赋值为 5

小练习:“三只小猪体重比较”

编写一个程序,比较三只小猪的体重,并输出最重的一只小猪的体重。

#include <stdio.h>   // 包含 printf 和 scanf 函数的头文件
#include <stdlib.h>  // 包含 system 函数的头文件

int main(void)
{
    int pig1, pig2, pig3;

    // 提示用户输入三只小猪的体重
    printf("请输入三只小猪的体重: ");
    scanf("%d %d %d", &pig1, &pig2, &pig3);

    // 使用三目运算符判断最重的小猪
    int max_pig = (pig1 > pig2) ? (pig1 > pig3 ? pig1 : pig3) : (pig2 > pig3 ? pig2 : pig3);
    char *pig_name = (pig1 > pig2) ? (pig1 > pig3 ? "第一只小猪" : "第三只小猪") : (pig2 > pig3 ? "第二只小猪" : "第三只小猪");

    // 输出最重的小猪
    printf("%s最重,体重为:%d\n", pig_name, max_pig);

    system("pause");
    return 0;
}

交互过程:

请输入三只小猪的体重: 50 60 55
第二只小猪最重,体重为:60

switch语句

语法:

switch (表达式) 
{
    case 常量1:
        // 表达式等于常量1时执行的代码
        break;
    case 常量2:
        // 表达式等于常量2时执行的代码
        break;
    default:
        // 其他情况执行的代码
}

示例:

#include <stdio.h>

int main()
{
	char c;
	c = getchar();

	switch (c) //参数只能是整型变量
	{
	case '1':
		printf("oK\n");
		break;//switch遇到break就中断了
	case '2':
		printf("not oK\n");
		break;
	default://如果上面的条件都不满足,那么执行default
		printf("are you ok?\n");
	}
	return 0;
}

小练习:“成绩等级判断器”

编写一个程序,要求用户输入一个分数(0100 之间的整数),并根据以下规则输出成绩等级:

  1. 90 分及以上:输出“优秀”
  2. 80 分到 89 分:输出“良好”
  3. 70 分到 79 分:输出“良好”
  4. 60 分到 69 分:输出“及格”
  5. 60 分以下:输出“不及格”
#include <stdio.h>
#include <stdlib.h>  // 包含 EXIT_SUCCESS 和 system 函数的头文件

int main() 
{
    int score;

    // 提示用户输入分数
    printf("请输入分数:");
    scanf("%d", &score);

    // 根据分数范围输出成绩等级
    switch (score / 10) 
    {
        case 10:    // 100 -- 90 优秀
        case 9:
            printf("优秀\n");
            break;
        case 8:     // 70 -- 89 良好
        case 7:
            printf("良好\n");
            break;
        case 6:     // 60 -- 69 及格
            printf("及格\n");
            break;
        default:    // 低于 60 不及格
            printf("不及格\n");
            break;
    }

    // 暂停程序,等待用户按键继续(Windows 系统)
    system("pause");

    // 程序正常结束
    return EXIT_SUCCESS;
}

return EXIT_SUCCESS:表示程序正常结束。

  • EXIT_SUCCESS 是标准库中定义的宏,通常值为 0

循环结构

while语句

在这里插入图片描述

语法:

while (条件) 
{
    // 条件为真时重复执行的代码
}

示例:

#include <stdio.h>

int main()
{
	int a = 20;
	while (a > 10)
	{
		scanf("%d", &a);
		printf("a = %d\n", a);
	}

	return 0;
}

小练习:“敲 7 游戏”

编写一个程序,遍历从 1100 的所有整数,并根据以下规则输出结果:

  1. 如果数字是 7 的倍数(如 7, 14, 21 等),则输出“敲桌子”
  2. 如果数字的个位数是 7(如 7, 17, 27 等),则输出“敲桌子”
  3. 如果数字的十位数是 7(如 70, 71, 72 等),则输出“敲桌子”
  4. 如果数字不满足以上任何条件,则直接输出该数字。
#include <stdio.h>  // 包含 printf 函数的头文件
#include <stdlib.h> // 包含 EXIT_SUCCESS 和 system 函数的头文件

// 敲 7
int main()
{
    int num = 1;

    while (num <= 100)
    {
         // 7的倍数、个位含7、十位含7 “敲桌子”
        if ((num % 7 == 0) || (num % 10 == 7) || (num / 10 == 7))
        {
            printf("敲桌子\n");
        }
        else
        {
            printf("%d\n", num);
        }
        num++; // 递增
    }

    // 暂停程序,等待用户按键继续(Windows 系统)
    system("pause");

    // 程序正常结束
    return EXIT_SUCCESS;
}

程序从 1100 遍历每个数字。

  • 如果数字满足以下条件之一,则输出“敲桌子”:
    • 数字是 7 的倍数(num % 7 == 0
    • 数字的个位数是 7num % 10 == 7
    • 数字的十位数是 7num / 10 == 7
  • 否则,输出数字本身。

输出:

  1
  2
  3
  4
  5
  6
  敲桌子
  8
  9
  10
  11
  12
  13
  敲桌子
  15
  16
  敲桌子
  ...

do…while语句

在这里插入图片描述

语法:

do 
{
    // 先执行一次,然后判断条件
} while (条件);

示例:

#include <stdio.h>

int main()
{
	int a = 1;
	do
	{
		a++;
		printf("a = %d\n", a);
	} while (a < 10);

	return 0;
}

输出:

a = 2
a = 3
a = 4
a = 5
a = 6
a = 7
a = 8
a = 9
a = 10

小练习:“水仙花数查找器”

编写一个程序,查找并输出 100999 之间的所有水仙花数。

水仙花数(Narcissistic Number) :指一个 n n n位数,其每个位上的数字的 n n n次幂之和等于它本身。

  • 例如:153是一个水仙花数,因为 1 3 + 5 3 + 3 3 = 153 1^3 + 5^3 + 3^3 = 153 13+53+33=153
#include <stdio.h>  // 包含 printf 函数的头文件
#include <stdlib.h> // 包含 EXIT_SUCCESS 和 system 函数的头文件

int main()
{
    int a, b, c;
    int num = 100;  //当前检查的数字,从100开始,逐步递增到999

    do 
    {
        a = num % 10;       // 存储个位数
        b = num / 10 % 10;  // 存储十位数
        c = num / 100;      // 存储百位数

        if (a * a * a + b * b * b + c * c * c == num)
        {
            printf("%d\n", num); // 输出水仙花数
        }
        num++;
    } while (num < 1000);

    // 暂停程序,等待用户按键继续(Windows 系统)
    system("pause");

    // 程序正常结束
    return EXIT_SUCCESS;
}

输出:

153
370
371
407

for语句

语法:

for (初始化; 条件; 更新) 
{
    // 条件为真时重复执行的代码
}

示例:

#include <stdio.h>

int main()
{
	int i;
	int sum = 0;
	for (i = 0; i <= 100; i++)
	{
		sum += i;
	}

	printf("sum = %d\n", sum);
	return 0;
}

输出:

sum = 5050

小练习:“猜数字游戏”

编写一个程序,实现一个简单的猜数字游戏。具体要求如下:

  1. 程序生成一个 099 之间的随机数。
  2. 用户通过输入数字来猜测程序生成的随机数。
  3. 程序根据用户的输入给出提示
#include <stdio.h>   // 包含 printf 和 scanf 函数的头文件
#include <stdlib.h>  // 包含 srand 和 rand 函数的头文件
#include <time.h>    // 包含 time 函数的头文件

int main(void)
{
    srand(time(NULL)); // 初始化随机数种子

    int n = 0;  //用户输入的数字
    int num = rand() % 100; // 生成 0 到 99 之间的随机数

    printf("猜数字游戏开始!请输入一个 0 到 99 之间的数字:\n");

    for (;;)  //死循环
    {
        scanf("%d", &n); // 读取用户输入
        if (n < num)
        {
            printf("猜小了\n");
        }
        else if (n > num)
        {
            printf("猜大了\n");
        }
        else
        {
            printf("猜中了!!!\n");
            break; // 猜中后退出循环
        }
    }

    // 暂停程序,等待用户按键继续(Windows 系统)
    system("pause");

    // 程序正常结束
    return 0;
}
  • 使用 srand(time(NULL)) 初始化随机数种子,确保每次运行程序时生成的随机数不同。
  • 使用 rand() % 100 生成一个 099 之间的随机数。

交互过程:
50
猜大了
30
猜小了
40
猜小了
45
猜大了
42
猜中了!!!

嵌套循环

循环语句之间可以相互嵌套:

#include <stdio.h>

int main()
{
	int num = 0;
	int i, j, k;
	for (i = 0; i < 2; i++)
	{
		for (j = 0; j < 2; j++)
		{
			for (k = 0; k < 2; k++)
			{
				printf("hello world\n");
				num++;
			}
		}
	}

	printf("num = %d\n", num);
	return 0;
}
  • 外层循环执行一次,内层循环执行一周

输出:

hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
num = 8

小练习:“数字时钟模拟器”

编写一个程序,模拟一个 24 小时制的数字时钟。具体要求如下:

  1. 程序应显示从 00:00:0023:59:59 的所有时间。
  2. 每秒更新一次时间,并在屏幕上显示当前时间。
#include <stdio.h>   // 包含 printf 函数的头文件
#include <stdlib.h>  // 包含 EXIT_SUCCESS 和 system 函数的头文件
#include <Windows.h> // 包含 Sleep 函数的头文件

int main()
{
    int i, j, k;

    // 时
    for (i = 0; i < 24; i++)
    {
        // 分
        for (j = 0; j < 60; j++)
        {
            // 秒
            for (k = 0; k < 60; k++)
            {
                printf("%02d:%02d:%02d\n", i, j, k); // 输出当前时间
                Sleep(1000);      // 延迟 1000 毫秒
                system("cls");   // 清屏
            }
        }
    }

    // 暂停程序,等待用户按键继续(Windows 系统)
    system("pause");

    // 程序正常结束
    return EXIT_SUCCESS;
}

输出:

00:00:00
00:00:01
00:00:02
...
23:59:59
  • 通过嵌套循环延迟函数,程序能够模拟时钟的运行。

小练习:“九九乘法表生成器”

编写一个程序,生成并输出九九乘法表的一部分。

#include <stdio.h>   // 包含 printf 函数的头文件
#include <stdlib.h>  // 包含 EXIT_SUCCESS 和 system 函数的头文件

int main()
{
    for (size_t i = 1; i <= 9; i++)
    {
        for (size_t j = 1; j <= i; j++)
        {
            printf("%dX%d=%d\t", j, i, j * i); // 输出乘法结果
        }
        printf("\n"); // 每行结束后输出空行
    }

    // 暂停程序,等待用户按键继续(Windows 系统)
    system("pause");

    // 程序正常结束
    return EXIT_SUCCESS;
}

输出:

1X1=1
1X2=2   2X2=4
1X3=3   2X3=6   3X3=9
1X4=4   2X4=8   3X4=12  4X4=16
1X5=5   2X5=10  3X5=15  4X5=20  5X5=25
1X6=6   2X6=12  3X6=18  4X6=24  5X6=30  6X6=36
1X7=7   2X7=14  3X7=21  4X7=28  5X7=35  6X7=42  7X7=49
1X8=8   2X8=16  3X8=24  4X8=32  5X8=40  6X8=48  7X8=56  8X8=64
1X9=9   2X9=18  3X9=27  4X9=36  5X9=45  6X9=54  7X9=63  8X9=72  9X9=81

小练习:“倒三角九九乘法表生成器”

编写一个程序,生成并输出倒三角形式的九九乘法表。

#include <stdio.h>   // 包含 printf 和 putchar 函数的头文件
#include <stdlib.h>  // 包含 EXIT_SUCCESS 和 system 函数的头文件

int main(void)
{
    int i, j;
    for (i = 9; i >= 1; i--) // 行
    {
        for (j = 1; j <= i; j++) // 列
        {
            printf("%dX%d=%d\t", j, i, j * i); // 输出乘法结果
        }
        putchar('\n'); // 每行结束后输出换行符
    }

    // 暂停程序,等待用户按键继续(Windows 系统)
    system("pause");

    // 程序正常结束
    return EXIT_SUCCESS;
}

输出:

1X9=9   2X9=18  3X9=27  4X9=36  5X9=45  6X9=54  7X9=63  8X9=72  9X9=81
1X8=8   2X8=16  3X8=24  4X8=32  5X8=40  6X8=48  7X8=56  8X8=64
1X7=7   2X7=14  3X7=21  4X7=28  5X7=35  6X7=42  7X7=49
1X6=6   2X6=12  3X6=18  4X6=24  5X6=30  6X6=36
1X5=5   2X5=10  3X5=15  4X5=20  5X5=25
1X4=4   2X4=8   3X4=12  4X4=16
1X3=3   2X3=6   3X3=9
1X2=2   2X2=4
1X1=1

跳转语句break、continue、goto

break语句

switch条件语句循环语句中都可以使用break语句:

  • 当它出现在switch条件语句中时,作用是:终止某个case并跳出switch结构
  • 当它出现在for、while、do-while循环语句中时,作用是:跳出当前内循环语句,执行后面的代码
  • 当它出现在嵌套循环语句中时,作用是:跳出最近的内循环语句,执行后面的代码

switch语句中使用 break

  • 用于防止 switch 语句中的代码“贯穿”到下一个 case 分支。
 #include <stdio.h>

 int main() 
 {
     int num = 2;
     switch (num) 
     {
         case 1:
             printf("数字是 1\n");
             break; // 终止 switch 语句
         case 2:
             printf("数字是 2\n");
             break; // 终止 switch 语句
         case 3:
             printf("数字是 3\n");
             break; // 终止 switch 语句
         default:
             printf("未知数字\n");
     }
     return 0;
 }

输出

数字是 2


循环语句中使用 break

  • 跳出当前内循环语句,执行后面的代码
#include <stdio.h>

int main() 
 {
     for (int i = 1; i <= 10; i++) 
      {
         if (i == 5) 
         {
             break; // 当 i 等于 5 时,退出循环
         }
         printf("%d\n", i);
     }
     printf("循环结束\n");
     return 0;
 }

输出

1
2
3
4
循环结束


嵌套循环语句中使用 break

  • 跳出最近的内循环语句,执行后面的代码
 #include <stdio.h>

 int main() 
 {
     for (int i = 1; i <= 3; i++) 
     {
          for (int j = 1; j <= 3; j++) 
          {
             if (j == 2) 
             {
                 break; // 跳出内层循环
              }
             printf("i = %d, j = %d\n", i, j);
          }
     }
      return 0;
  }

输出

i = 1, j = 1
i = 2, j = 1
i = 3, j = 1

continue语句

continue 语句:跳过当前循环的剩余部分,直接进入下一次循环的条件判断迭代

使用 continue 跳过偶数的输出:

#include <stdio.h>

int main(void)
{
    for (int i = 1; i <= 10; i++)
    {
        if (i % 2 == 0) // 如果是偶数
        {
            continue; // 跳过本次循环,直接进入下一次循环
        }
        printf("%d ", i); // 只输出奇数
    }
    return 0;
}

输出:

1 3 5 7 9

breakcontinue 的区别

特性breakcontinue
作用终止整个循环或 switch 语句跳过当前循环的剩余部分,进入下一次迭代
循环行为循环立即结束,不再执行后续代码循环继续,但跳过当前迭代的剩余代码
适用场景提前退出循环或 switch 语句跳过某些特定条件的迭代
嵌套循环中的行为只终止最内层的循环只影响当前所在的循环

continue 只能用于循环结构(forwhiledo-while),不能用于 switch 语句或其他地方。

goto语句

goto 语句 :是一种无条件跳转语句,它允许程序跳转到同一函数内的某个标签(label)处继续执行。

  • 尽管 goto 语句在某些情况下可以简化代码
  • 但它也容易导致代码结构混乱,降低可读性和可维护性

因此goto 语句在现代编程中通常不推荐使用。

goto 语句的基本语法:

goto label;
...
label:
    // 代码块
  • label 是一个用户定义的标识符,后面跟一个冒号(:
  • 当程序执行到 goto label; 时,会立即跳转到 label: 处继续执行
#include <stdio.h>

int main()
{
	goto End; //无条件跳转到End的标识
	printf("aaaaaaaaa\n");

End:
	printf("bbbbbbbb\n");

	return 0;
}

输出:

bbbbbbbb

注意事项:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int i = 0;
	int j = 0;  //如果将这句代码注释掉
				//会出现这样的错误:“goto ABX234”跳过了“j”的初始化

	for (i = 0; i < 10; i++)
	{
		if (i == 5)
			goto ABX234;
		printf("i = %d\n", i);
	}
	for (j = 0; j < 10; j++)
	{
	ABX234:
		printf("j = %d\n", j);
	}
	system("pause");
	return 0;
}

输出:

i = 0
i = 1
i = 2
i = 3
i = 4
j = 0
j = 1
j = 2
j = 3
j = 4
j = 5
j = 6
j = 7
j = 8
j = 9


尽管 goto 语句在大多数情况下不推荐使用,但在以下场景中,它可以提供一定的便利:

  1. 错误处理
    • 在函数中,如果发生错误,可以使用 goto 跳转到统一的错误处理代码块,避免重复代码
  2. 跳出多层循环
    • 在嵌套循环中,如果需要从内层循环直接跳出外层循环,可以使用 goto
  3. 资源清理
    • 在需要释放资源(如内存、文件句柄等)时,可以使用 goto 跳转到清理代码块

👨‍💻 博主正在持续更新C语言基础系列中。
❤️ 如果你觉得内容还不错,请多多点赞。

⭐️ 如果你觉得对你有帮助,请多多收藏。(防止以后找不到了)

👨‍👩‍👧‍👦 C语言基础系列 持续更新中~,后续分享内容主要涉及 C++全栈开发 的知识,如果你感兴趣请多多关注博主。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

序属秋秋秋

😘

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值