3.循环语句
while
for
do while
3.1 while循环
前面已经掌握了 if 语句:
if(条件)
语句;
当条件满足的情况下,if语句后的语句执行,否则不执行;但是这个语句只会执行一次。
由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。那我们怎么做呢?
C语言中给我们引入了: while 语句,可以实现循环。
while 语法结构
while (表达式)
循环语句;
例:
#include <stdio.h>
int main()
{
while (1)
{
printf("小琪\n");//会无限打印 小琪
}
return 0;
}
while 语句执行流程:
比如我们实现:“在屏幕上打印1-10的数字”
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i = i+1;
}
return 0;
}
上面的代码已经帮我了解了 while 语句的基本语法
3.1.1 while语句中的break和continue
break介绍
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
break;
printf("%d ", i);
i++;
}
return 0;
}
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
i++;
if (5 == i)
break;
printf("%d ", i);
}
return 0;
}
总结:
break在while循环中的作用:
在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
while中的break是用于永久终止循环的。
continue介绍
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
continue;
printf("%d ", i);//打印 1 2 3 4 死循环
i++;
}
return 0;
}
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
i++;
if (5 == i)
continue;
printf("%d ", i);
}
return 0;
}
总结:
continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。
3.1.2 练习
例:
#include <stdio.h>
int main()
{
int ch = getchar();
printf("%c\n", ch);
putchar(ch);
return 0;
}
输入q 回车
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)//end of file
{
putchar(ch);//CTRL+Z+回车-->终止
}
return 0;
}
例:假设密码是一个字符串
#include <stdio.h>
int main()
{
char password[20] = { 0 };
printf("请输入密码:>");//假设密码是123456
scanf("%s", password);
printf("前请确认密码(Y/N):>");//无论密码输入什么都会直接打印No,因为密码后面有个\n,被ret读取了
int ret = getchar();
if ('Y' == ret)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
验证有个\n
#include <stdio.h>
int main()
{
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);
printf("前请确认密码(Y/N):>");
int ret = getchar();
if ('\n' == ret)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
解决办法:
#include <stdio.h>
int main()
{
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);
getchar();//读取了\n
printf("前请确认密码(y/n):>");
int ret = getchar();
if ('y' == ret)
{
printf("yes\n");
}
else
{
printf("no\n");
}
return 0;
}
上个代码虽然正常了,但是密码中有空格,又会直接打印no
假设密码为123456 789
打印结果:
解决办法:
#include <stdio.h>
int main()
{
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);
int ch = 0;
while ((ch = getchar()) != '\n')
{
;
}
printf("前请确认密码(Y/N):>");
int ret = getchar();
if ('Y' == ret)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
例:只打印数字字符,跳过其他字符
#include <stdio.h>
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch>'9')
continue;
putchar(ch);//只打印数字字符
}
return 0;
}
3.2 for循环
3.2.1 语法
for(表达式1; 表达式2; 表达式3)
循环语句;
表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
例:
使用 for循环 在屏幕上打印1-10的数字
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10 ; i++)
{
printf("%d ", i);
}
return 0;
}
对比for循环和while循环:
int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
printf("hehe\n");
i = i+1;//调整部分
}
//实现相同的功能,使用for
for(i=1; i<=10; i++)
{
printf("hehe\n");
}
注:
可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较
远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。
3.2.2 for循环中的break和continue
break
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
i = 12;
}
return 0;
}
continue
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
i = 12;
}
return 0;
}
3.2.3 for语句的循环控制变量
建议:
- 不可在for 循环体内修改循环变量,防止 for 循环失去控制
- 建议for语句的循环控制变量的取值采用“前闭后开区间”写法
代码1
//两边都是闭区间
for(i=0; i<=9; i++)
{}
代码2
//前闭后开的写法
for(i=0; i<10; i++)
{}
注:
1.两个代码同样是循环10次,但是代码2更加直观
2.但是只是建议写成左闭右开,具体要视情况而定
比如:打印200~300之间的数字
#include <stdio.h>
int main()
{
int i = 0;
for (i = 200; i <= 300; i++)
{
printf("%d ", i);
}
return 0;
}
3.2.4 一些for循环的变种
代码1
int main()
{
int i = 0;
//for循环的判断部分省略意味着判断会恒成立
for (;;)
{
printf("灰灰\n");
}
return 0;
}
for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题
代码2
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
for (a = 0; a < 3; a++)
{
for (b = 0; b < 3; b++)
{
printf("灰灰\n");
}
}
}
代码3:如果省略掉初始化部分,这里打印多少个灰灰?
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
for (; a < 3; a++)
{
for (; b < 3; b++)
{
printf("灰灰\n");
}
}
}
解析:j所在的for循环中,j没有初始化。当i=0时,j所在的for循环 循环了3次,打印了3次“灰灰”,最终j=3。当i=2和3时,j仍然等于 3,无法进入循环
代码4:使用多余一个变量控制循环
#include <stdio.h>
int main()
{
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
{
printf("灰灰\n");
}
return 0;
}
代码5
#include <stdio.h>
int main()
{
for (int a = 1; a < 5; a++)//C99语法才支持这种写法;C++中支持这种写法
{
printf("灰灰\n");
}
return 0;
}
3.2.5 一道笔试题
例:请问循环要循环多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i =0,k=0; k=0; i++,k++)
k++;
return 0;
}
答案:0次
3.3 do…while()循环
3.3.1 do语句的语法:
do
循环语句;
while(表达式);
3.3.2 do语句的特点
循环至少执行一次,使用的场景有限,所以不是经常使用
#include <stdio.h>
int main()
{
int a = 1;
do
{
printf("%d ", a);
a++;
}
while (a <= 10);
return 0;
}
注:若不加“a++”会无限循环
3.3.3 do while循环中的break和continue
break
#include <stdio.h>
int main()
{
int a = 1;
do
{
a++;
if (a == 5)
break;
printf("%d ", a);
}
while (a <= 10);
return 0;
}
#include <stdio.h>>
int main()
{
int a = 1;
do
{
if (a == 5)
break;
printf("%d ", a);
a++;
}
while (a <= 10);
return 0;
}
continue
#include <stdio.h>
int main()
{
int a = 1;
do
{
if (a == 5)
continue;
printf("%d ", a);//1234 死循环
a++;
}
while (a <= 10);
return 0;
}
#include <stdio.h>
int main()
{
int a = 1;
do
{
a++;
if (a == 5)
continue;
printf("%d ", a);
}
while (a <= 10);
return 0;
}
3.4 练习
1. 计算 n的阶乘
#include <stdio.h>
int main()
{
int n = 0;
int a = 1;
int sum = 1;
scanf("%d", &n);
for (a = 1; a <= n; a++)
{
sum = sum * a;
}
printf("%d\n", sum);
return 0;
}
2.计算 1!+2!+3!+……+10!
方法一
#include <stdio.h>
int main()
{
int a = 0;
int n = 0;
int sum = 1;
int add = 0;
for (n = 1; n <= 10; n++)
{
sum = 1;
for (a = 1; a <= n; a++)
{
sum = sum * a;
}
add = add + sum;
}
printf("%d\n", add);
return 0;
}
方法二
#include <stdio.h>
int main()
{
int add = 0;
int sum = 1;
int a = 0;
int n = 0;
for (a = 1; a <= 10; a++)
{
sum = sum * a;
add = add + sum;
}
printf("%d\n", add);
return 0;
}
3. 在一个有序数组中查找具体的某个数字n
二分查找法
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k =0;
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
scanf("%d", &k);
for (i = 0; i < sz; i++)
{
if (arr[i] ==k)
{
printf("找到了,下标是:%d\n", i);
break;
}
}
if (i == sz)
{
printf("没找到\n");
}
return 0;
}
折半查找法
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 };
int k = 0;
scanf("%d", &k);
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
while (left <= right)
{
//int Mid = (left + right) / 2;
int Mid = left + (right - left) / 2;
if (arr[Mid] < k)
{
left = Mid + 1;
}
else if (arr[Mid] > k)
{
right = Mid - 1;
}
else
{
printf("找到了,下标是;%d\n", Mid);
break;
}
}
if (left > right)
{
printf("没找到\n");
}
return 0;
}
4. 编写代码,演示多个字符从两端移动,向中间汇聚
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
char arr1[] = "Welcome to Beijing!";
char arr2[] = "###################";
int left = 0;
int right = strlen(arr2) - 1;
//int right = sizeof(arr1) / sizeof(arr1[0]) - 2;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);//Sleep是库函数,头文件是<windows.h>
//清空屏幕
system("cls");//system是一个库函数,可以执行系统命令;头文件是<stdlib.h>
left++;
right--;
}
printf("%s\n", arr2);
return 0;
}
5. 编写代码实现,模拟用户登录情景,并且只能登录三次(只允许输入三次密码,如果密码正确,则提示登录成功;如果三次均输入错误,则退出程序)
#include <stdio.h>
#include <string.h>
int main()
{
int i = 0;
char password[20] = { 0 };
for (i = 0; i < 3; i++)
{
printf("请输入密码:>");
scanf("%s", password);
//假设密码为1213456
//if(password=="123456")
//比较2个字符串是否相等,不能使用==,而应该使用一个库函数:strcmp
//如果返回值是0,表示2个字符串相等
if (strcmp(password, "123456") == 0)
{
printf("登陆成功\n");
}
else
{
printf("密码错误\n");
}
}
if (i == 3)
{
printf("三次密码均输入错误,推出程序\n");
}
return 0;
}
6.猜数字游戏实现(电脑产生一个1~100的随机数)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void menu()
{
printf("play(1) exit(2)\n");
}
//0~RAND_MAX(32767)
void game()
{
int guess = 0;
int ret = rand()%100+1;//rand生成随机数的函数,产生一个1~100的随机数
//printf("%d\n", ret);
while (1)
{
printf("请猜数字\n");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if(guess > ret)
{
printf("猜大了\n");
}
else
{
printf("猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
//printf("猜数字\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}