C Programming学习笔记【谭浩强老师编】(第五章循环结构程序设计)02 改变循环执行的状态

在这里插入图片描述



一、用break语句提前终止循环

在这里插入图片描述作用:使流程跳到循环体之外,接着执行循环体下面的语句。

注意:break语句只能用于循环语句和switch语句之中,而不能单独使用。

在这里插入图片描述

在全系1000名学生中举行慈善募捐,当总数达到10万元时就结束,统计此时捐款的人数以及平均每人捐款的数目。

#include <stdio.h>
#define SUM 100000	//指定符号常量SUM代表10万
int main()
{
	float amount,aver,total; 
	int i;
	for (i=1,total=0;i<=1000;i++)
	{
		printf("please enter amount:");
		scanf("%f",&amount);
		total=total+amount; 
		if(total>=SUM) break; 
	}
	aver=total/i;
	printf("num=%d\naver=%10.2f\n",i,aver); 
	return 0;
}

二、用continue语句提前终止循环

在这里插入图片描述作用:结束本次循环,即跳过循环体中下面尚未执行的语句,转到循环体结束点之前,接着执行for语句中的“表达式3”,然后进行下一次是否执行循环的判定。

在这里插入图片描述

要求输出100~200之间的不能被3整除的数。

在这里插入图片描述

#include <stdio.h>
int main()
{	int n;
	for (n=100;n<=200;n++)
	{	if (n%3==0)
			continue;
		printf("%d ",n);
	}
	printf("\n");
	return 0;
}

三、break语句和continue语句的区别

输出以下4×5的矩阵
在这里插入图片描述

#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) printf("\n");	//控制在输出5个数据后换行
		    //空语句 ;	  正常输出
			//if (i==3 && j==1) break;  //缺少第三行
		    //if (i==3 && j==1) continue;//缺少第三行第一个数
			printf("%d\t",i*j);
		}  
	printf("\n");    
	return 0;
}

四、循环程序举例

在这里插入图片描述

1.用公式π/4≈1−1/3+1/5−1/7+⋯求π的近似值,直到发现某一项的绝对值小于10-6为止(该项不累加)。

解题思路: 找规律:
(1) 每项的分子都是1。
(2) 后一项的分母是前一项的分母加2。
(3) 第1项的符号为正,从第2项起,每一项的符号与前一项的符号相反。
在每求出一项后,检查它的绝对值是否大于或等于10-6。

在这里插入图片描述

#include <stdio.h>
#include <math.h>				//程序中用到数学函数fabs,应包含头文件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)		//检查当前项term的绝对值是否大于或等于10-6
	{	pi=pi+term;				//把当前项term累加到pi中
		n=n+2;					//n+2是下一项的分母 
		sign=-sign;				//sign代表符号,下一项的符号与上一项符号相反
		term=sign/n;				//求出下一项的值term
	}
	pi=pi*4;						//多项式的和pi乘以4,才是π的近似值
	printf("pi=%10.8f\n",pi);			//输出π的近似值  
	return 0;
}

在这里插入图片描述
2.求Fibonacci(斐波那契)数列的前40个数。这个数列有如下特点: 第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即该数列为1,1,2,3,5,8,13,…,用数学方式表示为:
在这里插入图片描述这是一个有趣的古典数学问题: 有一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假设所有兔子都不死,问每个月的兔子总数为多少?
在这里插入图片描述
注: 假设不满1个月的为小兔子,满1个月不满2个月的为中兔子,满2个月以上的为老兔子。
求Fibonacci(斐波那契)数列的前40个数。
在这里插入图片描述

#include <stdio.h>
int main()
{ 
	int f1=1,f2=1,f3;
	int i;
	printf("%12d\n%12d\n",f1,f2);
	for(i=1; i<=38; i++)
	{
		f3=f1+f2;
		printf("%12d\n",f3);
		f1=f2;
		f2=f3;
	}
	return 0;
}

在这里插入图片描述

3.输入一个大于3的整数n,判定它是否为素数(prime,又称质数)。
在这里插入图片描述
方法1

#include <stdio.h>
int main()
{	int n,i;
	printf("please enter a integer number,n=?");
	scanf("%d",&n);
	for (i=2;i<n;i++)
		if(n%i==0) break;
	if(i<n) printf("%d is not a prime number.\n",n);
	else printf("%d is a prime number.\n",n);
	return 0;
}

方法2
程序改进:
其实n不必被2~(n-1)范围内的各整数去除,只须将n被2~√n之间的整数除即可。因为n的每一对因子,必然有一个小于√n,另一个大于√n。

#include <stdio.h>
#include <math.h>
int main()
{	int n,i,k;
	printf("please enter a integer number,n=?");
	scanf("%d",&n);
	k=sqrt(n);
	for (i=2;i<=k;i++)
		if(n%i==0) break;
	if(i<=k) printf("%d is not a prime number.\n",n);
	else printf("%d is a prime number.\n",n);
	return 0;
}

在这里插入图片描述4.求100~200间的全部素数。

#include<stdio.h>
#include<math.h>
int main()
{	int n,k,i,m=0;
	for(n=101;n<=200;n=n+2)		//n从100变化到200,对每个奇数n进行判定
	{	k=sqrt(n);
		for(i=2;i<=k;i++)
		if(n%i==0) break;			//如果n被i整除,终止内循环,此时i<k+1
		if(i>=k+1)				//若i>=k+1,表示n未曾被整除
		{	printf("%d ",n);			//应确定n是素数
			m=m+1;				//m用来控制换行,一行内输出10个素数
		}
		if(m%10==0) printf("\n");	 //m累计到10的倍数,换行
	}
	printf ("\n");
	return 0;
}

在这里插入图片描述5.译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。例如,可以按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。

解题思路:
(1) 判断哪些字符不需要改变,哪些字符需要改变。
(2)通过改变字符c的ASCII值的方式将其变为指定的字母。‘A’‘V’或’a’‘v’ :c=c+4;‘W’‘Z’或’w’‘z’ :c=c-22。

在这里插入图片描述
方法1

#include <stdio.h>
int main()
{	char c;
	c=getchar();				//输入一个字符给字符变量c
	while(c!='\n')				//检查c的值是否为换行符'\n'  
	{	if((c>='a' && c<='z') || (c>='A' && c<='Z'))	//c如果是字母
		{	if(c>='W' && c<='Z' || c>='w' && c<='z') c=c-22;
			//如果是26个字母中最后4个字母之一就使c-22
			else c=c+4;		//如果是前面22个字母之一,就使c加4,即变成其后第4个字母
		}
		printf("%c",c);			//输出已改变的字符
		c=getchar(); 			//再输入下一个字符给字符变量c
	}
	printf("\n");
	return 0;
}

方法2

#include <stdio.h>
int main()
{	char c;
				
	while((c=getchar())!='\n')				//检查c的值是否为换行符'\n'  
	{	if((c>='a' && c<='z') || (c>='A' && c<='Z'))	//c如果是字母
		{	 c=c+4;		

		}
		printf("%c",c);			//输出已改变的字符
		if(c>'Z' && c<='Z'+4 || c>'z' && c<='z'+4)  c=c-26;
			
	}
	printf("\n");
	return 0;
}


在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值