一、前言
- 本人是一名小白,这一篇是记录我C语言学习中的分支语句和循环语句的所学所得,仅为简单的认识下C语言中的各个知识。
- 重点内容如下图
二、什么是语句?
- 表达式语句(2+3;)
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
- 本章后面介绍的是控制语句。
- 控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。—>C语言是一门结构化的程序设计语言。
- 可分成以下三类:
- 条件判断语句也叫分支语句:if语句、switch语句;
- 循环执行语句:do while语句、while语句、for语句;
- 转向语句:break语句、goto语句、continue语句、return语句。
三、分支语句(选择结构)
- 人生处处面临选择,不同的选择也让这个世界多元化,在程序的设计中也是如此。
1、if语句
1、那if语句的语法结构是怎么样的呢?
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
if(表达式)
语句;
if (表达式)
语句1;
else
语句2;
if (表达式1)
语句1;
else if (表达式2)
语句2;
else
语句3;;
return 0;
}
2、应用举例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 16)
printf("少年\n");
else if (age >= 16 && age < 30)
printf("青年\n");
else if (age >= 30 && age < 40)
printf("中年\n");
else if (age >= 40 && age < 56)
printf("壮年\n");
else if (age >= 56 && age < 80)
printf("老年\n");
else
printf("老寿星\n");
return 0;
}
运行结果
3、那如果条件成立,要执行多条语句,该应该使用代码块呢?
#include <stdio.h>
int main()
{
if(表达式)
{
语句列表1;
}
else
{
语句列表2;
}
return 0;
}
举例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int age = 20;
if (age >= 18)
{
printf("成年\n");
printf("担当责任\n");
}
return 0;
}
运行结果
4、悬浮else
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
运行结果 我们会发现什么都没有。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
return 0;
}
运行结果
- 为什么会出现这种情况呢?
else的匹配:else是和它离的最近的if匹配的。 - 注意
if+else是一条语句。
5、if书写形式的对比
#define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
int main()
{
int condition = 0;
int x, y;
if (condition) {
return x;
}
return y;
if (condition)
{
return x;
}
else
{
return y;
}
int num = 1;
if (num == 5)
{
printf("hehe\n");
}
int num = 1;
if (5 == num)
{
printf("hehe\n");
}
return 0;
}
- 代码2和代码4更好,逻辑更加清晰,不容易出错。
- 小练习
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 100)
{
if (i%2 == 1)
printf("%d ", i);
i++;
}
return 0;
}
运行结果
2、switch语句
1、介绍
- switch语句也是一种分支语句,常常用于多分支的情况。
2、举例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
int n = 2;
switch (day)
{
default:
printf("选择错误\n");
break;
case 1:
printf("星期1\n");
break;
case 2:
printf("星期2\n");
break;
case 3:
printf("星期3\n");
break;
case 4:
printf("星期4\n");
break;
case 5:
printf("星期5\n");
break;
case 6:
printf("星期6\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
运行结果
3、注意
switch(整型表达式)
{
语句项;
}
case 整形常量表达式:
语句;
4、在switch语句中的 break
- break要根据具体情况使用,并不是每个case后都要加kreak
- 当输出相同时
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
int n = 2;
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("选择错误\n");
break;
}
return 0;
}
四、循环语句
- while
- for
- do while
- 使用频率 for>while>do while
1、while循环
1、简介
if(条件)
语句;
当条件满足的情况下,if语句后的语句执行,否则不执行。 但是这个语句只会执行一次。
- 由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。
那我们怎么做呢? C语言中给我们引入了: while 语句,可以实现循环。
while(表达式)
循环语句;
- while语句的执行流程
) 注意:!=0代表真。 - 应用举例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
运行结果
2、while语句中的break和continue
1、break
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 6)
{
break;
}
printf("%d ", i);
i++;
}
return 0;
}
运行结果
- 总结
break在while循环中的作用:其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以,while中的break是用于永久终止循环的。
2、continue
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
while (i < 10)
{
i++;
if (i == 6)
{
continue;
}
printf("%d ", i);
}
return 0;
}
运行结果
- 总结
continue在while循环中的作用就是:continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。
2、for循环
1、简介
int main()
{
int i = 1;
while (i < 10)
{
printf("%d ", i);
i++;
}
return 0;
}
这时我们会发现好繁琐,我们能不能简化下呢?
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
运行结果
for(表达式1; 表达式2; 表达式3) 循环语句;
表达式1 表达式1为初始化部分,用于初始化循环变量的。 表达式2 表达式2为条件判断部分,用于判断循环时候终止。 表达式3 表达式3为调整部分,用于循环条件的调整。
- for循环的执行流程图:
2、break和continue在for循环中
- 我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。
但是还是有些差异。
1、break
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
break;
}
printf("%d ", i);
}
return 0;
}
运行结果
- 我们会发现,这里的break和while中的作用一样,在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
2、continue
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
continue;
}
printf("%d ", i);
}
return 0;
}
运行结果 由此,在这里,i==5时,continue只是跳过continue下面的代码,依旧会执行i++。
3、for语句的循环控制变量
- 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
- 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
int i = 0;
for(i=0; i<10; i++)
{}
for(i=0; i<=9; i++)
{}
4、一些for循环的变种
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
for (;;)
{
printf("HeHe\n");
}
return 0;
}
我们会发现,死循环了。
- 注意:for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问
题。省略判断,便是恒为真,就是死循环。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("hehe\n");
}
}
return 0;
}
运行结果 3.
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for (; i < 3; i++)
{
for (;j<3;j++)
{
printf("hehe\n");
}
}
return 0;
}
运行结果
- 为什么2和3的结果不同呢?
因为3中i为1时,进入for (;j<3;j++)时j已经是3。
- 使用多于一个变量控制循环
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
{
printf("hehe\n");
}
return 0;
}
运行结果
5、练习
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i =0,k=0; k=0; i++,k++)
k++;
return 0;
}
零次循环。原因:k=0,即为赋值,为假。
3、do…while()循环
1、简介
do
循环语句;
while(表达式);
- 执行流程
- 举例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int mian()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
运行结果
- 特点
循环至少执行一次,使用的场景有限,所以不是经常使用。
2、do while循环中的break和continue
1、break
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
if (i == 5)
{
break;
}
i++;
} while (i <= 10);
return 0;
}
运行结果
2、continue
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
if (i == 5)
{
continue;
}
i++;
} while (i <= 10);
return 0;
}
我们会发现程序陷入了死循环,这是因为continue会跳过循环体内后面的代码。
五、goto语句
1、前言
- C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
- 从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
- 但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过
程。
2、举例
- 例如:一次跳出两层或多层循环。
- 多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
- goto语句只能在同一个函数内部跳转,不能跨函数跳转。
goto语言真正适合的场景如下:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
3、应用
#include <string.h>
#include <stdlib.h>
int main()
{
char input[20] = {0};
system("shutdown -s -t 60");
again:
printf("请注意你的电脑在1分内关机,如果输入:我是猪,去取消关机\n");
scanf("%s", input);
if (strcmp(input, "我是猪") == 0)
{
printf("小乖乖,这就取消关机\n");
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
不用goto
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
#include <string.h>
int main()
{
char arr[20] = { 0 };
system("shutdown -s -t 60");
printf("如果想去取消关机,需要输入我是猪\n");
scanf("%s", arr);
while (1)
{
if (0 == strcmp(arr, "我是猪"))
{
printf("小乖乖,真听话\n");
system("shutdown -a");
break;
}
else
{
printf("真不听话\n");
}
}
return 0;
}
六、练习
1、计算 n的阶乘。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int a = 1;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
a = a * i;
}
printf("%d\n", a);
return 0;
}
运行结果
2、计算 1!+2!+3!+……+10!
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 1;
int n = 0;
int sum = 0;
for (n = 1; n <= 10;n++)
{
b = 1;
for (a = 1; a <= n; a++)
{
b = b * a;
}
sum = b + sum;
}
printf("%d\n", sum);
return 0;
}
运行结果
- 在这里,我们会发现n!=(n-1)!*n
- 因此,我们可以做如下修改
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int b = 1;
int n = 0;
int sum = 0;
for (n = 1; n <= 10; n++)
{
b = b * n;
sum = b + sum;
}
printf("%d\n", sum);
return 0;
}
运行结果
3、在一个有序数组中查找具体的某个数字n。(二分查找/折半查找)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int key = 0;
scanf("%d",&key);
int right = 9;
int left = 0;
int mid = 0;
int flag = 0;
while (left <= right)
{
mid = (right + left) / 2;
if (arr[mid] > key)
{
right = mid - 1;
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
{
printf("%d\n", mid);
flag = 1;
break;
}
}
if (flag == 0)
{
printf("未找到。\n");
}
return 0;
}
运行结果
4、编写代码,演示多个字符从两端移动,向中间汇聚。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
char arr1[] = "welcome to heu!!!!!";
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(1000);
system("cls");
left++;
right--;
}
printf("%s\n", arr2);
return 0;
}
5、编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char password[20] = { 0 };
int i = 0;
int flag = 0;
for (i = 1; i <= 3; i++)
{
printf("请输入密码:>\n");
scanf("%s", password);
if (0 == strcmp(password, "123456"))
{
printf("登录成功。\n");
flag = 1;
break;
}
}
if (flag == 0)
{
printf("输入错误。\n");
}
return 0;
}
运行结果
七、实战(猜数字游戏实现)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
void menu()
{
printf("*****************\n");
printf("*****1.play *****\n");
printf("*****0.exit *****\n");
printf("*****************\n");
}
void game()
{
int a = 0;
int ret = rand() % 100 + 1;
while (1)
{
printf("请输入1-100的数:>");
scanf("%d", &a);
if (a > ret)
{
printf("您输入的数过大\n");
}
else if (a < ret)
{
printf("您输入的数过小\n");
}
else
{
printf("恭喜您,猜对了。\n");
Sleep(1000);
system("cls");
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请输入数字1/0:");
scanf("%d", &input);
if (input == 1)
{
printf("请进行游戏。\n");
game();
}
else if (input == 0)
{
printf("退出游戏。\n");
}
else
{
printf("输入错误,请重新输入。\n");
}
} while (input);
return 0;
}
运行结果
八、总结
- 本博客记录了我一些对于分支语句和循环语句的所学所得,有不足的地方欢迎指出,后续会逐一补充。
|