C语言基础第七课循环结构程序设计——第二节for循环概述、for语句表达式总结、for循环编程序计算n的阶乘,n为非负整数、while循环与for循环简单辨析、编程序求出所有的水仙花数、循环程序疑问题

一、for循环概述

循环结构程序设计——for循环
所谓for循环,就是用for语句构成的循环。

for(表达式1;表达式2;表达式3)
单条语句
第一步执行表达式1
第二步的表达式二基本就是一个判断语句
如果表达式二为真就执行循环
为假就跳出循环
第三步一般都是在循环体后面执行
图在下面

这里的单条语句就是循环体。
循环体只能是单条语句,如果需要多条语句,必须用花括号括起来,构成一条复合语句。
在这里插入图片描述

for(i=1;i<=5;i++)
printf( "%d",i);
开始i=1
1<=5
为真
然后就开始printf
然后第三步i++
这个时候i=2
2<=5
..
..
..
..
然后i++以后
i=5
5<=5
为真
再printf一次
然后执行完printf这个循环体以后
执行后面的第三步i++
此时i=6
6<=5不成立
表达式为假
跳出循环,循环结束
然后执行这个循环后面的语句
这里是return 0;
程序结束


一般来说第三步都是起一个计数器的作用
用于控制跳出循环

二、for语句表达式总结

  1. 表达式1用于给循环变量赋初值;
  2. 表达式2则是循环的条件;
  3. 表达式3用于递变循环变量的值。
  4. for循环可以看作是由while循环变形而来的。
    也就是将while循环中给循环变量赋初值的语句和循环变量递变的语句,合并到了for之后的括号中。
    从功能上来说,for循环与while循环是等价的,因而是可以完全互换的。

三、例题用for循环编程序计算n的阶乘,其中n是一个非负整数。

用while循环实现的源程序:

while循环实现的源程序:

#include<stdio.h>
int main()
{
int n,i;
double f;
scanf("%d",&n);
f=1;
i=1;
while(i<=n)
{
	f=f*i;
	i++;
}
printf("f=%.0f\n",f);
return 0;
}for。只写关键
scanf("%d",&n);
f=1;
for(i=1;i<=n;i++)
f=f*i ;
printf("f=%.0f\n",f);


for(i=1;i<=n;i++)
f=f*i ;
相当于
i=1;
while(i<=n)
{
	f=f*i;
	i++;
}

四、while循环与for循环简单辨析

for循环比while循环简洁,但不如while循环直观。
如果循环变量赋初值、循环条件、改变循环变量值这三部分不太复杂,就可以使用for循环;
反之,就应当使用while循环。

五、编程序求出所有的水仙花数。

所谓水仙花数,是指一个三位的正整数,它的每一位数字的立方和,与这个数本身恰好是相等的。
例如,153=111+555+333
因此153就是一个水仙花数。
编程思路:
要判断某一个数是否是水仙花数,只需将它的每一位数字分离出来,并判断是否符合水仙花数的条件即可。
还记得分离位数的方法吗就是/跟% 的合理利用。

#include <stdio.h>
int main()
{
int x,a,b,c;
scanf("%d",&x);
a=x/100;
b=x/10%10;
c=x%10;
if(a*a*a+b*b*b+c*c*c==x)
printf("%d是水仙花数\n",x);
else
printf("%d不是水仙花数\n",x);
return 0;
}




在这里计算立方用的是连乘
而不是POW函数
因为pow函数的值是一个实数
而X的值是一个整数
判断整数与实数相等是不严密的
因为计算机内部的实数往往会存在误差


如何求出所有的水仙花数呢?
只需要将所有的三位正整数
都判断一遍即可
让x从100递增到999
并循环执行分离和判断一个正整数的语句组
这就涉及到循环了


#include <stdio.h>
int main()
{
int x,a,b,c;
for(x=100;X<=999;X++)
{
	a=x/100;
	b=x/10%10;
	c=x%10;
	if(a*a*a+b*b*b+c*c*c==x)
		printf("%d是水仙花数\n",x);
}
return 0;
}

六、总结循环结构的编写方法

在编写循环程序时,可以按照从简单到复杂、从具体到一般的原则。
首先写出处理一个数据或部分数据的程序段,然后再扩展到完整的程序。

七、循环程序容易混淆的问题

  1. 循环条件最常见的形式,是关系表达式或逻辑表达式。
    也可以是任意标量类型(整型实型字符型枚举型指针型)的表达式。
  2. 只要表达式的值为非0,就看作真;只要表达式的值为0,就看作假。
  3. 例子
#include <stdio.h>
int main()
{
int x=5;
while(x)
{
	printf("%d",x);
	X--;
}
return 0;
}

X作为条件
while(x)等价于while(x!=0)
while(!x)等价于while(x==0)

  1. 在循环过程中,必须存在能够改变循环变量的值、并使循环趋向于结束的语句或表达式。
#include<stdio.h>
int main()
{
int i=1;
while(i<=5);
//这里多谢了一个分号
//分号我们一般将他视为空语句
/*这样循环体就变成了空语句
空语句啥也不干
再加上1<=5是永远为真的
所以运行的时候既不结束
也没有输出结果
就成了一个死循环了
同样的;问题
我们在for语句中、of语句中都见到过
注意*/
{
printf("%d",i);
i++;
}
return 0;
}
  1. 循环体只能是语法意义上的单条语句。
    如果需要多条语句的话,必须用花括号括起来,构成一条复合语句。
int i=1;
while(i<=5)
printf("%d",i);
i++;
运行的话就是一堆111111111111
1111111无限的1
因为int i=1;
while(i<=5)
就是1<=5为真
所以执行
printf("%d",i);
然后因为这是一个单条语句
所以运行结束以后
再进行条件判断
就是while(i<=5)
i不变,所以永远为真
死循环了
  1. 在循环体中,语句排列的先后顺序,对程序的运行结果能够产生影响。
    在求和的题目里面把顺序颠倒
int i=1,sum=0while(i<=100)
{
	i=i+1;
	sum=sum+i ;
}
颠倒了以后
最开始i=1+1=2;
然后sum=0+2
这样开始的1没了
到最后i=100的时候
100<=100成立
然后i=100+1=101
然后sum会多加一个101



所以说在考虑算法的时候
一定要想明白那到底是什么流程
这就体现出来流程图的重要性了
  1. 如果同一个程序中的两个循环,互不包含于对方的循环体中,那么就称之为相互平行的循环。
int i;
//循环1
for(i=1;i<=5;i++)
printf("%d,",i*i);
//循环2
for(i=1;i<=6;i++)
printf("%d,",i*i*i);

对于平行的循环
一般来说是先执行完第一个循环
不符合第一个循环的条件以后
跳出循环
然后再开始执行后面语句
本题答案:
1,4,9,16,25,1,8,27,64,125,216


平行循环的变量是可以相同的
比如本题中循环12的变量都是i

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值