前言:
每天都有许多重复的事情,使我们的生活变得琐粹,使我们心烦意乱,而循环的出现恰巧可以帮助我们的生活变得简便和丰富,下面我们来了解一下它们吧!
1.do while
基本语法
名片:干就完了,别想后果,先干,再想后果!——至少执行一次do语句(是优点也是缺点)
执行逻辑:
伪代码举例:
int main()
{
初始化部分;
do
{
循环体语句;
条件控制语句;
}while(条件判断语句);//表达式结果为假,跳出循环,反之继续。
return 0;
}
伪代码:不是真正的代码,但可以辅助进行理解。
代码举例:
打印1到10
#include<stdio.h>
int main()
{
int n = 1;//初始化部分
do
{
printf("%d ",n);///循环体语句
n++;//条件控制语句
}while(n<=10);//条件判断语句
return 0;
}
注意:这里的n必须在do while的外面不能在里面,否则条件判断语句无法执行!
实现开始菜单与退出菜单
int main()
{
int n = 0;
do
{
printf("****************************\n");
printf("******** 1.开始菜单 *********\n");
printf("******** 2.退出菜单 *********\n");
printf("****************************\n");//可单独放在一个函数中
scanf("%d",&n);
switch(n)
{
case 1:
printf("开始游戏\n");
break;
case 2:
break;
default:
printf("输入错误,重新输入\n");
break;
}
}while(n!=2);//条件判断语句
return 0;
}
do while 中的break与continue
1.break——打破,终止之意。
代码举例:
- 打印1到5
#include<stdio.h>
int main()
{
int n = 1;
do
{
if(5==n)
{
break;//当n等于5时执行语句,跳出循环
}
printf("%d ",n);
n++;
}while(n<=10);
return 0;
}
2.continue——跳过(后面的语句)
- 死循环打印 5
#include<stdio.h>
int main()
{
int n = 1;
do
{
printf("%d ", n);
if (5 == n)
{
continue;//当n等于5时执行语句,跳过条件控制语句,不跳过条件判断语句。
}
n++;
} while (n <= 10);//条件判断语句
return 0;
}
2.while
基本用法
引入:
当我们还是一个菜鸡的时候,我们可以继续选择当菜鸡,也可以选择踏上卷王之路——一条漫长且艰难的旅程,如果坚持下去,终将会成为一方大佬!
那如何描述卷的过程呢?这里就要用到while循环了。
逻辑流程图:
伪代码理解:
int main()
{
//初始化部分
while(条件判断语句)
{
循环体语句;
条件控制语句;
}
return 0;
}
代码实现:
int main()
{
int bit = 1;//菜鸡就懂一点————初始化部分
while(bit<=10000)//条件判断语句
{
printf("持续学习了%d天\n",&bit);//每天不断的学习————循环体语句
}
if(bit==10000)//成为大佬的条件
{
printf("大佬\n");
}
return 0;
}
注意:判断条件所需的变量在循环体的外面!
break的使用:
int main()
{
int bit = 1;//菜鸡就懂一点
while(bit<=10000)
{
if(500==bit)//成为大佬的路上,要面临许多诱惑。
{
printf("谈恋爱了,不想学了");
break;//终止,不再进行循环
}
printf("持续学习了%d天\n",&bit);//每天不断的学习
}
if(bit==10000)//成为大佬的条件
{
printf("大佬\n");
}
else
{
printf("没成为大佬\n");
}
return 0;
}
continue的使用:
int main()
{
int bit = 1;//菜鸡就懂一点
int count = 0;//记录没学习的天数
while(bit<=10000||count<=100)
{
if(500==bit)
{
printf("明天再学\n");//三天打鱼两天晒网
count++;
continue;//跳过循环体语句
}
printf("持续学习了%d天\n",&bit);//每天不断的学习
}
if(bit==10000)//成为大佬的条件
{
printf("大佬\n");
}
else
{
printf("没成为大佬\n");
}
return 0;
}
这告诉了我们要持续的学习,不断的进步,才能走向成为大佬之路!
经典例题:二分查找/升序/降序查找/折半查找
基本思路:
#include<stdio.h>
int main()
{
int a = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;//最左边数组下标,通过下标找数组中的数
int right = 9;//最右边数组下标
int mid = (left + right) / 2;
int c = 0;
scanf("%d",&a);//要查找的数
while (left <= right)
{
if (a > arr[mid])//说明a在数组的右边,a大了
{
left = ++mid;//砍掉一半数组(左边)
mid = (left + right) / 2;
}
else if (a < arr[mid])
{
right = --mid;//砍掉一半数组(右边)
mid = (left + right) / 2;
}
else//详细的话应该是else(a == arr[mid])
{
printf("找到了,下标为:%d", mid);
c = 1;
break;
}
}
//条件不符合时也会跳出来这时我们须标记不找到的情况,也就是c不为1那找不到即为c=0
if (c == 0 )
{
printf("找不到");
}
return 0;
}
缺点:有局限性,只能查找升序或降序的序列
到这里相信聪明的你已经对while的用法有了更深一步的了解!
比较while循环和do while
3.for循环
基本语法
看了while与dowhile的比较,我们应该知道它们有一个共同的缺点:改动相对比较繁琐,为了更好的修改循环体,我们就需要用到将初始化部分,条件判断部分,条件控制语句融为一体的——for循环语句。逻辑执行图:
伪代码:
int main()
{
for(初始化语句; 条件判断语句; 条件控制语句)
{
循环体语句;
}
return 0;
}
代码:
#include<srdio.h>
int main()
{
//第一种写法(建议)
int i = 0;
// 初始化 条件判断 条件控制(语句)
for(i=1; i<11; i++)
{
printf("%d ",i);
if(5==i)
{
continue;
}
}
//第二种写法
for(int j=1; j<11; j++)
{
printf("%d ",j);
}
for(int j=1; j<11; j++)
{
printf("%d ",j);
}
//这样初始化两次j写代码有问题吗?
return 0;
}
思考: 这里的 i 为啥平常要初始化在外面,再在for里赋值呢,这样有什么好处吗?
解释: 在里面初始化的话(第二种写法)写一次需要初始化一次,因为初始化语句是在for循环内部,而不在外部,故作用域与生命周期只在for循环内部,外部无法使用!如果初始化for外部的话,直接赋值就可以使用了,并且可以在多个for循环中使用。
注意:
1.for循环括号中所用变量,不建议在循环体语句中使用!稍有不慎便会使循环无法正常进行!
2.for循环的初始化部分在for循环的整个过程中只进入一次!
3.在循环体语句的变量只能在for里面使用,除非在for循环外面初始化所要用的变量。
4.for括号内可以使用多个变量
举例:
打印1到1000中所有的位数之和
#include<stdio.h>
int main()
{
int i = 0;
int sum = 0;
int count = 0;
for(i=1; i<1001; i++)//产生1到1000的数
{
int tmp = i;//防止i被修改影响循环的正常进行
count = 1;//个位数
while(tmp>9)//十位数以上进入循环
{
tmp/=10;
count++;
}
sum+=count;
}
printf("%d",sum);
return 0;
}
for中的continue和break
代码举例:
continue
打印1到4
#include<stdio.h>
int main()
{
int i = 0;
for(i=1; i<11; i++)//产生1到10的数
{
if(5==i)
{
continue;//跳过后面的循环体语句。
}
printf("%d ",i);
//continue跳到这里
}
//打印1 2 3 4
return 0;
}
break
#include<stdio.h>
int main()
{
int i = 0;
for(i=1; i<11; i++)//产生1到10的数
{
if(5==i)
{
break;//终止循环。
}
printf("%d ",i);
}
//break跳到这里
//打印1 2 3 4
return 0;
}
例题
看到这里相信你对for循环有了一定的了解,下面我们来做几道题锻炼一下吧!
1.初始化部分的省略
思考 :打印几个hehe
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
int count = 0;//计数
for(; i<10; i++)
{
for(; j<10; j++)
{
count++;
printf("%d:hehe\n",count);//可以看出第几个hehe被打印。
}
}
return 0;
}
注意:循环可嵌套使用!
答案:
解析:省略初始化部分,则i与j为0,进入第一层for循环再进入第二层循环,每次打印一次hehe,j就加1,直到10跳出循环,再进行第一层for的第二次循环,进入第一层for,再进入第二层for,注意 !此时j为10(未进行初始化),直接跳出循环,如此进行,直到i为10时循环停止,打印十个hehe。
2.判断部分
思考:代码的执行结果
#include<stdio.h>
int main()
{
int i = 0;
for(i=1; i=0; i++)
{
printf("hehe\n");
}
return 0;
}
答案:
解析:这里的条件判断部分是将0赋给i,0为假,跳出循环!
3.多变量的使用
思考:代码打印几个hehe
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for(i=1,j=3; (i<2)&&(j<5); i++,j++)//回想一下&&的运行规则
{
printf("hehe\n");
}
return 0;
}
答案:
解析:初始化:将1赋给i,将3赋给j;判断部分:i<2为真并且j<5也为真因此判断部分为真,进入循环体语句打印hehe,再进入条件控制语句:i加1为2,j加1为4,进入判断部分:i<2为假直接跳出循环!
额外总结:
1.三种死循环(循环内没有break的情况)
1.do while
#include<stdio.h>
int main()
{
do
{
}while(1);//判断部分为非0,一直为真————这里只是举个例子,像2也可以
return 0;
}
2. while
#include<stdio.h>
int main()
{
while(1)//判断部分为非0,一直为真————这里只是举个例子,像2也可以
{
}
return 0;
}
3.for
{
int i = 0;
for( ; ; )//这里可证明for循环内的三个部分都可省略,这没有判断进行的语句因此可一直进行。
{
}
for( ; ; i=1 )//这里将1赋给i一直为真,一直进行循环
{
}
for( ; 1; )//这里1为真,一直进行循环
{
}
}
总结:只要判断部分恒为真,就会进入循环,除非内含break.
3.go to语句
1.基本逻辑
语法
伪代码:
#include<stdio.h>
int main()
{
设立标记点://冒号
goto 标记点;//去标记点+分号
return 0;
}
注意:这里go to语句只能在全局变量以内的范围中使用
名片:可死循环,也可不循环,更可跳过循环
1.死循环(不能用break结束!)
#include<stdio.h>
int main()
{
again:
printf("hehe\n");
goto again;
return 0;
}
2.正常使用
#include<stdio.h>
int main()
{
printf("hehe\n");
goto again;
again:
printf("hehe\n");
return 0;
}
3.跳出循环
int main()
{
for(exp;exp;exp)//exp是表达式
{
for(exp;exp;exp)
{
for(exp;exp;exp)
{
语句;
goto extern;
}
}
}
extern:
return 0;
}
注意:goto语句应该谨慎使用,把goto想象成闪电侠,去到过去,会影响甚至改变现在,所以尽量不要使用!
尾序
如果能认真看到这里,我坚信你能收获很多很多!也希望这篇文章能帮助到你,如果觉得不错,请点击一下不要钱的赞,如果有误请温柔的指出,在这里感谢大家了!