入门学习计算机第八天—循环语句
编译器:Microsoft Visual Studio 2010
一、循环语句
1、while语句
while 语句用来实现当型循环,即先判断循环条件,再执行循环体。
其一般语法格式为:
while(表达式)
循环语句;
例如:在屏幕上打印1-10的数字;
#include <stdio.h>
int main()
{ int a = 1;
while(a<=10)
{ printf("%d ",a);
a++;
}
return 0;
}
在while语句里加入break、continue。
加入break: 结束循环
#include <stdio.h>
int main()
{ int a = 1;
while(a<=10)
{ if(5 == a)
break;//结束循环
printf("%d ",a);
a++;
}
return 0;
}
加入continue:跳过本次循环,直接再次跳转到while的判断部分
#include <stdio.h>
int main()
{ int a = 1;
while(a<=10)
{ if(5 == a)
continue; //跳过本次循环,而导致a无法增值,出现死循环
printf("%d ",a);
a++;
}
return 0;
}
将a++更换位置:
#include <stdio.h>
int main()
{ int a = 0;//因为更改了a++的位置,要打印出1-10,a要被先赋值。
while(a<10)
{ a++;
if(5 == a)
continue;
printf("%d ",a);
}
return 0;
}
- 再看几个代码:
代码1:
#include <stdio.h>
int main()
{
int ch =0;
while((ch=getchar())!= EOF)
putchar(ch);
return 0;
}
getchar()接收键盘敲下的一个字符;
putchar()输出键盘敲下的一个字符;
ctrl + Z:获取一个EOF,end of file,文件结束标志,值为-1。
代码2:
输入密码后,按下Y/N确认密码,输出确认成功或者失败。
#include <stdio.h>
int main()
{
int ret = 0;
char password[20] = {0};
printf("请输入密码:>");
scanf("%s",password);
printf("请确认(Y/N):>");
ret = getchar();
if(ret == 'Y')
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}
但是在还未输入Y/N时就已经提示确认失败,什么原因?
进入调试窗口:输入密码后
很明显ret的值不是输入的Y,而是10,10是哪里来?代表的是什么?
通过查ASCII表可得,10代表的是\n,是换行的转义字符。所以\n是在输入密码之后,敲下回车得到的。
scanf(),getchar()是输入函数,它们都有输入缓冲区,是用来接收数据的。在输入密码123456时,输入缓冲区就得到了“123456\n”的数据,scanf读取了其中的“123456”,留下了\n。getchar读取了\n。所以ret的值就变成了10。
所以需要清空缓冲区。
#include <stdio.h>
int main()
{
int ret = 0;
char password[20] = {0};
printf("请输入密码:>");
scanf("%s",password);
getchar();//在加一个getchar()
printf("请确认(Y/N):>");
ret = getchar();
if(ret == 'Y')
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}
如果输入的值是123456 ABCD,scanf()只会读走空格前面的123456,剩下的就是空格ABCD。
又会出问题了,所以一个getchar是不能解决问题的。代码要更改为:
#include <stdio.h>
int main()
{
int ch =0 ;
int ret = 0;
char password[20] = {0};
printf("请输入密码:>");
scanf("%s",password);
while (ch = getchar()!= '\n')//在加一个循环的getchar()
{
;
}
printf("请确认(Y/N):>");
ret = getchar();
if(ret == 'Y')
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}
2,for循环
经常用到的循环语句。
for语句的一般形式:
for(表达式1;表达式2;表达式3)
循环体语句
表达式1为初始化部分,用于初始化循环变量的。
表达式2为条件判断部分,用于判断循环是否终止。
表达式3为为调整部分。
用for循环打印出1-10的数字
#include <stdio.h>
int main()
{
int i =0;
for(i=1;i<=10;i++)
{
printf("%d ",i);
}
return 0;
}
在for语句里加入break、continue。
加入break
#include <stdio.h>
int main()
{
int i =0;
for(i=1;i<=10;i++)
{ if(5 == i)
break;
printf("%d ",i);
}
return 0;
}
输出结果和while语句是一样的。
使用continue语句。
#include <stdio.h>
int main()
{
int i =0;
for(i=1;i<=10;i++)
{ if(5 == i)
continue;
printf("%d ",i);
}
return 0;
}
可知,for语句遇到continue时跳过本次循环,会进入调整语句,从而不会出现死循环。
- 使用for语句的一些建议:
1、不可在for循环体内修改循环变量,防止for循环失去控制
例如:
本意是在第5次的时候多打印个hahaha,但是在写if语句时,将判断相等的== 写成了赋值=
#include <stdio.h>
int main()
{
int i =0;
for(i=1;i<=10;i++)
{ if(i = 5)
printf("hahaha\n");
printf("hehehe\n");
}
return 0;
}
结果变成了死循环。
2、建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
#include <stdio.h>
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int i = 0;//前闭
for(i=0; i<10; i++ )//后开
printf("%d ",arr[i]);
return 0;
}
方便易懂,i<10,10次打印,10次循环,10个元素。
一些for循环的变种
变种1,
#include <stdio.h>
int main()
{
for(; ; ;)
{
printf("hehe");
}
return 0;
}
1、for循环的初始化,调整,判断都可以省略
但是:for循环的判断部分如果被省略,那判断条件就是恒为正
2、如果不是非常熟练,不要随便省略。
int main()
{
int i = 0;
int j = 0;
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
printf("hehe");
}
}
return 0;
}
输出的是100个hehe。
但是如果随便省略掉了初始化。
int main()
{
int i = 0;
int j = 0;
for(; i<10; i++)
{
for(; j<10; j++)
{
printf("hehe");
}
}
return 0;
}
输出的是10个hehe。当输出10个hehe之后,跳出小循环,返回大循环,大循环再次进入小循环时,j还是等于10,所以会跳出小循环,循环往复,就只输出了10个hehe。
变种2,
int main()
{
int x, y;
for(x=0, y=0; x<2 && y<5; x++, y++)
{
printf("hehe\n");
}
return 0;
}
打印出2个hehe。
3,do…while循环
do…while语句的一般形式:
do
循环语句;
while(表达式);
先执行一次循环体语句,然后判断表达式是否为非0,如果为真,则再次执行循环体语句,如此反复,直到表达式为0。
用do…while语句打印1-10的数字
#include <stdio.h>
int main()
{ int i = 1;
do
{
printf("%d ", i);
i++;
}
while(i<=10);
return 0;
}
加入break语句
#include <stdio.h>
int main()
{ int i = 1;
do
{
if(5 == i)
break;
printf("%d ", i);
i++;
}
while(i<=10);
return 0;
}
加入continue语句
#include <stdio.h>
int main()
{ int i = 1;
do
{
if(5 == i)
continue;
printf("%d ", i);
i++;
}
while(i<=10);
return 0;
}
死循环了,与while死循环时同理。