看完上一篇文章,我们对C语言要学习的一个整体知识框架有了一个了解,接下去,我们将进入分支和循环语句的学习,Are you ready?
①表达式语句
②函数调用语句
③控制语句
④复合语句
⑤空语句
第一类:分支语句【if语句、switch语句】
第二类:循环语句【do while语句、while语句、for语句】
第三类:转向语句【break语句、goto语句、continue语句、return语句】
说了这么多,接下来让我们先进入分支语句的学习
有关if语句的使用我们在初始C语言的时候已经讲过,这里不做过多解释,先来看一下这段代码
int main(void)
{
int age = 0;
scanf("%d", &age);
if (age < 18)
printf("未成年\n");
else
printf("成年\n");
return 0;
}
int main(void)
{
int age = 0;
scanf("%d", &age);
if (age < 18) {
printf("未成年\n");
printf("不可酗酒\n");
}
else {
printf("成年\n");
printf("适度饮酒\n");
}
return 0;
}
然后我们再来讲一下多分支结构
int main(void)
{
int age = 0;
scanf("%d", &age);
if (age > 0 && age < 18) {
printf("少年\n");
}
else if (age >= 18 && age < 30) {
printf("青年\n");
}
else if (age >= 30 && age < 45) {
printf("壮年\n");
}
else if (age >= 45 && age < 55) {
printf("中年\n");
}
else if (age >= 55 && age < 75) {
printf("老年\n");
}
else {
printf("老寿星\n");
}
return 0;
}
…
0表示假,非0表示真
但是你真的认为if…else就那么容易?我们来看一个东西,叫做【悬空else】,这是一个大家在书写代码是经常会疏漏的地方⭐️
int main(void)
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
int main(void)
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
有关if语句的书写也是有讲究的,我们一起来看一下
//代码1
if (condition) {
return x;
}
return y;
//代码2
if(condition)
{
return x;
}
else
{
return y;
}
接下去我们再来看另外两段代码,你认为那段代码比较好一些呢
//代码3
int num = 1;
if(num == 5)
{
printf("hehe\n");
}
//代码4
int num = 1;
if(5 == num)
{
printf("hehe\n");
}
学完了if语句,接下去让我们来做两道练习题巩固一些所学的知识吧
1、判断一个数是否为奇数
int main(void)
{
int i = 1;
while (i <= 100) {
if (i % 2 == 1)
printf("奇数\n");
else
printf("偶数\n");
}
return 0;
}
2. 输出1-100之间的奇数
//way1
int i = 1;
while (i <= 100) {
if (i % 2 == 1)
printf("%d\n", i);
i++;
}
//way2
int main(void)
{
int i = 1;
while (i <= 100) {
printf("%d\n", i);
i+=2;
}
return 0;
}
讲完了一种分支语句,接下来让我们继续学习下一种分支语句,也就是switch语句
int main()
{
int day = 0;
scanf("%d", day);
if(day == 1)
printf("星期一\n");
else if(day == 2)
printf("星期二\n");
else if (day == 3)
printf("星期三\n");
else if (day == 4)
printf("星期四\n");
else if (day == 5)
printf("星期五\n");
else if (day == 6)
printf("星期六\n");
else
printf("星期天\n");
return 0;
}
switch(整型表达式)
{
语句项;
}
//是一些case语句:
//如下:
case 整形常量表达式:
语句;
好,了解了这些后呢,我们使用【switch语句】来重写一下前面的那个星期判断
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
case 2:
printf("星期二\n");
case 3:
printf("星期三\n");
case 4:
printf("星期四\n");
case 5:
printf("星期五\n");
case 6:
printf("星期六\n");
case 7:
printf("星期天\n");
}
return 0;
}
我们加上这个break后试试
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
default:
printf("无此星期");
break;
1、输入1-5,输出的是“weekday”;
2、输入6-7,输出“weekend”
int main(void)
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("workday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
default:
printf("invalid\n");
break;
}
return 0;
}
注意事项:break千万别忘了,很重要,不然会穿透的
以下是一道面试题,我们一起来看看
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{//switch允许嵌套使用
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);
return 0;
}
好,讲完了这个分支语句后呢,我们来说一说C语言中的循环语句
if(1)
printf("hehe\n");
while (1)
printf("hehe\n");
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
对于break和continue,我们之前在分支判断中也有提到过,那在循环中是怎样的呢,我们来看一下
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d ", i);
i++;
}
int i = 1;
while (i <= 10)
{
if (i == 5)
continue; //强制进行下一次循环
printf("%d ", i);
i++; //当i为5的时候永远执行不到这一句
}
int i = 0;
while (i < 10)
{
i++;
if (i == 5)
continue; //强制进行下一次循环
printf("%d ", i);
}
continue - >>某种条件成立时跳过后面的代码
break - >>某种条件成立时整个循环不执行
讲到while循环,我们来说说【getchar()】这个库函数的使用
int ch = getchar();
putchar(ch);
这个时候有同学问了,这个getchar()和while循环有什么关系呢?
int ch = 0;
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
那这个时候又有同学说,这个getchar()很厉害呀,竟然可以读一串数据
int main(void)
{
char password[20] = { 0 };
printf("请输入密码:");
scanf("%s", password);
printf("请确认密码(Y/N):");
int ch = getchar();
if (ch == 'Y') {
printf("确认成功");
}
else {
printf("确认失败");
}
return 0;
}
你明白了吗?
看完了while循环,接下去我们来看看for循环,对于for循环大家一定不陌生,它是使用最多的循环语句
for(表达式1; 表达式2; 表达式3)
循环语句;
int main(void)
{
for (int i = 1; i <= 10; ++i)
{
printf("%d ", i);
}
return 0;
}
在while循环中,我们有详细讲到过break和continue,但是在for循环中是如何使用的呢?我们一起来看看
int main(void)
{
for (int i = 1; i <= 10; ++i)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
int main(void)
{
for (int i = 1; i <= 10; ++i)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
接下去给大家讲讲在for循环使用时的一些注意事项和一些技巧
int main(void)
{
for (int i = 1; i <= 10; ++i)
{
printf("%d ", i);
i = 5; //循环体内不要随意改变循环变量
}
return 0;
}
讲完了while、for,接下去让我们来看看do…while循环,这也是循环语句的一种,只是在各个应用场景中没有while和for来得广泛
do
循环语句;
while(表达式);
我们先来一个具体的小案例
//使用do while循环打印1~10
int main(void)
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
对于break和continue这两个关键字,也是从本文的开始就一直陪伴我们,让我们到 do…while中来看看它们要如何使用
break
int i = 1;
do
{
if (5 == i)
break;
printf("%d ", i);
i++;
} while (i <= 10);
continue
int i = 1;
do
{
if (5 == i)
//break;
continue; //死循环
printf("%d ", i);
i++;
} while (i <= 10);
首先第一题比较简单,计算一个n的阶乘,那只要定义一个变量去存放这个阶乘的结果,然后通过循环去遍历即可
int main(void)
{
//n的阶乘
int n = 0;
scanf("%d", &n);
int ret = 1;
for (int i = 1; i <= n; ++i)
{
ret *= i;
}
printf("ret = %d\n", ret);
return 0;
}
第二小题又是一道计算阶乘的题,不过这题计算的阶乘不是单个的,而是计算一个累加阶乘的和,我们一起来看看
假设我们是要计算1! + 2! + 3!,数字小一些。首先来分析一下思路,因为要计算的数字只到3,所以我们需要一个外层循环从1遍历到3,表示求解的是这3个数的阶乘
然后内层循环就是每一个数的阶乘求解,从1遍历到这个数即可,然后使用一个累乘变量存放起来。在计算完每一个数字的阶乘后,我们就需要去累加这些阶乘的和,所以还需要定义一个sum变量去存放这个和,最后sum变量就是我们所要求的结果
正确答案应该是1 + 2 + 6 = 9,我们通过VS来跑一下看看
int ret = 1;
int sum = 0;
for (int i = 1; i <= 3; ++i)
{
for (int j = 1; j <= i; ++j)
{
ret *= j;
}
sum += ret;
}
printf("sum = %d\n", sum);
int ret = 1;
int sum = 0;
for (int i = 1; i <= 3; ++i)
{
ret *= i;
sum += ret;
//i ret sum
//1 1 1
//2 2 3
//3 6 9
}
然后就是这道在个有序数组中查找具体的某个数字n
int main(void)
{
//在一个有序数组中查找具体的某个数组n
//1 2 3 4 5 6 7 8 9 10
//二分法
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(a) / sizeof(a[0]);
int key = 7;
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = (left + right) / 2; //中间元素下标一定在循环内部,不断变化
if (key < a[mid])
right = mid - 1;
else if (key > a[mid])
left = mid + 1;
else
{
printf("找到了,下标是%d\n", mid);
break; //找到了便跳出循环
}
}
if (left > right)
printf("没找到此元素\n");
return 0;
}
然后我们来玩一个很有趣的东西,将多个字符从两端移动,向中间汇聚
int main(void)
{
char arr1[] = { "welcome to bit!!!" };
char arr2[] = { "*****************" };
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(500);
left++;
right--;
}
return 0;
}
QQ录屏20221024174502
为了让其在一行打印,不需要一行行地打印,我们可以使用这样一个命令
system("cls"); //清屏,一行打印
两端移动
这道题的话就是我们输入一串字符,然后通过与正确密码进行一个比较,看看是否相同,若是相同,则直接break跳出循环,若是不同则继续输入,但是机会只有3次,用完之后便跳出循环不允许再输入了
int main(void)
{
int i = 0;
char password[20] = { 0 };
for (i = 0; i < 3; ++i)
{
printf("请输入密码>:");
scanf("%s", password);
if (strcmp(password, "bitbit") == 0)
{
printf("密码输入正确\n");
break;
}
else
{
printf("密码输入错误\n");
}
}
if (i == 3)
{
printf("输入机会用完,请30分钟后再试\n");
}
return 0;
}
好,接下来我们来玩一个C语言中很经典的游戏,叫做猜数字
void menu()
{
printf("********************************\n");
printf("********** 1.play ************\n");
printf("********** 0.exit ************\n");
}
int main(void)
{
int input = 0;
do
{
menu();
printf("请输入你的选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("猜数字\n");
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,重新输入\n");
break;
}
} while (input);
return 0;
}
首先我们来讲讲这个随机数是如何生成的
//1.生成随机数
int ret = rand() % 100 + 1; //1 ~ 100
srand((unsigned int)time(NULL));
int num = 0;
while (1)
{
printf("请猜:>");
scanf("%d", &num);
if (num < ret) {
printf("小了\n");
}
else if (num > ret) {
printf("大了\n");
}
else {
printf("猜对了\n");
break;
}
}
接下去我们来说说goto语句,对于goto语句,开头有提到过,是属于转向语句的一种,其余的还有break、continue和return语句上面在讲分支和循环语句的时候都已经有涉及到了
flag: //这里是冒号!!!
printf("hehe\n");
goto flag;
printf("hehe\n");
goto flag;
printf("haha\n"); //不会被打印
flag: //跳到这里
printf("heihei\n");
虽然goto语句不为广为使用,但是上面说过了,在某些场合下还是可以派的上用场的,下面我们来说一个使用goto语句的经典案例
char input[20] = { 0 };
system("shutdown -s -t 60");
again:
printf("请注意,你的电脑在1分钟内关机,如果输入:我是猪,就取消关机\n");
scanf("%s", input);
if (0 == strcmp(input, "我是猪"))
{
system("shutdown -a");
printf("取消关机\n");
}
else
{
goto again;
}
char input[20] = { 0 };
system("shutdown -s -t 60");
while (1)
{
printf("请注意,你的电脑在1分钟内关机,如果输入:我是猪,就取消关机\n");
scanf("%s", input);
if (0 == strcmp(input, "我是猪"))
{
system("shutdown -a");
printf("取消关机\n");
break;
}
}
以上就是本文所要讲的所有内容,感谢您的观看,如有疑问请于评论区留言或私信我