一、用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;
}