您现在的位置是:首页 >技术杂谈 >C真的不难学,不信就看下我关于循环的理解网站首页技术杂谈

C真的不难学,不信就看下我关于循环的理解

君落华 2024-10-18 00:01:02
简介C真的不难学,不信就看下我关于循环的理解

人生就是日复一日地不断的重复,既有相同的事情,也有相似的事情,却无论如何也无法回到最初。要想在生活的每一时刻都能有新的发现,恐怕只是一个美好的愿望。
下面将会给大家介绍程序中的重复流程——循环。

do语句

C语言中提供了3中循环执行语句,首先我们来看下do循环。

do语句

输入一个整数,显示它是奇数还是偶数。然后询问是否重复同样的操作,并按要求处理。
代码如下:

#include<stdio.h>

int main()
{
	int ret = 0;
	
	do
	{
		int n = 0;

		printf("请输入一个整数:");
		scanf("%d", &n);

		if (n % 2 == 0)
		{
			printf("输入的数是一个偶数
");
		}
		else
		{
			printf("输入的数是一个奇数
");
		}

		printf("要重复一次嘛?【Yes……0/No……9】");
		scanf("%d", &ret);
	} while (ret==0);

	return 0;
}

以上就是do语句的使用,下面是结构流程图
image.png
do是”执行“的意思,while是”在……期间“的意思。根据do语句的处理流程,只要在()中的表达式的判断结果不是0,语句就会循环执行。
另外do语句循环的对象语句称为循环体
本程序中do语句的循环体是{和}之间的复合语句(程序块),执行流程如下图:
image.png
本程序的情况下,如果读取到的变量的值为0,那么控制表达式ret0的判断结果就为1。因为1不等于0,所以复合语句的循环体就会再次被执行。
如果读取到的变量的值不为0,那么控制表达式ret
0的判断结果就为0,do语句就结束了。

复合语句(程序块)中的声明

上述例子中的n是在do语句中的复合语句部分进行声明的。需要注意的是,仅在复合语句中使用的变量通常要再复合语句中声明。
注意:
仅仅在复合语句中使用变量要在该复合语句中进行声明。

读取一定范围内的值

使用do语句的话,从键盘读取的数值是有限制的。代码如下;

#include<stdio.h>

int main()
{
	int hand = 0;

	do
	{
		printf("请选择出什么拳【0……石头/1……剪刀/2……布】");
		scanf("%d", &hand);
	} while (hand<0||hand>2);

	printf("你选择了");
	switch (hand)
	{
	case 0:
		printf("石头。
");
		break;
	case 1:
		printf("剪刀。
");
		break;
	case 2:
		printf("布。
");
		break;
	}

	return 0;
}

如果读取的数值是0,1,2这些”合法的值“,就会显示”石头“”剪刀“”布“。而如果输入3或者-1这样的非法的值,就会提醒再次输入。

德摩根定律

对各条件取非,然后将逻辑与变为逻辑或、逻辑或变为逻辑与,然后再取其否定,结果和原条件一样。这就是德摩根定律。表示如下图:
image.png

求多个数的和及平均值

不停地输入整数,显示其和及平均值。
代码如下:

#include<stdio.h>

int main()
{
	int sum = 0;
	int cnt = 0;
	int retry = 0;

	do
	{

		int t = 0;
		printf("请输入一个整数:");
		scanf("%d", &t);
		sum = sum + t;
		cnt = cnt + 1;

		printf("是否继续?<Yes……0/No……9>");
		scanf("%d", &ret);
	} while (retry==0);

	printf("和为%d,平均值为%.2f
", sum, (double)sum / cnt);

	return 0;
}

只要retry的值为0,就继续进行循环。
下面是求和的过程图:
image.png

复合赋值运算符

image.png
这样的称为复合赋值运算符。这里的@指代前面提到的各种运算符。
使用复合赋值运算符,计算输入的值的和以及平均值,代码如下:

#include<stdio.h>

int main()
{
	int sum = 0;
	int cnt = 0;
	int retry = 0;

	do
	{
		int t = 0;

		printf("请输入一个整数:");
		scanf("%d", &t);

		sum += t;
		cnt++;
		printf("是否继续?<Yes……0/No……9>");
		scanf("%d", &retry);

	} while (retry==0);

	printf("和为%d,平均值为%.2f
", sum, (double)sum / cnt);

	return 0;
}

后置递增运算符和后置递减运算符

上述程序中使用的++是后置运算符,使用该运算符的表达式a++,能够是操作数的值仅增加1。这种只增加1的情况,我们称为递增。
image.png
如上表,是操作符的数值减1的–运算符是后置递减运算符。
两个运算符的功能如下图:
image.png
使用复合赋值运算符和后置递增运算符、后置递减运算符,能够使程序更加简洁、更易读。

while语句

和上面介绍的do语句不同,再循环体执行之前对循环的继续条件进行判断的是while语句。

while语句

输入一个整数数值,显示它开始递减到0的每个整数的程序如下:

#include<stdio.h>

int main()
{
	int n = 0;

	printf("请输入一个整数:");
	scanf("%d", &n);

	while (n>=0)
	{
		printf("%d", n);
		n--;
	}
	printf("
");
	return 0;
}

这里为了实现递减使用了while语句,结构如下图;
image.png
while语句会在表达式达到0之前循环其中的语句。程序的流程图如下:
image.png

用递减运算符简化程序代码

#include<stdio.h>

int main()
{
	int n = 0;
	
	printf("请输入一个正整数:");

	while (n>=0)
	{
		printf("%d", n--);
	}
	printf("
");
	return 0;
}

数据递增

显示出从0开始递增到输入的整数的各个整数。代码如下;

#include<stdio.h>

int main()
{
	int i = 0;
	int n = 0;

	printf("请输入一个正整数:");
	scanf("%d", &n);

	while (i<=n)
	{
		printf("%d", i++);
	}

	return 0;
}

限定次数的循环操作

输入一个正数后,并排连续显示出该整数的个数*,代码如下:

#include<stdio.h>

int main()
{
	int n = 0;

	printf("正整数:");
	scanf("%d", &n);

	while (n-->0)
	{
		putchar('*');
	}

	printf("
");
	return 0;
}

假设输入的值等于15为例,首先对while语句的控制表达式n–>0进行判断。–是后置递减运算符,所以会对n的值是否大于0进行判断。

字符常量和putchar函数

在while语句执行的过程中,putchar('‘);被执行;像’‘这样,使用单引号括起来的字符称为字符常量,字符常量是int类型。
字符常量’'和字符串常量""的区别如下:
image.png

do语句和while语句

在执行过程中是有区别的:
do语句的循环体至少执行一次,而while语句的循环体则有可能一个也不会执行。
另外在判断时候继续执行的时间方面,do语句和while语句也完全不相同。
image.png

逆向显示整数值

输入一个非负整数,并进行逆向显示。
代码如下:

#include<stdio.h>

int main()
{
	int n = 0;

	do
	{
		printf("请输入一个正整数:");
		scanf("%d", &n);
		if (n<=0)
		{
			puts("a请不要输入一个非正整数。");
		}
	} while (n<=0);

	while (n>0)
	{
		printf("%d", n % 10);
		n /= 10;
	}

	return 0;
}

image.png
下面是执行过程;
image.png

for语句

比起使用while语句,使用for语句实现循环会使程序更加简洁、易读。

for语句

递增显示从0到输入正整数为止的各个整数。
代码如下:

#include<stdio.h>

int main()
{
	int i = 0;
	int n = 0;

	printf("请输入一个正整数:");
	scanf("%d", &n);

	for ( i = 0; i <= n; i++)
	{
		printf("%d ", i);
	}

	return 0;
}

程序变得更加的简洁了。for语句的结构图如下;
image.png

  1. 作为”预处理“,判断并执行A部分。
  2. 如果作为”继续条件“的B部分控制表达式不为0,则执行语句(循环体)。
  3. 执行语句后,判断并执行作为”收尾处理“或”下一个循环的准备处理“的C部分返回到2中。

image.png
image.png
image.png

使用for语句实现固定次数的循环

输入一个整数连续显示出该整数整数个*
代码如下:

#include<stdio.h>

int main()
{
	int n = 0;
	int i = 0;

	printf("请输入一个整数:");
	scanf(("%d", &n));

	for ( i = 1; i <=n; i++)
	{
		putchar('*');
	}
	putchar("
");
	return 0;
}

本程序中的for语句也可以替换为如下形式:

for(i=0;i<n:i++)
{
    putchar('*');
}

for循环和while循环的执行区别:
image.png
输入规定个数个整数并显示出它们的合计值和平均值(使用for语句)
代码如下:

#include<stdio.h>

int main()
{
	int i = 0;
	int sum = 0;
	int num = 0;
	int temp = 0;

	printf("输入多少个整数:");
	scanf("%d", &num);

	for ( i = 0; i < num; i++)
	{
		printf("No.%d", i + 1);
		scanf("%d", &temp);
		sum += temp;
	}

	printf("合计值:%d
", sum);
	printf("平均值:%.2f
", (double)sum / num);
	return 0;
}

偶数的枚举

下面是我编写的一段程序,实现输入一个整数值,显示该整数值以下的正偶数,代码如下:

#include<stdio.h>

int main()
{
	int i = 0;
	int n = 0;

	printf("请输入整数值:");
	scanf("%d", &n);

	for ( i = 2; i <= n; i+=2)
	{
		printf("%d ", i);
	}
	putchar('
');

	return 0;
}

for语句中的i+=2部分中使用了复合赋值运算符+=,其作用是将右操作数的值加左操作数的值。
因为是将变量i加2,所以每次循环时i的值都会加2。

约数的枚举

编写一段程序,实现输入一个整数值,显示该整数值的所有约数,代码如下:

#include<stdio.h>

int main()
{
	int i = 0;
	int n = 0;

	printf("整数值:");
	scanf("%d", &n);

	for ( i = 1; i <=  n; i++)
	{
		if (n%i==0)
		{
			printf("%d ", i);
		}
	}
	printf("
");

	return 0;
}

for语句中,变量i的值是从1到n递增的。
如果n除以i的余数为0(即n能被i整除),则判断i是n的约数,并显示它的值。

表达式语句和空语句

请看下面的代码,感觉这段代码是要显示变量n个*

for(i=1;i<=n;i++);
	putchar('*');

但是,无论n是怎样的值,结果都只显示一个*。
原因在于i++)后面的分号。只包含一个分号的语句,称为空语句,执行代码的时候什么也不会发生。
image.png

循环语句

以上说到的do语句、while语句、for语句,都是循环执行流程的语句。这就是循环语句。

多重循环

将循环语句的循环体作为循环语句,就可以进行二重、三重循环。这样的循环称为多重循环。

二重循环

实际上,在一个程序中还可以嵌套另一个循环。所根据嵌套的循环的多少,有二重循环三重循环等。它们统称为多重循环
使用二重循环显示九九乘法表,代码如下:

#include<stdio.h>

int main()
{
	int i = 0;
	int j = 0;
	
	for ( i = 1; i <= 9; i++)
	{
		for ( j = 1; j <=i ; j++)
		{
			printf("%d*%d=%d ", i, j, i * j);
		}
		printf("
");
	}
	return 0;
}

运行结果:
image.png
外侧的for语句的作用是使变量i的值从1到9递增。其中循环分别对应乘法表的第一行、第二行、……第九行。即纵方向的循环。
各行中执行的内侧的for语句的作用使变量j的值从1到9递增,这是各行中的横方向的循环。

使用break语句强制结束循环

在多重循环中执行break语句时,仅仅会跳出内侧的循环语句,而不会直接跳出所有的循环如下代码所示:

#include<stdio.h>

int main()
{
	int i = 0;
	int j = 0;

	for (i = 1; i <= 9; i++)
	{
		for (j = 1; j <= i; j++)
		{
			if (i*j>=40)
			{
				break;
			}
			printf("%d*%d=%d ", i, j, i * j);
		}
		printf("
");
	}
	return 0;
}

代码运行;
image.png
当i*j的值大于等于40时直接跳出内层循环。

显示图形

下面我们来显示长方形,代码如下:


#include<stdio.h>

int main()
{
	int i = 0;
	int j = 0;
	int width = 0;
	int height = 0;

	printf("请输入长宽:");
	scanf("%d %d", &width, &height);

	for ( i = 0; i < height; i++)
	{
		for ( j = 0; j < width; j++)
		{
			printf("*");
		}
		printf("
");
	}
	return 0;
}

image.png

程序的组成元素和格式

关键字

在C语言中,像if和else这样的标识符被赋予了特殊的意义。这种具有特殊意义的标识符称为关键字,它们是不能作为变量名使用的。
image.png

分隔符

一种有13中分隔符,就是又来分割的。
image.png

常量和字符串常量

字符常量、整数常量、浮点数常量和字符串常量都是程序的构成要素。

总结

image.png
image.png
image.png
以上就是关于C中的循环控制,其实这样看起来C也不是很难。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。