IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言学习之路--分支语句和循环语句,从知识到实战 -> 正文阅读

[C++知识库]C语言学习之路--分支语句和循环语句,从知识到实战

一、前言

  • 本人是一名小白,这一篇是记录我C语言学习中的分支语句和循环语句的所学所得,仅为简单的认识下C语言中的各个知识。
  • 重点内容如下图

二、什么是语句?

  • C语句可分为以下五类:
  1. 表达式语句(2+3;)
  2. 函数调用语句
  3. 控制语句
  4. 复合语句
  5. 空语句
  • 本章后面介绍的是控制语句
  • 控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。—>C语言是一门结构化的程序设计语言
  • 可分成以下三类:
  1. 条件判断语句也叫分支语句:if语句、switch语句;
  2. 循环执行语句:do while语句、while语句、for语句;
  3. 转向语句:break语句、goto语句、continue语句、return语句。

三、分支语句(选择结构)

  • 人生处处面临选择,不同的选择也让这个世界多元化,在程序的设计中也是如此。

1、if语句

1、那if语句的语法结构是怎么样的呢?

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	//单分支
	if(表达式)
		语句;
	//表达式为真,语句执行
	//在C语言中如何表示真假?0表示假,非0表示真。

	//双分支
		if (表达式)
			语句1;
		else
			语句2;
	//多分支
	if (表达式1)
		语句1;
	else if (表达式2)
		语句2;
	else
		语句3;;

	return 0;
}

2、应用举例

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    int age = 0;
    scanf("%d", &age);//20

    //单分支
    //if (age >= 18)
    //    printf("成年\n");

    //双分支
    //if (age >= 18)
    //    printf("成年\n");
    //else
    //    printf("未成年\n");

    //多分支
    if (age < 16)
        printf("少年\n");
    else if (age >= 16 && age < 30)
        printf("青年\n");
    else if (age >= 30 && age < 40)
        printf("中年\n");
    else if (age >= 40 && age < 56)
        printf("壮年\n");
    else if (age >= 56 && age < 80)
        printf("老年\n");
    else
        printf("老寿星\n");

    return 0;
}

运行结果
在这里插入图片描述

  • 注意:if可以嵌套(if里面还有if)

3、那如果条件成立,要执行多条语句,该应该使用代码块呢?

#include <stdio.h>
int main()
{
    if(表达式)
   {
        语句列表1}
   //if语句只能控制一条语句,这里的一对 { } 就是一个代码块。
    else
   {
        语句列表2}
    return 0;
}

举例

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int age = 20;

	if (age >= 18)
	{
		printf("成年\n");
		printf("担当责任\n");
	}
	return 0;
}

运行结果
在这里插入图片描述

4、悬浮else

  • 当我们打出下面这个代码
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("hehe\n");
		else
			printf("haha\n");
	return 0;
}

运行结果
在这里插入图片描述
我们会发现什么都没有。

  • 我们需要修改成以下
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	{
		if (b == 2)
		{
			printf("hehe\n");
		}
	}
	else
	{
		printf("haha\n");
	}
	return 0;
}

运行结果
在这里插入图片描述

  • 为什么会出现这种情况呢?
    else的匹配:else是和它离的最近的if匹配的。
  • 注意
    if+else是一条语句。

5、if书写形式的对比

#define  _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
int main()
{
	int condition = 0;
	int x, y;
	//代码1
	if (condition) {
		return x;
	}
	return y;

	//代码2
	if (condition)
	{
		return x;
	}
	else
	{
		return y;
	}

	//代码3
	int num = 1;
	if (num == 5)
	{
		printf("hehe\n");
	}
	//代码4
	int num = 1;
	if (5 == num)
	{
		printf("hehe\n");
	}

	return 0;
}
  • 代码2和代码4更好,逻辑更加清晰,不容易出错。
  • 小练习
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//比较一个变量和一个常量是否相等的时候
//建议把常量放在等号的左边


//输出1-100之间的奇数
int main()
{
	int i = 1;
	
	while (i <= 100)
	{
		
		if (i%2 == 1)
			printf("%d ", i);
		i++;
	}
	return 0;
}

运行结果
在这里插入图片描述

2、switch语句

1、介绍

  • switch语句也是一种分支语句,常常用于多分支的情况。

2、举例

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    int day = 0;
    scanf("%d", &day);
    int n = 2;
    switch (day)
    {
    //所有的case均不匹配时用default,位置不影响
    default:
        printf("选择错误\n");
        break;
    case 1:
        printf("星期1\n");
        break;
    case 2:
        printf("星期2\n");
        break;
    case 3:
        printf("星期3\n");
        break;
    case 4:
        printf("星期4\n");
        break;
    case 5:
        printf("星期5\n");
        break;
    case 6:
        printf("星期6\n");
        break;
    case 7:
        printf("星期天\n");
        break;
    }
    //break是跳出循环,case只能决定入口
    return 0;
}

运行结果
在这里插入图片描述

3、注意

  • switch后一定是整形表达式。
switch(整型表达式)
{
    语句项;
}
  • case后面是整形常量表达式
 //是一些case语句:
  //如下:
 case 整形常量表达式:
     语句;

4、在switch语句中的 break

  • break要根据具体情况使用,并不是每个case后都要加kreak
  • 当输出相同时
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
    int day = 0;
    scanf("%d", &day);
    int n = 2;
    switch (day)
    {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        printf("工作日\n");
        break;//输出相同时
    case 6:
    case 7:
        printf("休息日\n");
        break;
    default:
        printf("选择错误\n");
        break;
    }
    return 0;
}

四、循环语句

  • while
  • for
  • do while
  • 使用频率 for>while>do while

1、while循环

1、简介

  • 我们已经掌握了,if语句:
if(条件)
     语句;

当条件满足的情况下,if语句后的语句执行,否则不执行。
但是这个语句只会执行一次

  • 由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。
    那我们怎么做呢?
    C语言中给我们引入了: while 语句,可以实现循环
//while 语法结构
while(表达式)
 循环语句;
 //表达式为真(!=  0),便执行循环语句
  • while语句的执行流程
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/ad1c0ae64931474b82e32a0cef780758.png
    )
    注意:!=0代表真。
  • 应用举例
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	//打印1-10
	int i = 1;
	while (i <= 10)
	{
		printf("%d ", i);
		i++;
	}
	return 0;
}

运行结果
在这里插入图片描述

2、while语句中的break和continue

1、break

  • 举例
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	//打印1-10
	int i = 1;
	while (i <= 10)
	{
		if (i == 6)
		{
			break;
		}
		printf("%d ", i);
		i++;
	}
	return 0;
}

运行结果
在这里插入图片描述

  • 总结
    break在while循环中的作用:其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
    所以,while中的break是用于永久终止循环的。

2、continue

  • 举例
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	//打印1-10
	int i = 0;
	while (i < 10)
	{
		i++;
		if (i == 6)
		{
			continue;
		}
		printf("%d ", i);
	}
	return 0;
}

运行结果
在这里插入图片描述

  • 总结
    continue在while循环中的作用就是:continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。

2、for循环

1、简介

  • 首先,我们分析下while循环
int main()
{
	int i = 1;//1 - 初始化

	while (i < 10)//2 - 判断
	{
		printf("%d ", i);
		i++;//3 - 调整
	}

	return 0;
}

这时我们会发现好繁琐,我们能不能简化下呢?

  • 这时我们可以引用for循环
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	//打印1-10
	int i = 1;
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}

运行结果
在这里插入图片描述

  • for循环语法
    语法

for(表达式1; 表达式2; 表达式3)
循环语句;

表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。

  • for循环的执行流程图:
    在这里插入图片描述

2、break和continue在for循环中

  • 我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。
    但是还是有些差异。

1、break

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	//打印1-10
	int i = 1;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
		{
			break;
		}
		printf("%d ", i);
	}
	return 0;
}

运行结果
在这里插入图片描述

  • 我们会发现,这里的break和while中的作用一样,在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。

2、continue

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	//打印1-10
	int i = 1;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
		{
			continue;
		}
		printf("%d ", i);
	}
	return 0;
}

运行结果
在这里插入图片描述
由此,在这里,i==5时,continue只是跳过continue下面的代码,依旧会执行i++。

3、for语句的循环控制变量

  • 建议:
  1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
  2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}

4、一些for循环的变种

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	for (;;)
	{
		printf("HeHe\n");

	}
	return 0;
}

我们会发现,死循环了。

  • 注意:for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问
    题。省略判断,便是恒为真,就是死循环。
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int i = 0;
	int j = 0;
	//这里打印多少个hehe?
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			printf("hehe\n");
		}
	}
	return 0;
}

运行结果
在这里插入图片描述
3.

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int i = 0;
	int j = 0;
	//这里打印多少个hehe?
	for (; i < 3; i++)
	{
		for (;j<3;j++)
		{
			printf("hehe\n");
		}
	}
		return 0;
}

运行结果
在这里插入图片描述

  • 为什么2和3的结果不同呢?
    因为3中i为1时,进入for (;j<3;j++)时j已经是3。
  1. 使用多于一个变量控制循环
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
	{
		printf("hehe\n");
	}
	return 0;
}

运行结果
在这里插入图片描述

5、练习

//请问循环要循环多少次?
#include <stdio.h>
int main()
{
 int i = 0;
 int k = 0;
 for(i =0,k=0; k=0; i++,k++)
        k++;
 return 0;
}

零次循环。原因:k=0,即为赋值,为假。

3、do…while()循环

1、简介

  • 语法
do
 循环语句;
while(表达式);
  • 执行流程
    在这里插入图片描述
  • 举例
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int mian()
{
	int i = 1;
	do
	{
		printf("%d ", i);
		i++;

	} while (i <= 10);
	return 0;
}

运行结果
在这里插入图片描述

  • 特点
    循环至少执行一次,使用的场景有限,所以不是经常使用。

2、do while循环中的break和continue

1、break

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int i = 1;
	do
	{
	
		printf("%d ", i);

	if (i == 5)
		{
			break;
		}
		i++;

	} while (i <= 10);
	return 0;
}

运行结果
在这里插入图片描述

2、continue

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int i = 1;
	do
	{
	
		printf("%d ", i);

	if (i == 5)
		{
			continue;
		}
		i++;

	} while (i <= 10);
	return 0;
}

我们会发现程序陷入了死循环,这是因为continue会跳过循环体内后面的代码。

五、goto语句

1、前言

  • C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
  • 从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
  • 但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过
    程。

2、举例

  • 例如:一次跳出两层或多层循环。
  • 多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
  • goto语句只能在同一个函数内部跳转,不能跨函数跳转。
    goto语言真正适合的场景如下:
for(...)
    for(...)
   {
        for(...)
       {
            if(disaster)
                goto error;
       }
   }
    …
error:
 if(disaster)
         // 处理错误情况

3、应用

  • 用goto
#include <string.h>
#include <stdlib.h>


int main()
{
	char input[20] = {0};
	system("shutdown -s -t 60");
again:
	printf("请注意你的电脑在1分内关机,如果输入:我是猪,去取消关机\n");
	scanf("%s", input);
	//判断
	if (strcmp(input, "我是猪") == 0)
	{
		printf("小乖乖,这就取消关机\n");
		system("shutdown -a");
	}
	else
	{
		goto again;
	}
	return 0;
}

不用goto

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
#include <string.h>

// 一个关机程序
//1. 程序执行起来就倒计时关机,60秒后关机
//如果输入:我是猪,就取消关机
//shutdown -s -t 60
//shutdown -a 取消关机
int main()
{
	char arr[20] = { 0 };
	system("shutdown -s -t 60");
	printf("如果想去取消关机,需要输入我是猪\n");
	scanf("%s", arr);
	while (1)
	{
		if (0 == strcmp(arr, "我是猪"))
		{
			printf("小乖乖,真听话\n");
			system("shutdown -a");
			break;
		}
		else
		{
			printf("真不听话\n");
		}
	}
	return 0;
}

六、练习

1、计算 n的阶乘。

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int i = 0;
	int n = 0;
	int a = 1;
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		a = a * i;
	}
	printf("%d\n", a);
	return 0;
}

运行结果
在这里插入图片描述

2、计算 1!+2!+3!+……+10!

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 1;
	int n = 0;
	int sum = 0;
	for (n = 1; n <= 10;n++)
	{
		b = 1;
		for (a = 1; a <= n; a++)
		{
			b = b * a;
		}
		sum = b + sum;
	}
	printf("%d\n", sum);
	return 0;
}

运行结果
在这里插入图片描述

  • 在这里,我们会发现n!=(n-1)!*n
  • 因此,我们可以做如下修改
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int b = 1;
	int n = 0;
	int sum = 0;
	for (n = 1; n <= 10; n++)
	{
		b = b * n;
		sum = b + sum;   
	}
	printf("%d\n", sum);
	return 0;
}

运行结果
在这里插入图片描述

3、在一个有序数组中查找具体的某个数字n。(二分查找/折半查找)

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	char arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int key = 0;
	scanf("%d",&key);
	int right = 9;
	int left = 0;
	int mid = 0;
	int flag = 0;
	while (left <= right)
	{
		mid = (right + left) / 2;
		if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else
		{
			printf("%d\n", mid);
			flag = 1;
			break;
		}
	}
	if (flag == 0)
	{
		printf("未找到。\n");
	}
	return 0;
}

运行结果
在这里插入图片描述

4、编写代码,演示多个字符从两端移动,向中间汇聚。

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <windows.h>//Sleep的头文件
#include <stdlib.h>//system的头文件

int main()
{
	//char arr[] = "heu";//[b i t \0]
	                   // 0 1 2 3
	//strlen(arr)-1;

	char arr1[] = "welcome to heu!!!!!";
	char arr2[] = "*******************";
	int left = 0;//左下标
	int right = strlen(arr1)-1;

	while (left<=right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);//Sleep函数是实现睡眠,单位是毫秒,在linux为sleep
		system("cls");//system是一个库函数,可以执行系统命令,cls是清空屏幕的一个命令
		left++;
		right--;
	}

	printf("%s\n", arr2);

	return 0;
}

5、编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	//假设密码为123456
	char password[20] = { 0 };
	int i = 0;
	int flag = 0;
	for (i = 1; i <= 3; i++)
	{
		printf("请输入密码:>\n");
		scanf("%s", password);//数组名本质上就是地址,所以不需要取地址
		//判断两个字符串是否相等,要使用strcmp函数,不能直接使用==
		//int ret = strcmp(password, "123456");
		//如果第一个字符串小于第二个字符串,返回<0的数字
		//如果第一个字符串大于第二个字符串,返回>0的数字
		//如果第一个字符串等于第二个字符串,返回0
		if (0 == strcmp(password, "123456"))
		{
			printf("登录成功。\n");
			flag = 1;
			break;
		}
	}
	if (flag == 0)
	{
		printf("输入错误。\n");
	}
	return 0;
}

运行结果
在这里插入图片描述

七、实战(猜数字游戏实现)

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>


void menu()
{
	printf("*****************\n");
	printf("*****1.play *****\n");
	printf("*****0.exit *****\n");
	printf("*****************\n");
}

//rand函数是专门用来生成随机数的
//rand函数返回的是0~RAND_MAX(32767)之间的一个随机数
//#define RAND_MAX 0x7fff
//
//
//
//rand函数在使用之前要使用一个srand函数来设置随机数的生成器
//srand函数在程序中只要调用一次就可以了,不需要频繁调用
//
//
//
//时间戳
//C语言中,time函数会返回时间戳
//
//NULL - 空指针

void game()
{
	int a = 0;
	//1.生成1-100的随机数
	int ret = rand() % 100 + 1;

	while (1)
	{
	    printf("请输入1-100的数:>");
	    scanf("%d", &a);
		if (a > ret)
		{
			printf("您输入的数过大\n");
		}
		else if (a < ret)
		{
			printf("您输入的数过小\n");
		}
		else
		{
			printf("恭喜您,猜对了。\n");
			Sleep(1000);
			system("cls");
			break;
		}
	}
}

int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请输入数字1/0:");
		scanf("%d", &input);
		if (input == 1)
		{
			printf("请进行游戏。\n");
			game();
		}
		else if (input == 0)
		{
			printf("退出游戏。\n");
		}
		else
		{
			printf("输入错误,请重新输入。\n");
		}
	} while (input);

	return 0;
}

运行结果
在这里插入图片描述

八、总结

  • 本博客记录了我一些对于分支语句和循环语句的所学所得,有不足的地方欢迎指出,后续会逐一补充。
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 11:35:33  更:2022-10-31 11:36:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 7:06:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码