专题六 循环结构

6.1while语句

6.1.1while语句的标准形式

循环结构是指在给定条件时,反复执行某个程序段。
它的一般形式为:
while {(表达式)
循环体语句;}
1.while 循环的表达式是循环进行的条件。用作循环条件的表达式一般是一个能够改变表达式值的变个值称为循环体变量。
2.当条件表达式的值为真(即非0)时,执行循环体:为假(即0)时循环体结束;while(1)表示无限循环。
3.当循环体不需要进行任何功能时,可以用空语句作为循环体。该语句形式多用于后面指针章节里的通过 while 语句,使得指针由指向首地址到指向尾地址
如 while(*(p+++2));
4.对于循环体变量的初始化应该在 while () 语句之前,但是往往在考试中会有在 whie ()语值的题型,这一点较为灵活,在后面会进行讲解。

6.1.2while语句的典型例题

1.用while 循环语句编写求值的循环

#include<stdio.h>
{
void main()
int i;
int sum;
sum=0;i=1;//定义变量sum的初值为0,i的初值为1
while(i<=100)
{
sum=sum+i;
i++;//加完后,i的值加1
}//当i>大于100,条件表达式 i<=100 的值为假,不执行循环体
printf("sum=%d\n",sum);
}

2.用公式求的近似值,直到发现某一项的绝对值小于10·为止

#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开始表达多项式的值,最后代表pi的值,n代表分母,term代表当前项的值
while(fabs(term)>=1e-6)//检查当前项term 是否大于或等于10-6
{
pi=pi+term;//把当前项累加到pi中
n+=2;//n+2是下一项的分母
sign=-sign;//sign代表符号,下一项的符号与上一项的符号相反
term=sign/n;//求出下一项的值
}
pi=pi*4;//多项式的和pi乘以4,才是pi的近似值
printf("pi=%10.8f\n",pi);
return 0;
}

3.译密码。为使电文保密,往往按一定的规律将其转换成密码,收报人再按约定的规律将其译回原文。例如,可以按以下规律将电文转化变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。例如"China!“转换为“Glmre!”。

include<stdio.h>
{
void 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");
}

6.2 do-while 语句

6.2.1 do-whlie 语句的标准形式

do-while 语句的一般形式为:

do
{
循环体;
}while(表达式);
例如 下面两个语句
int i=0:
do
{
printf("%3d",i++);
}while(i<5);//do-while 结束时的分号不能省略
显示: 0  1  2  3  4

do-while 循环类似于 while 循环。不同之处在于,它们执行循环体与计算表达式的先后顺序不同。从流程图可以看出:do-while 至少需要执行一次循环体。一般来说,do-while 无论在工程上,还是在大学考试中,出现的频率都远不及 while 语句和 for 语句。所以,不用深入地去掌握do-while 语句的写法,只需要能看懂 do-while 语句就足够了

6.2.2 do-while 语句的典型例题

用do-while 循环语句编写求1-100的和的循环

#include<stdio.h>
{
void main()
int i;
int sum;
sum=0;//与while语句相同,定义i初值1,sum初值0。
i=l;
do
{
sum=sum+i;//执行循环体,进行累加。
i++;//每次加完,i的值加1。
}while(i<=100);
printf("sum=%d\n",sum);
}

由上面一段程序可以看出,无论是否满足执行循环体的条件,对 do-while 语句程序都会执行一次循环体。

6.3 for语句

6.3.1for语句的标准形式

for 循环是功能上比 while 循环更强的一种循环结构形式。for 循环通常用于构造“初值、终值、步长”型循环其一般形式为:
for (表达式 1; 表达式2;表达式 3)
{循环体;
}
三个表达式起着不同的作用:表达式1用于进入表达式前给某些变量赋初值;表达式2表明循环的条件;表达式3用于循环中修改某些变量的值。
1.表达式 1、2、3 可以全部或者部分省略,但是“;”永远不能省略。
(1)表达式1省略,表示该 for 语句没有赋初值部分,或前面的程序段已为有关变量赋了初值,或确实没有特别的初值。
(2)表达式2省略,表示循环条件永远为真,可能循环体内有控制转移语句转出for语句;
(3)表达式3省略,表示没有对循环变量的更新,对变量的更新已在循环体内一起完成如 for(;😉;
2.空语句也可以作为 for 循环的循环体。例如: for (int i=0;i<10000;i++); 只是起到了延迟的作用.
3.表达式 1,表达式 2,表达式3 都可由包含号运算符的多个表达式组成。

6.3.2 for语句的典型例题

1.用for循环语句编写1-100之和值的程序

#include stdio.h>
void main()
{
int i
int sum;
for(i=1,sum=0;i<=100;i++)//sum 可以不在这里赋初值,在 for 语句前赋值也是可以的                    i初值为1,每次执行完循坏体就加1。
{sum+=i;}//每次执行循环,sum 的值就加上当前的值
printf("sum=%d\n",sum);
}

2.求序列1!,2!,3!..的前8,项之和。
分析项与项之间的关系,可以得出规律:第i+1项=第i项*(i+1);

#include<stdio.h>
{
void main()
int i;
long sum,t;
sum=0;
t=1;//初始化sum为0,t为1
for(i=1;i<=8;i++) //初始化i=1,只要i<=8,就执行循环体
{
sum+=t;
t*=(i+1);//每次循环sum都加上当前项数的阶乘,然后t乘上i+1
}
printf("sum=%ld",sum);
}

3.用sinx=x-x3/3!+x5/5!-x7/7!..算sinx 的近似值直到最后一项的绝对值小于1e-6为止

#include<stdio.h>
#include<math.h>
void main()
{
int i;
float x.suma,b;//sum代表和,a为分子,b为分母
char s;
printf("please input x:");
scanf("%f",&x);
s=l;
sum=0;
a=x;//分子赋初值
b=1;//分母赋初值
for(i=1;a/b>=le-6;i++)
{
sum=sum+s*a/b;//累加一项
a=a*x*x;//求下一项的分子
b=b*(2*i)*(2*i+1);/求下一项的分母
s*=-1;
}
printf(”sum=%f\n",sum);
}

4.求100-200 间的全部素数(素数: 质数(prime number)又称素数。有无限个。一个大于1的自然数,除了1和本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有此他的因数;则称为因数;否则称为合数。

#include<stdio.h>
#include<math.h>
int main()
{
int n,k,i,m=0;//定义变量n,k,i,m
for(n=101;n<=200;n=n+2) //只需要在100-200之间所有的奇数中找就行
{
fon(i=2;i<n;i++)
if(n%i==0)//只要找到能被整除的数就跳出循环
break;
if(i>=n)
printf(%d\t",n); //输出无法被整除的数,即素数
}
}

以上的程序是一个典型的找素数的模型,任何找素数的编程题目都可以套用这个模型,
5.求两个整数的最大公约数

#include<stdio.h>
void main()
{
int i;
int a,b;
scanf("%d%d",&a&b);
for(i=a<b?a:b;i>0;i--)//初值为a,b中最小值
{
if(a%i==0&&b%i==0)//如果a,b都能被i整除,那么i就是a,b的公约数
{printf("%d",i);
berak;//这里一定要用 break跳出循环,否则就会持续输出值
}
}
}

6.求 100-999之间所有的水仙花数(所谓水仙花数就是说数的百位,十位和个位数的立方和等于它本身)

#include<stdio.h>
void main()
{
int i,a,b,c;
for(i=100;i<=999;i++)
{
a=i/100;//求百位数
b=(i-a*100)/10;//求十位数
c=i%10//求个位数
if(a*a*a+b*b*b+c*c*c==i)//判断百位、十位和个位数的立方和是否等于它本身
printf("%6d",i);
}
}

6.4 辅助控制语句

6.4.1 break语句

1.语句一般形式:break;
功能:(1)跳出所在的多分支switch语句;
(2)跳出所在的while、do-while、for 循环语句(提前结束循环)
2.brak语句一个作用是使流程跳出switch 结构,继续执行下面的语句。还有就是从循环体内跳出循环如果是这种用法,break 只能使程序跳出一层循环。break 语句不能用于循环体switch 语句之外的任何其他语句。
下面,举一个简单的例子,如上一节的例5:求两个整数的最大公约数

#include<stdio.h>
void main()
{
int i;
int a,b;
scanf("%d%d",&a&b);
for(i=a<b?a:b;i>0;i--)
{
if(a%i==0&&b%i==0)
{
printf("%d",i);
break;
}
}
}

由题意,只需要输出两个整数的最大公约数,而不需要所有的公约数,因此,最后的结果应该是一个不是若干个数字。所以,如果程序没有 break 来跳出循环,那么将会继续循环,直到i=0为止,而在这个过输出的肯定不会是只有最大公约数一个数了。break 对循环体的重要性就很明显了。

6.4.2 continue 语句

continue 语句用来结束本次循环,即跳过循环体尚未执行的语句,接着进行下一次执行循环的判定。
continue 语句和 break 语句的区别是: continue 语句只是结束本次循环,而不是终止整个循环,而break结束整个循环过程。
例如把0~100之间能被5整除的数输出。程序如下:

void main()             
{int n;                 
for(n=0;n<=100;n++)      
{if(n%5!=0)                       
continue;                 
printf("%d\t",n);        
}                         
}      
void main()             
{int n;                 
for(n=0;n<=100;n++)      
{if(n%5==0)                                     
printf("%d\t",n);        
}                         
}                       

上面两段程序都能完成所需要的功能,但是却是从正反两个方面来考虑的,所以,在适当的场合合理地使用continue,可以提升整个程序的效率

6.4.3 goto 语句

goto 语句的功能是把程序控制转移到标号指定的语句处。因此,goto 语句常用于退出多重循环,其一般形式为
goto 标号:

标号:语句;
例如
goto state;
string sl,s2;//被goto跳过
int sum=2;//被goto跳过

state:

goto 语句一直是 C/C++中最有争议的语句,因此在考试中基本不会出现,作为编者,个人觉得 goto 语句要慎用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值