本章我们来迅速学习一下选择语句和循环语句🐸。
首先我们来了解何为语句
C语言中语句可以分为以下五类
1.表达式语句
2.函数调用语句
3.控制语句
4.复合语句
5.空语句
这篇文章我们主要讲的是控制语句。
控制语句
控制语句主要用于控制程序的运行流程,以实现各种结构方式(C语言支持三种结构:顺序结构,选择结构,循环结构),他们由特定的语句定义符组成,C语言有九种控制语句,可分为三类
1,条件判断语句也叫分支语句:if语句,switch语句;条件运算符。
2,循环执行语句:do while语句,while语句,for语句;
3,转向语句:break语句,goto语句,continue语句,return语句。
分支语句(条件判断语句)
if 语句
语法结构有三种。如图
if语句解析起来十分简单,首先,判断if后的表达式是否为真。如果为真进入if后的语句,如果判断为假,则继续判断else if 后的表达式,如果判断为假,则执行else后的语句。
我们来通过练习来更好地理解,现在就用 if else语句判断输入一个数是否为奇数
只需要判断这个数除以2余数是1还是0
📘代码如下逻辑十分清晰
int main() { int num = 0; printf("请输入需要判断的数字:"); scanf("%d", &num); if (num % 2 == 1) { printf("%d是奇数",num); } else { printf("%d不是奇数", num); } return 0; }
我们来判断一个复杂一点的问题。
例如我们现在要写一段代码,输入一个年龄,判断他是那个阶段的人
📘代码如下
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { int age = 0; printf("请输入相应年纪:"); scanf("%d", &age); if (age < 18) { printf("少年\n"); } else if (age >= 18 && age < 30) { printf("青年\n"); } else if (age >= 30 && age < 50) { printf("中年\n"); } else if (age >= 50 && age < 80) { printf("老年\n"); } else { printf("老寿星\n"); } return 0; }
接下来我们来看switch语句
switch语句也是一种常用的分支语句,常常用于多分支的情况下
我们首先要熟悉switch的语法形式
switch(整型表达式)
{
case:整型常量表达式(注意是常量)
语句;
}
case后有一个冒号(:)一定不要忘记了。
switch语句和if else语句都是选择结构语句,switch语句和if else语句的区别呢。我们来编写一个 输入相应数字判断其对应星期几 的代码来探查。
📘如果我们用if else 语句来写。
int main() { int num = 0; printf("请输入需要判断的数字:"); scanf("%d", &num); if (num == 1) { printf("星期一"); } if (num == 2) { printf("星期二"); } if (num == 3) { printf("星期三"); } if (num == 4) { printf("星期四"); }if (num == 5) { printf("星期五"); } if (num == 6) { printf("星期六"); }if (num == 7) { printf("星期日"); } return 0; }
我们会发现这次的写的非常繁琐,如果我们就用switch语句来实现它呢。
📘 代码如下:
#include <stdio.h> int main() { int num = 0; printf("请输入相应数字:"); scanf("%d", &num); switch (num) { 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; default: printf("输入错误,请重新输入\n"); break; } return 0; }
我们可以发现在进行很多相同类型的判断时,switch语句用起来更加简洁。
在switch语句中只有搭配了break才能实现真正的分支,如果没有break,判断完后判断还会继续进行,我们需要输入一个数判断到后就立马跳出。就比如如果我们想要输入1~5的话输出weekday,而输入6~7则输出weekend,这时我们如何实现呢。
📘看代码。
#include <stdio.h> int main() { int num = 0; printf("请输入相应数字:"); scanf("%d", &num); switch (num) { case 1: case 2: case 3: case 4: case 5: printf("weekday\n"); break; case 6: case 7: printf("weekend\n"); break; default: printf("输入错误,请重新输入\n"); break; } return 0; }
我们可以看出来,break的效果是把语句列表划分为不同的分支部分。
但是如果我们需要输入的是1~7,然而别人输入了别的数值,没有任何与case中的数字对应,我们应该怎么做呢,这时就需要我们的default子句登场了,就像上边那样,如果输入的值是不符合我们的要求的,就可以输出提醒信息。
deflaut语句的作用是当switch表达式中的值不能匹配所有case标签的值时,就会执行default子句后的语句,所以每个switch语句中只能有一个default子句。
📘上代码深刻理解。
这里就出现了没加break的错误,我们加上break。
只要输入值不是1,就都打印heihei。
循环语句介绍
循环语句包括
while循环
for循环
do while循环
首先我们先讲一讲while循环
前边我们学习了选择语句,然而这个语句我们只能执行一次,然而生活中好多事我们都要重复很多次慢慢才能完成,这时候我们怎么办呢,这时C语言中引入的while语句就可以救场啦
while语法结构:
while(表达式)
循环语句;
我们了解了他的语法结构,while后的表达式判断是否为真,为真则进入循环语句,循环一次后继续判断,循环语句中可能存在改变while后表达式的条件,不然就会变成死循环。我们来尝试实现解决一个问题,可以帮助我们了解while循环的使用。
在屏幕上打印出1-10的数字
📘上代码
int main() { int i = 1; while (i <= 10) { printf("%d ", i); i++; } return 0; }
接下来介绍while语句中break和continue的作用
📘我们看代码
⭐可以看出来,循环中遇到break.会直接结束循环,所以在while循环中break是用来永久结束这个循环的
continue
📘我们看代码
从结果我们可以推导出,当while循环中遇到continue,则结束本次循环,直接回到while后括号中的表达式。即跳转到while的判断部分,然后循环继续。
for循环
我们已经有了while循环,为什么又来一个for循环呢,他们的区别在哪里?我们来看一看。
首先,for循环的语法结构:
for(表达式1;表达式2;表达式3)
循环语句;
表达式1,初始化部分,用于初始化循环产量的
表达式2为条件判断部分,用于判断循环什么时候停止。
表达式3,调整部分,用于循环条件的调整.
执行流程图如下
我们来用for循环打印1到10之间的数字,
#include <stdio.h> int main() { for (int i = 1; i <= 10; i++) { printf("%d ", i); } return 0; }
break的作用
我们可以发现,当语句来到break这里时直接跳出循环
continue的作用
🏅当循环到达continue这里时,直接跳过后边的语句,然后来到 i++的位置,进行接下来的循环
📌注意:在使用for循环时一定要注意判断条件有没有写对。
比如这道题
int main() { int i = 0; int k = 0; for (i = 0, k = 0; k = 0; i++, k++) { k++; printf("hehe\n"); } return 0; }
我们来看这段代码hehe会打印几次呢?
答案是0次,为什么呢?
这里我们可以看到for循环中判断语句为k=0,这个条件默认为假,此时,如果我们把k=0换成k=1
可以发现程序进入了死循环,这是因为k=1;为非零数,判断条件一直为真,所以陷入了死循环。
千万要仔细写判断条件,不要将判断是否相等写为赋值。
do while循环
语法结构
do
循环语句
while(表达式)
执行流程
do while语句的特点是至少执行一次,使用的场景有限所以使用的不多。
📘代码演示
这里我们可以发现首先进入 do 后的语句中,打印1后++然后判断继续循环。
goto语句(转移语句)
goto语句为条件转移语句,可以使程序立即跳转到函数内部的任意一条可执行语句。goto关键字后加一个标识符,标识符可以出现在任何执行语句的前边,并且以一个冒号(:)作为后缀。
goto语句后的标识符就是我们要跳转的目标,例如
goto Show; printf("heihei"); Show: printf("hehe");
这串代码goto后边的Show为标示符,代码执行到goto语句,直接跳转到Show后开始执行,所以第一个打印函数不会执行,只会打印一个hehe。
goto语句最常见的用法是终止程序在某些深度嵌套的结构中的处理过程,可以一次跳出两层或者多层循环,这时用break是办不到的,他只能退出到上层循环中去。
比如
for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(a[i]==b[j]) goto found; } } found: ......
这里假设是从两个数组里找相同值,找到一个就跳出循环,我们可以发现,这时利用goto语句,会直接跳出两层for循环。
大多数情况下,使用goto语句的程序段要更加难以维护和理解,少数情况除外,比如我们前边讲的例子。尽管问题并不太严重,但我们还是建议尽量少实用goto语句。
数组替换
我们利用上面所学的知识,来完成一个小任务,创建两个字符数组,将其中一个数组逐渐替换成另一个数组,我们可利用for循环和while循环分别实现这一功能。
📘 while循环。
int main() { char arr1[] = "hello word"; char arr2[] = "**********"; int left = 0; int right = strlen(arr1) - 1; printf("%s\n", arr2); while (left <= right) { Sleep(1000); arr2[left] = arr1[left]; arr2[right] = arr1[right]; left++; right--; printf("%s\n", arr2); } return 0; }
📘 for循环。
int main() { char arr1[] = "hello word"; char arr2[] = "**********"; printf("%s\n", arr2); for (int left = 0, right = strlen(arr1) - 1; left <= right; left++, right--) { Sleep(1000); arr2[left] = arr1[left]; arr2[right] = arr1[right]; printf("%s\n", arr2); } return 0; }
上面讲了各式各样的判断语句和循环语句,我们要将他们运用成熟,融会贯通。
接下来我们可以利用上面所学的内容实现折半查找法和猜数字小游戏
折半查找法
折半查找法是一种很不错的查找方法,相对于暴力查找,可以更快的完成查找任务。
就像给定数,然后给你一个范围,让你去猜,大多人应该都会从中间值开始猜起,接下来用循环语句和判断语句去实现这一过程。
int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//范围 int left = 0; int right = sizeof(arr) / sizeof(arr[0]) - 1; int key = 0;//要查找的数 int mid = 0; while (left <= right) { mid = (left + right) / 2; if (arr[mid] > key) { right = mid - 1; } else if (arr[mid] < key) { left = mid + 1; } else break; } if (left <= right)//范围一直缩减,直到找到为止 { printf("找到啦。下标为%d\n", mid); } else { printf("找不到\n"); } return 0; }
猜数字游戏
猜数字游戏也是在一定范围内猜测生成数字的大小,玩家输入猜测的数据,判断输入数据是大于还是小于或是等于随机生成的数字,反馈给玩家。
我们看,代码逻辑十分清晰
#include <stdio.h> #include <stdlib.h> #include <time.h> void menu() { printf("*****************************\n"); printf("******** 1,play *******\n"); printf("******** 0,exit *******\n"); printf("*****************************\n"); } void game() { int random_num = rand() % 100 + 1;//范围1~100 printf("%d", random_num); int input = 0; while (1) { printf("请输入要你猜测的数值\n"); scanf("%d", &input); if (input > random_num) { printf("猜大了\n"); } if (input < random_num) { printf("猜小了\n"); } if(input==random_num) { printf("恭喜您,猜对啦\n"); break; } } } int main() { int input = 0; srand((unsigned)time(NULL)); do { menu();//先打印菜单,让玩家选择 printf("请输入选择\n"); scanf("%d", &input); switch (input)//通过input的值进行判断 { case 1://注意是冒号哦 game(); break; case 0: break; } } while (input);//如果玩家选择为0,则直接退出循环。 return 0; }
运行后如图,为了测试方便,直接将随机值打印出来了。