前言
作者:龟龟不断向前
简介:宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。
专栏:C++初阶知识点工具分享:
- 刷题: 牛客网 leetcode
- 笔记软件:有道云笔记
- 画图软件:Xmind(思维导图) diagrams(流程图)
如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持博主,如有不足还请指点,博主及时改正
上篇文章中我们介绍了if
语句
if(contition)//条件判断
{
exp;//语句
}
当条件满足的情况下,if语句后的语句执行,否则不执行。 但是这个语句只会执行一次。 由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。 那我们怎么做呢? C语言中给我们引入了: while 语句,可以实现循环。
而且其语法和
if
几乎是一致的,不过它会循环地执行“体内”的语句。
while(contition)//条件判断
{
exp;//语句
}
例如我们可以使用循环语句在屏幕中打印10个hello world
#include
int main()
{
int num = 10;
while (num)
{
printf("hello world");
num--;
}
return 0;
}
要想构成循环,这三个部分必不可少:1. 循环变量初始化部分(上述代码中的
num
)2.循环条件判断部分 3.循环变量的调整部分 这三个部分影响着循环的次数,没有设定好可能会导致死循环
或者循环达到的效果不尽人意,下面咱们描述时将循环{}里面的部分叫做循环体
break和continue是C语言的关键字,被使用在循环中,其中break还可以使用在switch语句中
其实大家观察上述的流程图即可发现,break和continue语句被使用在循环体中
break:其实在循环体中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。
#include
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
{
break;
}
printf("%d ", i);
i = i+1;
}
printf("\n");
return 0;
}
上述的循环i本应该从1至10,到i从1到4时,屏幕输出1 2 3 4,但是当i 等于 5时,遇到了
break
终止了后期的所有循环所以上述程序输出1 2 3 4
continue: continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
代码演示( 有坑 )
#include
int main()
{
int i = 1;
while(i <= 10)
{
if(i == 5)
{
continue;
}
printf("%d ",i);
i++;
}
printf("\n");
return 0;
}
大家可以思考以下上述代码会输出什么?
友情提示:答案:1 2 3 4 6 7 8 9 10是 错误 的哟!
程序分析:i从1~4,正常输出1 2 3 4,当i等于5时,遇到了continue语句,跳过本次循环,continue下面的语句不被执行,直接跳进循环条件判断部分,但是很bug的是,在此过程中,循环变量的调整部分被破坏(i++循环的三大必要条件),i永远小于等于10,程序陷入死循环!
程序结果:1 2 3 4程序死循环不输出
解决方法:
程序问题:循环变量的控制条件被破坏,所以咱们要恢复这个条件
在
if(i == 5)
中放入i++
即可
#include
int main()
{
int i = 1;
while(i <= 10)
{
if(i == 5)
{
++i;
continue;
}
printf("%d ",i);
i++;
}
printf("\n");
return 0;
}
有些同学可能会有疑惑,为什么有了while循环已经可以实现循环了,还要出现for循环
这个道理很简单,我们实现一个需求肯定会有不同的方法,方法之间的便利性和效率是不一样的
同样的,即使实现循环的方法有很多种,但是肯定也是存在谁好谁坏,谁更便利的
我们再来回顾一遍while循环,仔细分析一下:
我们发现:在使用while实现循环时循环的三大必要条件过于分散,有时候会导致我们写代码时某一条件没控制好,导致程序
的错误,而我们要介绍的
for
循环(也是大家最爱用的循环),可以很好地避免这个问题
for(表达式1; 表达式2; 表达式3)
循环语句;
表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
输出1~10
#include
int main()
{
int arr[10] = {0};
int i;
for(i = 0; i < 10; i++)
{
arr[i] = i + 1;
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
语法上:循环的三大必要条件被放在了一起,这样很便于我们控制循环
for循环的执行顺序:
进入for循环
- 执行
exp1
–循环变量初始化– 执行一次- 执行
exp2
–循环条件判断- 执行循环体
- 执行
exp3
–循环调整部分之后就是 2 3 4循环执行,知道for循环退出
意义上基本和while中的无差别
break:终止循环
continue:跳过本次循环
注意:for循环的continue是跳入到调整部分,而while循环的continue是跳进判断部分,这也使for循环在使用continue时,不容易进坑
例如上述我们在while中出现的bug代码,1 2 3 4死循环,我们使用for循环就非常的安全,因为调整部分没有收到破坏
#include
int main()
{
int i;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
continue;
}
printf("%d ", i);
}
printf("\n");
return 0;
}
优势:
- 可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较 远,这样查找修改就不够集中和方便。所以for循环的风格更胜一筹;for循环使用的频率也最高。
- for循环在使用continue的时候更容易控制
for循环的写法建议:
- 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
- 建议for语句的循环控制变量的取值采用**“前闭后开区间”(左闭右开)**写法。
写for循环时,
exp1
,exp2
,exp3
都是可以省略的
- 省略
exp1
–省略初始化,咱们就必须在for循环外面就把循环变量初始化好- 省略
exp2
–省略循环条件判断,循环条件默认为真,循环陷入死循环- 省略
exp3
–省略调整部分,所以咱们要在循环体内加一个调整部分
建议同学们不要使用省略写法,很容易拿捏不住
#include
int main()
{
int i = 0;
int j = 0;
for (; i<3; i++)
{
for (; j<3; j++)
{
printf("hello\n");
}
}
return 0;
}
问:上述代码会打印多少个
hello
,答案是3个–因为i=0的第一层循环,输出3个hello,同时使得j=3,后面的两层循环都没有输出内容,因为j已经是3,没有进入内层循环
int main()
{
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("hello\n");
}
return 0;
}
do
{
循环语句;
}
while(表达式);//这里是有分号的,大家不要写漏了
几乎和while循环达到一样的效果,唯一不同的时候,do-while的循环语句至少被执行一次,即使循环判断条件一开始为假
几乎和while的break和continue没有差异
#include
int main()
{
int i = 1;
do
{
if(5 == i)
break;
printf("%d ", i);
i=i+1;
}while(i<=10);
return 0;
}
#include
int main()
{
int i = 1;
do
{
if(5 == i)
continue;
printf("%d ", i);
i=i+1;
}while(i<=10);
return 0;
}
大部分不同学都没有听过goto语句,因为它很容易出错,而且使用场景很少,很多教材上几乎都没有它的身影
但是goto语句其实是可以实现循环的,顾名思义–goto取到一个地方,可以在程序的代码中穿梭,所以很不安全,也让程序变得很凌乱
#include
int main()
{
flag:
printf("hello world\n");
goto flag;
return 0;
}
上述代码即可无限制地输出hello world
如果一个循环有很多层,比如有四层,而你现在在最内层的时候发现了一个异常,需要跳转到整个循环的外面去对异常进行处理,原先你可能会使用四次break,但是这样代码很挫,这个时候我们可以使用goto,跳出这个深层循环
for(...)
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 处理错误情况
- 计算 n的阶乘。
- 计算 1!+2!+3!+……+10!
- 在一个有序数组中查找具体的某个数字n。
- 编写代码,演示多个字符从两端移动,向中间汇聚。
- 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则 提示登录成,如果三次均输入错误,则退出程序。
答案在下方,大家可以参考
思路:使用循环遍历1~n的数字,将这些数字都相乘起来放在一个变量里面即可。
#include
int main()
{
int ret = 1;
int n = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
ret *= i;
}
printf("%d! = %d\n", n, ret);
return 0;
}
思路:使用循环遍历1~10的数字,一边在做累乘计算出n!的同时,一遍将其加进一个变量里面,同步进行。
#include
int main()
{
int n = 0;
printf("请输入n!的n值\n");
scanf("%d",&n);
int ret = 1;//计算n!
int sum = 0;//求和
for(int i = 1;i<=n;++i)
{
ret *= i;
sum += ret;
}
printf("sum = %d\n",sum);
return 0;
}
思路:你女朋友让你猜1~100她在想哪个数字,有好几次机会,如果想要快速猜出来你可以先猜50,如果大了再猜75
每次从中间猜,即猜一次即可排除一半的数字,这种方法:二分查找法
当然了理想很丰满,现实很骨感,你女朋友可能在你第一次没猜中的时候,就会说你根本就不懂人家
二分查找法的实现:
#include
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10,22,33,44,55};
int k = 0;
int left = 0;
int right = sizeof(arr)/sizeof(arr[0])-1;
printf("请输入需要查找的数\n");
scanf("%d",&k);
//一次二分查找
while(left <= right)//等于也要写在里面
{
int mid = (left + right)/2;
if(arr[mid] > k)
{
right = mid-1;
}
else if(arr[mid] < k)
{
left = mid + 1;
}
else
{
printf("找到了,下标是%d\n",mid);
break;
}
}
if(left > right)
{
printf("没找到\n");
}
return 0;
}
效果如下:
思路:使用两个相等的字符串,一个字符串
str1
里面是全是#,一个字符串str2
放着welcome to CSDN!!!!
,每过一秒就打印str1
,然后将str1
的左右两边的字符被str2
的对应字符所替换,之后就是替换,打印,等待…………
linux
下的版本
#include
#include
#include
int main()
{
char str1[] = "Welcome to CSDN!!!!";
char str2[] = "###################";
int left = 0;
int right = strlen(str1)-1;//长度是3的字符串,\0的下标也是3
while(left <= right)
{
//1.替换字符
str2[left] = str1[left];
str2[right] = str1[right];
++left;
--right;
//2.打印str2
printf("%s\n",str2);
//3.等1秒,展示移动的效果
sleep(1);
//4.清空屏幕,显示移动效果
system("clear");
}
printf("%s\n",str1);
return 0;
}
windows
下的版本
#include
#include
#include
int main()
{
char str1[] = "Welcome to CSDN!!!!";
char str2[] = "###################";
int left = 0;
int right = strlen(str1)-1;//长度是3的字符串,\0的下标也是3
while(left <= right)
{
//1.替换字符
str2[left] = str1[left];
str2[right] = str1[right];
++left;
--right;
//2.打印str2
printf("%s\n",str2);
//3.等1秒,展示移动的效果
sleep(1000);
//4.清空屏幕,显示移动效果
system("clear");
}
printf("%s\n",str1);
return 0;
}
场景如下,首先你要设置你的密码,然后你要开始输入密码进行登录,有三次登录机会
#include
#include
int main()
{
char passwd[30] = "";
char user[30] = "";
int i = 3;
printf("请设置你的密码\n");
fgets(passwd,30,stdin);
while(i)
{
printf("请登录,输入你的用户密码\n");
fgets(user,30,stdin);
if(strcmp(user,passwd) == 0)
{
printf("密码正确,登陆成功\n");
break;
}
else
{
--i;
if(i != 0)
printf("密码错误,你还有%d次机会",i);
}
}
if(i == 0)
{
printf("错误三次,请等待下辈子再试密码\n");
}
return 0;
}
本篇文章就讲到这,咱们下期间