C语言--循环细讲

三种循环 while()、do while();、for( ; ; )

累加思想

//1-100累加

/*

累加思想:只需要将每次相加的数字保存起来,再和下一个数字相加即可

1+2+3+4+5+……
  3+3+4+5+……
    6+4+5+……
     10+5+……
     
即: sum = sum + X

*/
#include<stdio.h>

int main()
{

//	int i=1,sum=0;
//	while(i<=100){
//		sum=sum+i;
//		i++;
//	}
//	printf("%d\n",sum);

	return 0;
}

使用方法

while() do while();

1、while()语句 ----当条件为假时,循环体一次也不执行 
	int i=1,sum=0;
	while(i<=100){
		sum=sum+i;
		i++;
	}
	printf("%d\n",sum);
	
	
	
2、do while();语句----括号后面有分号 
	int i=1,sum=0;
	do{
		sum=sum+i;
		i++;
	}
	while(i<=100);
	printf("%d\n",sum);
	

区别:
while()语句 -------当条件为假时,循环体一次也不执行 
do while();语句----当条件为假时,循环体执行一次 

for

1、for(;;)语句----中间是分号!!!定义中间是逗号!! 
	int i,sum=0;
	for(i=1;i<=100;i++)
	sum=sum+i;
	printf("%d\n",sum);



2、for(;;)语句----增量为负时	
	int sum=0;
	for(i=100;i>=1;i--)
	sum=sum+i;
	printf("%d\n",sum);
	


3、for(;;)语句----表达式1和3可以是与循环控制无关的表达式 
	int i=0,sum;
	for(sum=0;i<=100;i++) 
	sum=sum+i;
	printf("%d\n",sum);
	
	
	
4、for(;;)语句----表达式1和3可以是多个表达式(逗号) 
	int i,j,sum=0;
	for(i=0,j=100;i<j;i++,j--)
	sum=sum+i+j;					//循环体 
	sum=sum+(i+j)/2;				//循环体结束后再加上中间未取到的值 
	printf("%d\n",sum);	
	
	
	
5、for(;;)语句----表达式2可以是 关系表达式(i<=100),逻辑表达式(a<b && x<y),
数值表达式1,0,字符表达式(c=getchar())!='\n',只要其值为非0,就执行表达式 
	int i;
	char c;
	for(i=0;(c=getchar())!='\n';i=i+c);		//注意:循环体是空语句,循环体实际上放到了表达式3中 
	printf("%d\n",i);						//作用:不断输入字符,将其ASCII码相加,直到输入换行符 
	
	
常用于: 
	char c;
	for(;(c=getchar())!='\n';)				//作用:不断输入字符,然后将其原样输出,直到输入换行符 
	printf("%c",c);
	

等同于 
	char c;
	while((c=getchar())!='\n')
	printf("%c",c);

循环嵌套 break与continue

题目:输出4*5的矩阵

/*
题目:输出4*5的矩阵
1       2       3       4       5
2       4       6       8       10
3       6       9       12      15
4       8       12      16      20

循环嵌套: 
	外层循环用来输出一行数据
	内层循环用来输出一列数据
*/



//循环嵌套,看i和j的关系 

#include<stdio.h>
int main()
{
	int i,j;
	for(i=1;i<=4;i++)				//外层循环用来输出一行数据
	{
		for(j=1;j<=5;j++)			//内层循环用来输出一列数据
		{
			printf("%d %d\t",i,j); 
		}
		printf("\n");
	}
	printf("\n");
	return 0;
}

输出结果:
1 1     1 2     1 3     1 4     1 5
2 1     2 2     2 3     2 4     2 5
3 1     3 2     3 3     3 4     3 5
4 1     4 2     4 3     4 4     4 5

==> 题目上的数字实际上就是i*j的结果 

    
    
#include<stdio.h>
int main()
{
	int i,j,n=0;
	for(i=1;i<=4;i++)				//外层循环用来输出一行数据
		for(j=1;j<=5;j++,n++)		//内层循环用来输出一列数据,n用来累计输出的个数 
		{
			if(n%5==0)				//每5个数据换一次行 
				printf("\n");
			printf("%d\t",i*j); 
		}
	printf("\n");
	return 0;
}

break作用

#include<stdio.h>
int main()
{
	int i,j,n=0;
	for(i=1;i<=4;i++)
		for(j=1;j<=5;j++,n++)
		{
			if(n%5==0)
				printf("\n");
			if(i==3 && j==1)		//遇到第3行第1列,就终止内循环 
				break;
			printf("%d\t",i*j); 
		}
	printf("\n");
	return 0;
}

输出结果:
1       2       3       4       5
2       4       6       8       10

4       8       12      16      20 

continue作用

#include<stdio.h>
int main()
{
	int i,j,n=0;
	for(i=1;i<=4;i++)
		for(j=1;j<=5;j++,n++)
		{
			if(n%5==0)
				printf("\n");
			if(i==3 && j==1)		//遇到第3行第1列,跳过此次循环,继续执行下一次循环 
				continue;
			printf("%d\t",i*j); 
		}
	printf("\n");
	return 0;
}

输出结果:
1       2       3       4       5
2       4       6       8       10
6       9       12      15
4       8       12      16      20

实例:求pi的值

//求pi的值,pi的计算公式:PI/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 …


/*

思路 ==>循环累加问题: 
设pi初值为1 ==> 累加就是  ==> pi=pi+X 
如何求X: 
分子始终为1
分母依次加2 ==> n=n+2
符号每次与上一次相反 ==> sign=sign*(-1) ==> sign=-sign
把符号与分子相结合,设sign初值为1,下一项自然就是-1
所以,X=sign/n 

abs(x) ==> 求整数x的绝对值,结果是整型 
fabs(x) ==> 求双精度数x的绝对值,结果是双精度型 
*/

#include<stdio.h>
#include<math.h>
int main()
{
	int sign=1;						//sign代表当前项的符号,放到分子上 
	double pi=0.0,n=1.0,term=1.0;	//pi代表多项式的值,n代表分母,term代表当前项的值 
	while(fabs(term)>=1e-6)			//检查当前项的值是否大于1e-6 
	{
		pi=pi+term;					//将当前项的值term累加到pi中 
		sign=-sign;					//每循环一次,符号就与上一次的相反 
		n=n+2;						//分母每次加2 
		term=sign/n;				//计算下一项的分母 
	}
	pi=pi*4;						//别忘了乘以4,才是pi 
	printf("%10.8f\n",pi);			//注意,输出的是浮点数 
	return 0;
}
/*
输出结果: 
3.14159065

输入输出了8位小数,但是只有前5位是有效数字,因为是1e-6,第6位开始后面的四舍五入了,(1e-6循环50万次) 
如果改成while(fabs(term)>=1e-8),输出结果则是 3.14159263,第8位开始后面的四舍五入,(1e-8循环5000万次) 

*/

斐波那契数列

/*
输出斐波那契数列前40项
 
斐波那契数列,又称黄金分割数列,以兔子繁殖为例子而引入,故又称为兔子数列
即:从第 3 项开始,每一项都等于前两项之和
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,……


特点是从第三项开始,该数是其前两个数之和 
1 + 1 = 2
1 + 2 = 3
2 + 3 = 5
3 + 5 = 8
…… 

反过来求值: 
2 = 1 + 1
3 = 1 + 2
5 = 2 + 3
8 = 3 + 5
…… 

*/


/*
方法一:把f1作为当前数的前两个数,f2作为当前数的前一个数,f3就是当前数

把第二个值,赋值给第一个值
再把第三个值,赋值给第二个值
以此类推
 
*/


#include<stdio.h>
int main()
{
	int f1=1,f2=1,f3;
	int i;
	printf("%d\n%d\n",f1,f2);
	for(i=0;i<=38;i++)			//前2项已经输出,只需要循环38此即可得到前40项 
	{
		f3=f1+f2;
		printf("%d\n",f3);
		f1=f2;					//把第二个值,赋值给第一个值 
		f2=f3;					//把第三个值,赋值给第二个值,然后f1+f2实际上就是f2+f3 = f4 
	}

	return 0;
 } 

/*
程序改进----方法二:
f1+f2的结果不放在f3中,而放在f1中(因为此时的f1这个变量后面不需要了)
即(第三个值):f1=f1+f2,此时的f1就相当于f3; 

再执行下一项f4,即 f2+f1(这里f1实际上是f3)=f4
而此时的f2这个变量后面不需要了,因此就把f2当作f4,即(第四个值):f2=f2+f1

*/ 


#include<stdio.h>
int main()
{
	int f1=1,f2=1;
	int i;
	for(i=1;i<=20;i++)			//一次输出两项,只需输出20次即可 
	{
		printf("%10d %10d ",f1,f2);
		if(i%2==0)				//每输出4项换一次行 
			printf("\n");
		f1=f1+f2;				//f1+f2实际上是f3,放到f1中 
		f2=f2+f1;				//f2+f1实际上是f2+f3=f4,放到f2中,依次类推 
	}

	return 0;
}

判断素数

方法1

//判断素数:输入一个数n,让他依次除以i(i从2到n-1),如果能被其中任意一个数整除,就不是素数

/*
方法1: 如果能被其中任意一个数整除,就break跳出,此时的i肯定小于n,
因为循环次数未达到n次,如果n不能被任何一个数整除,就不会执行break,循环次数就会达到n次
(虽然最后一次判断是i<n,但是,此次循环过后还要i++),所以如果i==n,那就是素数 
即:小于n就不是素数,否则就是素数 

#include<stdio.h>
int main()
{
	int n,i;
	printf("输入一个数:\n");
	scanf("%d",&n);
	for(i=2;i<n;i++)				//i取不到1和n 
		if(n%i==0)
			break;
	if(i<n)							//i的次数未达到n次 
		printf("%d不是素数\n",n);
	else 							//实际上刚好是i==n 
		printf("%d是素数\n",n);
	
	return 0;
}
*/


/*
程序改进,其实n不必被 '从2到n-1' 的每个数来除,只需被 '从2到(n-1)/2' 的每个数来除即可,
甚至只需被 '从2到根下n' 的整数来除即可(根下n * 根下n = n) ,注意此时的i可以取到根下n
 
sqrt是求平方根的函数,参数为双精度,但如果是整型会自动转换为双精度 
*/

#include<stdio.h>
#include<math.h>
int main()
{
	int n,i,k;						//定义k,存放根下n 
	printf("输入一个数:\n");
	scanf("%d",&n);
	k=sqrt(n);						//双精度型数赋值给了k,又自动转换为了整型 
	for(i=2;i<=k;i++)				//此时的i可以取到n 
		if(n%i==0)
			break;
	if(i<=k)						//“=”说明可能是被最后一个数整除的 
		printf("%d不是素数\n",n);
	else 							//如果最后一个数也不能整除,那就i++,所以此时的i一定大于k,且i=k+1 
		printf("%d是素数\n",n);
	
	return 0;
}

方法二

//方法二:预先定义一个标志变量,如果是素数赋值为1,如果不是素数赋值为2,最后判断这个变量的值是否为真 

#include<stdio.h>
#include<math.h>
int main()
{
	int n,i,k,flag=1;				//先定义flag为1 
	printf("输入一个数:\n");
	scanf("%d",&n);
	k=sqrt(n);
	for(i=2;i<=k;i++)
		if(n%i==0)
		{
			flag=0;					//如果能被整除,就为0,即下面的条件为假,不是素数 
			break;					//并且停止后续判断		
		 }  
	if(flag)
		printf("%d是素数\n",n);
	else 
		printf("%d不是素数\n",n);
	
	return 0;
}

求100-200之间的素数

//求100-200之间的素数

#include<stdio.h>
#include<math.h>
int main()
{
	int i,j,k,flag;
	for(i=101;i<=200;i++)		//也可以i=i+2,因为偶数都不是素数,所以只需要对奇数进行判断即可 
	{
		flag=1;					//每次循环需要将flag重置为1
		k=sqrt(i);
		for(j=2;j<=k;j++)
		{
			if(i%j==0)
			{
				flag=0;
				break;
			}
		
		}
		if(flag)
		printf("%d ",i);
	}
	return 0;
 } 

译密码

//译密码:将字母往后推4个

/*
#include<stdio.h>
int main()
{
	char c;
	c=getchar();						//输入字符
	while(c!='\n')
	{
		if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))			//如果是字母 
		{
			if((c>='A'&&c<='V')||(c>='a'&&c<='v'))
				c=c+4;
			else
				c=c+4-26;
		}
		printf("%c",c);					//输出字符 
		c=getchar();					//输入下一个字符 
	}
	printf("\n");
	return 0;
 } 

*/


//程序改进

#include<stdio.h>
int main()
{
	char c;
	while((c=getchar())!='\n')					//前后两个读入字符合并成一个 
	{
		if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
		{
			c=c+4;
			if((c>='Z'&&c<='Z'+4)||(c>='z'))
			c=c-26;
		}
		printf("%c",c);
	}
	printf("\n");	
	return 0;
 } 
 
posted @ 2022-10-16 16:11  王智刚  阅读(14)  评论(0编辑  收藏  举报