C语言从入门到精通 第六章(循环结构程序设计)

  写在前面:

  1. 本系列专栏主要介绍C语言的相关知识,思路以下面的参考链接教程为主,大部分笔记也出自该教程。
  2. 除了参考下面的链接教程以外,笔者还参考了其它的一些C语言教材,笔者认为重要的部分大多都会用粗体标注(未被标注出的部分可能全是重点,可根据相关部分的示例代码量和注释量判断,或者根据实际经验判断)。
  3. 如有错漏欢迎指出。

参考教程:C语言程序设计从入门到进阶【比特鹏哥c语言2024完整版视频教程】(c语言基础入门c语言软件安装C语言指针c语言考研C语言专升本C语言期末计算机二级C语言c语言_哔哩哔哩_bilibili

一、while语句

1、语法

while(循环条件)

{

        循环语句

}

2、执行流程

(1)判断循环条件是否为真,如果为真(值为非0)则转向下一步,如果为假(值为0)则结束while循环。

(2)运行循环体,接着转回上一步。

3、举例

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	printf("加入比特\n");
	int line = 0;
	while (line <= 20)
	{
		line++;
		printf("我要继续努力敲代码\n");
	}
	if (line > 20)
		printf("好offer\n");
	return 0;
}

二、do…while语句

1、语法

do

{

        循环语句

} while(循环条件);  //末尾有分号

2、执行流程

(1)执行一遍循环体。

(2)判断循环条件是否为真,如果为真(值为非0)则转向上一步,如果为假(值为0)则结束do…while循环。

3、举例

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int i = 10;
	do
	{
		printf("%d\n", i);    //无论如何,先执行一次循环,再判断是否满足循环条件
	} while (i < 10);
	return 0;
}

三、for语句

1、语法

for(起始表达式;条件表达式;末尾循环体)

{

        循环语句

}

2、执行流程

(1)运行起始表达式。

(2)计算条件表达式的值,如果此值不等于0(即循环条件为“真”)则转向下一步,如果此值等于0(即循环条件为“假”)则结束for循环。

(3)执行一遍循环体。

(4)运行末尾循环体,然后转向第二步。

3、举例

(1)例1:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int i = 0;
	//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}

(2)例2:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;   //即使continue了某次循环,该次循环本应执行的i++还是会执行,这样就不会出现死循环
		printf("%d ", i);
	}
	return 0;
}

4、使用for语句的一些建议和注意事项

(1)一般在for语句的末尾循环体中修改循环变量,如果是这样的话,最好不要再在for循环体内修改循环变量,防止for循环失去控制。

(2)建议for语句的循环控制变量的取值采用“前闭后开区间”写法,这点主要体现在条件表达式上,具体视情况而定,主要以代码更加清晰易读为目标。

(3)for语句的条件表达式千万不要写成赋值表达式,也就是不要把“==”写成“=”。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int i = 0;
	int k = 0;
	for (i = 0, k = 0; k = 0; i++, k++)   //k=0这个表达式的结果是k的值,k的值为0,即假,for循环不进行(如果k的值为非0,那么就是死循环)
		k++;
	return 0;
}

5、for语句的一些变种

(1)省略起始表达式、条件表达式和末尾循环体。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	for (;;)
	{
		printf("hehe\n");
	}
	//for循环中的初始化部分、判断部分、调整部分都是可以省略的,但是不建议省略,容易引发问题(判断部分一旦省略就是认为条件恒为真,只能依靠break跳出循环)

	return 0;
}

(2)for循环可以嵌套。(当然,while循环和do…while循环也可以嵌套,这里不再赘述)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int i = 0;
	int j = 0;
	//这里打印100个hehe,一次外层循环中内存循环会进行10次,而外层循环会进行10次
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)  //每次进入for循环都会执行一次起始表达式
		{
			printf("hehe\n");
		}
	}

	return 0;
}

(3)省略起始表达式。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int i2 = 0;
	int j2 = 0;
	//如果省略掉初始化部分,这里只打印10个hehe,内层循环的变量j2变成10后不会重新初始化变回0,也就不会再执行内层循环了
	for (; i2 < 10; i2++)
	{
		for (; j2 < 10; j2++)
		{
			printf("hehe\n");
		}
	}

	return 0;
}

(4)使用多个变量控制循环。

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

四、跳转语句

1、break语句

(1)break语句又称为跳出语句,由关键字break加上一个分号构成。

(2)break语句只能用在switch语句和循环语句中。

①在switch语句中,break用来使执行流程跳出switch语句,而继续执行switch语句之后的语句。

②在循环语句中,break用来使执行流程跳出本层循环体(一个break语句只能跳出一层)。

(3)举例:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

2、continue语句

(1)continue语句又称为继续语句,由关键字continue加上一个分号构成。

(2)continue语句只能用在循环语句中,它的功能是跳过循环体中尚未执行的语句并结束本次循环,然后进行下一次是否执行循环的条件判定。

①在while和do…while循环中,continue语句将使执行流程直接跳转到循环条件的判定部分,然后决定循环是否继续进行。

②在for循环中,当遇到continue时,执行流程将跳过循环体中余下的语句,而专区执行for语句中的“末尾循环体”,再根据循环条件的判断以决定循环是否继续进行。

(3)举例:

①例1:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int i = 0;
	while (i <= 10)
	{
		i = i + 1;
		if (i == 5)
			continue;
		printf("%d ", i);
	}
	return 0;
}

②例2:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	char ch = '\0';
	while ((ch = getchar()) != EOF)   //输入Ctrl + z会退出循环
	{
		if (ch < '0' || ch > '9')
			continue;
		putchar(ch);
	}
	return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的

3、goto语句

(1)goto语句又称转向语句,其语法形式如下:

goto <标号>;

①goto为关键字,标号是一个由用户命名的标识符。

②在goto语句所处的函数体中必须同时存在一条由标号标记的语句,这种语法结构称为标号语句,其格式为

<标号> : <语句>

(2)goto语句可以很方便地跳出多层循环,这是单条break语句没办法做到的,但它很容易破坏程序结构,在实际开发中应尽量避免使用goto语句。

(3)举例(请谨慎运行本例的代码):

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

int main()
{
	char input[10] = { 0 };
	system("shutdown -s -t 60");  //对本例介意的可以将该行代码替换为调用printf的语句
again:  //转移出口
	printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
	scanf("%s", input);
	if (0 == strcmp(input, "我是猪"))  //对本例介意的可以替换字符串的内容
	{
		system("shutdown -a");  //对本例介意的可以将该行代码替换为调用printf的语句
	}
	else
	{
		goto again;  //转移入口
	}
	return 0;
}

4、return语句

(1)return语句又称返回语句,它有两种语句格式:

①return;

②return <表达式>;

(2)return语句只能用在函数体中。

①在返回类型为void的函数体中,若想跳出函数体,将执行流程转移到调用该函数的位置,应使用return语句的第一种格式(也就是return后面不带表达式的一种)。

②在返回类型不是void的函数体中,应使用(应该是必须使用)return语句的第二种格式(也就是return后面带表达式的一种),使执行流程转移到调用该函数的位置,并将<表达式>的值作为函数的返回值。

五、含循环结构设计的一些例子

1、计算n的阶乘

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int n;
	scanf("%d", &n);
	int sum = 1;
	for (int i = 1; i < n + 1; i++)
	{
		sum *= i;
	}
	printf("阶乘结果为:%d\n", sum);

	return 0;
}

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

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int n = 10;
	int temp = 1;
	int sum = 0;
	for (int i = 1; i < n + 1; i++)
	{
		temp *= i;
		sum += temp;
	}
	printf("结果为:%d\n", sum);

	return 0;
}

3、使用二分查找法在一个有序数组中查找具体的某个数字n

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int left = 0;   //起始左边下标
	int right = sizeof(arr) / sizeof(arr[0]) - 1;  //起始右边下标(元素个数减一)
	int k;
	scanf("%d", &k);
	while (left <= right)
	{
		int mid = (left + right) / 2;    //中间元素下标
		//printf("mid:%d\n", mid);
		if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,下标是:%d\n", mid);
			break;
		}
		//printf("%d\n", right);
		//printf("%d\n", left);
	}
	if (right < left)
	{
		printf("未找到相应元素\n");
	}
	
	return 0;
}

4、演示多个字符从两端移动,向中间汇聚

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

int main()
{
	char arr1[] = "welcome to bit!!!!!!!";
	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);   //休息1000ms  <windows.h>
		system("cls");  //清屏   <stdlib.h>
		left++;
		right--;
	}
	
	return 0;
}

5、模拟用户登录情景,并且只能登录三次

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

int main()
{
	int cishu = 0;
	char input[20] = { 0 };
	printf("请输入密码:");
	while (cishu < 3)
	{
		scanf("%s", input);
		if (strcmp(input,"123456") != 0)
		{
			system("cls");
			printf("输入错误,请重新输入(剩余可尝试次数为%d):\n", 2 - cishu);
		}
		else
		{
			printf("登录成功!\n");
			break;
		}
		cishu++;
	}
	
	return 0;
}

6、打印九九乘法表

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	for (int i = 1; i <= 9; i++)
	{
		for (int j = 1; j <= i; j++)
		{
			printf("%d*%d=%-2d  ", j, i, i*j);   //-2表示划出两格的空间进行左对齐
		}
		printf("\n");
	}
	
	return 0;
}

7、猜数字游戏

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

void menu()
{
	printf("**********************************\n");
	printf("*********** 1.play     **********\n");
	printf("*********** 0.exit     **********\n");
	printf("**********************************\n");
}
void game()
{
	int i = rand() % 100 + 1;   //生成1-100之间的随机数
	int input2;
	system("cls");
	printf("提前看一下正确答案:%d\n", i);
	printf("输入数字:");
	while (true)
	{
		scanf("%d", &input2);
		if (input2 == i)
		{
			printf("猜对了!\n");
			break;
		}
		else if(input2 > i)
		{
			printf("猜大了!\n");
		}
		else if (input2 < i)
		{
			printf("猜小了!\n");
		}
	}
	system("pause");
	system("cls");
}

int main()
{
	srand((unsigned)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择>:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			break;
		}
	} while (input);
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Zevalin爱灰灰

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值