分支语句和循环语句
一、C语句可分为以下五类:
1.语句分类
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
2.C语言有九种控制语句, 可分成以下三类:
- 条件判断语句也叫分支语句:if语句、switch语句
- 循环执行语句:do while语句、while语句、for语句
- 转向语句:break语句、goto语句、continue语句、return语句
二、分支(选择)语句
- if else else if 三者的使用
- switch:
在每个 switch 语句中都放一条default子句是个好习惯,
甚至可以在后边再加一个 break
三、循环语句
- for循环
- while循环
- do while循环
四、转向语句
- 应用场景:
在选择和循环语句中灵活使用break,continue,goto
五、练习
1. break易错点
代码演示m最终的运行结果
#include <stdio.h>
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;
}
//思考:运行结果是什么?
//m = 5 n = 2 为什么不是m = 4呢?
//该代码中嵌套 switch 中的 break 跳出的是它那一层的 switch ,跳出后他仍然后继续执行最外层的 switch 语句
结论:break 只是跳出它所在的那一层语句,而不是跳到最外层.
2.编写代码,演示多个字符从两端移动,向中间汇聚
代码演示用两个数组实现字符的汇聚,while和for均可
#include <stdio.h>
#include <Windows.h>
int main()
{
//1.定义两个数组,一个是完整的字符串,另一个是要演示汇聚的字符串
char arr1[] = "Myblue offer!";
char arr2[] = "xxxxxxxxxxxxx";
//2.利用循环分别从两端向中间字符拷贝,利用sleep来观察字符的拷贝过程
//3.定义两个下标索引,一个从左到右,一个从右向左
int length = sizeof(arr1) / sizeof(arr1[0]);
int left = 0;
int right = length - 1;//length是字符串的长度
while (left <= right)//直至左边元素下标大于右边的元素时停止循环
{
Sleep(1000);
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
printf("%s\n", arr2);
}
return 0;
}`
3.自定义一个二分查找函数
(适用于按一定顺序排列的数据)
//自定义函数实现二分查找(折半查找法),找到了就打印FIND!,没找到就打印NO FIND!
#include <stdio.h>
//自定义函数
//1.查找一个数在数组中是否存在
//2.我需要 查找的数组 和 要查找的数,折半查找需要最左边和最右边的元素的下标
//3.找到了返回下标,没找到就返回-1
int findNumber(int arr[], int number, int left, int right)
{
//定义一个数组中间元素,因为数组是按顺序排序的,
//循环判断,直至原本左边的元素下标大于右边的元素下标就停止循环(也就是全部都查找了,没有查找到)
while (left<=right)
{
//小细节:这个要放在循环的里面,不能放在循环外面,否则mid一直不变化
int mid = (left + right) / 2;
//要查找的数大于中间值,那么左边到中间的值一定不符合条件(都比它小),一定在函数的右边,因为数组是按顺序排列的
if (number > arr[mid])
{
left = mid + 1;
}
//要查找的数小于中间值,那么右边到中间的值一定不符合条件(都比它大),一定在函数的左边,因为数组是按顺序排列的
else if (number < arr[mid])
{
right = mid - 1;
}
//找到了就返回下标
else
{
return mid;
}
}
//循环结束之后没有找到
return -1;
}
int main()
{
//1.定义一个要查找的顺序数组
int arr[10] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };
//2.输入要查找的数
int number = 0;
scanf("%d", &number);
//3.调用函数,把所需要的参数传过去
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;
int index = findNumber(arr, number, left, right);
if (index>=0)
{
printf("FINFD!");
}
else if(index == -1)
{
printf("NO FIND!");
}
return 0;
}
4.猜数字游戏
代码演示 利用while循环实现一个猜数字游戏
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void menu()
{
printf("-------------------------------\n");
printf("----------1. 开始游戏-----------\n");
printf("----------0. 退出游戏-----------\n");
printf("-------------------------------\n");
}
void game()
{
int rand_num = rand() % 100 + 1;//1~100的随机数
//printf("%d\n", rand_num);//可以看看生成随机数的具体数值
int my_input = 0;
while (1)
{
printf("请输入要猜的数字\n");
scanf("%d", &my_input);
if (my_input > rand_num)
{
printf("大了\n");
}
else if (my_input < rand_num)
{
printf("小了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
//生成随机数的种子,头文件
srand((unsigned)time(NULL));
do
{
menu();//菜单
printf("请输入input:");
scanf("%d", &input);//输入一个数选择要执行的操作
switch (input)
{
case 1:
game();//开始游戏
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
5.goto语句(了解)
应用场景: 最常见的用法就是终止程序在某些深度嵌套的结构的处理过程
例如:一次跳出两层或多层循环
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环
总结
以上内容是对分支循环语句的简单介绍,主要是这部分的关键内容进行讲解,上述讲解的几个例题可以去试着练习一下,难度不算太低,希望阅读完的码友能够有所收获!如果存在不足,欢迎在评论区指正!