- 1. 语句的概念
- 分类
- 2. 分支语句
- 2.1 if语句
- 2.2 switch语句
- 3.循环语句
- 3.1 While
- break和continue
- 小插曲:scanf和getchar
- 3.2 for循环
- break和continue
- 循环变量的控制
- for的省略写法(附上例子)
- 3.3 do...while( )循环
- break和continue
- 练习
- 1. 计算n的阶乘
- 2. 计算1! + 2! + 3! + …… + 10!
- 3.在一个有序数组中查找具体的数字n(二分查找)
- 4.编写代码,演示多个字符从两端移动,向中间汇聚
- 5.编写代码实现,模拟用户登录情景,并且只能登录3次(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序)
- 猜数字游戏
- 4. goto语句
- 表达式语句
- 函数调用语句
- 控制语句(本文重点)
- 复合语句
- 空语句
2. 分支语句 2.1 if语句控制语句分类:
- 条件判断:if语句、switch语句
- 循环执行:do while、while、for
- 转向语句:break、goto、continue、return
语法结构
// 类型一 : 单分支
if(表达式)
语句;
// 类型二 : 双分支
if (表达式)
语句1;
else
语句2;
// 类型3:多分支
if (表达式1)
语句1;
else if (表达式2)
语句2;
else
语句3;
条件成立怎么判断?
答:如果表达式是0/false表示条件不成立,**非0(就是表达式不等于零的表达式)**表示条件成立
代码块:一对大括号**{}**就是一个代码块
如果条件成立,要执行多条语句,那么就应该使用代码块
注意:else的匹配问题
例子:这个代码会输出什么呢?
#includeint main() { int a = 0; int b = 2; if (a == 1) if (b == 2) printf("hehen"); else printf("hahan"); return 0; }
实验结果:什么都没有输出
分析:如果else是跟第一个if匹配的话,最终结果就会输出haha,所以else不是跟第一个if进行匹配的;
结论:如果没有括号的情况,else会跟离他最近的if进行匹配
建议:为了写出可读性比较高的代码,建议写代码的时候加上代码块{}
代码风格(if语句)
- 变量和常量的相等比较,将常量放到代码的左边
int main()
{
int n = 1;
if (5 == n)
printf("hhhhn");
}
练习
- 判断一个数是否为奇数
int main()
{
int n = 0;
printf("请输入一个数字:");
scanf("%d", &n);
if (n % 2 == 0)
{
printf("不是奇数");
}
else
{
printf("是奇数");
}
return 0;
}
- 输出1到100的奇数
int main()
{
for (int i = 1; i <= 100; i++)
{
if (i % 2 == 1)
printf("%d ", i);
}
return 0;
}
2.2 switch语句
语法结构
- switch决定入口
- break决定出口
- switch后面的表达式必须是整型表达式,浮点型不行的(自己可以去实验一下)
- case后面也要是整型常量表达式
- default子句:都不满足的时候执行这个,一般是放到最后,但是放前面也行,break要带上
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("Mondayn");
break;
case 2:
printf("Tuesdayn");
break;
case 3:
printf("Wednesdayn");
break;
case 4:
printf("Thursdayn");
break;
case 5:
printf("Fridayn");
break;
case 6:
printf("Saturdayn");
break;
case 7:
printf("Sundayn");
break;
default:
printf("输入错误");
break;
}
3.循环语句
- while
- for
- do while
语法结构
while(表达式)
循环语句;
break和continue例子:打印1到10
break
i == 5的时候就跳出循环
continue
终止本次循环,因为变量i没有变化,所以再这里就直接陷入了死循环中
小插曲:scanf和getchar结论:
- break:直接跳出循环
- continue:终止本次循环
- scanf("%s", password) :读到空格就停下来
- getchar() :接受一个字符,返回值就是跟输入的字符一样的
场景:输入密码,确认密码的场景
int main(){
char password[20] = {0};
printf("请输入密码:");
scanf("%s", password);
int tmp = 0;
// 这一步筛掉那些输入密码后的回车字符(n)和输入密码带的那些空格
while ((tmp = getchar()) != 'n');
printf("请确认密码(Y/N)");
int ch = getchar();
if ('Y' == ch)
printf("确认成功");
else
printf("确认失败");
}
3.2 for循环
语法结构
- 表达式1:初始化部分
- 表达式2:条件判断部分,用于判断循环何时停止
- 表达式3:调整部分,用于循环条件的调整
for (表达式1; 表达式2; 表达式3)
循环语句;
break和continue
break
直接跳出for循环
continue
跳过本次循环,也就是跳过了5
建议:
- 不要在for循环的循环体里面修改循环变量,也就是for循环的第三个参数
- 建议for语句的循环控制变量的取值采用“左闭右开”的写法,根据可读性自己进行判断即可,这里只是建议
int i = 0;
// 左闭右开
for (i = 0; i < 10; i++)
{}
// 两边都是闭区间
for (i = 0; i <= 9; i++)
{}
for的省略写法(附上例子)
问题:如图所示的代码会打印几次"hehe"
先上结果截图:结果是打印了10次
利用debug工具进行分析
- j的值变成10之后,j的值一直没变过,一直都是10,所以就没有再能够进入第二层循环
- 因为j的值是在外面进行初始化的,因此到10之后,跳出第二层循环,就再也没有机会改变j的值了
建议
初学者还是先不要搞那些省略的东西,就稳稳地把该写的写上,避免一些不必要的麻烦
这个挺少用到的
语法结构
- 循环体至少执行一次
do
循环语句;
while(表达式);
例子:打印1~10
break
continue
1. 计算n的阶乘
int main(){
int n = 0;
printf("请输入一个数:");
scanf("%d", &n);
int i = 0;
int ret = 1;
for (i = 1; i <= n; i++)
{
ret = ret * i;
}
printf("%d", ret> );
return 0;
}
2. 计算1! + 2! + 3! + …… + 10!
- 方法一:
int main()
{
int i = 0;
int j = 0;
int res1 = 1; // 用来每个阶乘的答案
int res2 = 0; // 保存最终答案
for (i = 1; i <= 10; i++)
{
res1 = 1; // 这里一定要进行更新一下
for (j = 1; j <= i; j++)
{
res1 = res1 * j;
}
res2 += res1;
}
printf("%d ", res2);
return 0;
}
- 方法二:
int main()
{
int i = 0;
int res1 = 1; // 用来每个阶乘的答案
int res2 = 0; // 保存最终答案
for (i = 1; i <= 10; i++)
{
res1 = res1 * i;
res2 += res1;
}
printf("%d ", res2);
return 0;
}
3.在一个有序数组中查找具体的数字n(二分查找)
注意:
- 求出right的值的方法
- while循环的条件是l <= r
- mid = (left + right) / 2
- 找到了之后要break
- 如果没找到就要进行判断一下:l > r``
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]); // 算出该数组右多少个元素
// 查找k
int l = 0; // 左下标
int r = sz - 1; // 右下标
while (l <= r)
{
int mid = (l + r) / 2; // 中间值
if (arr[mid] < k)
{
l = mid + 1;
}
else if (arr[mid] > k)
{
r = mid - 1;
}
else
{
printf("找到了,下标是%dn", mid);
break;
}
}
if (l > r)
{
printf("找不到了n");
}
return 0;
}
4.编写代码,演示多个字符从两端移动,向中间汇聚
int main()
{
char arr1[] = "welcome to bit!!!!!";
char arr2[] = "###################";
int left = 0;
// int right = sizeof(arr1) / sizeof(arr1[0]) - 2; 因为字符串的结尾处是' '
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%sn", arr2);
Sleep(1000); // 单位是毫秒
system("cls");
left++;
right--;
}
return 0;
}
5.编写代码实现,模拟用户登录情景,并且只能登录3次(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序)
注意:
- 两个字符串的比较:用strcmp()
int main()
{
int i = 0;
char password[20] = {0};
// 假设正确密码是123456
for (i = 0; i < 3; i++)
{
printf("请输入密码:");
scanf("%s", password);
if (strcmp(password, "123456") == 0)
{
printf("密码正确,登录成功n");
break;
}
else
{
printf("密码错误,请重新输入n");
}
}
if (3 == i)
{
printf("密码输入三次都错误n");
}
}
猜数字游戏
生成随机数的方法:
- srand((unsigned int) time(NULL));
- 初始化一次就行了,所以放到了main函数里面
- int ret = rand() % 100 + 1;
- 生成一个1~100的随机数
- 获取时间戳的函数time(NULL)
// 猜数字游戏
void menu()
{
printf("-----------------n");
printf("----1. 开始游戏---n");
printf("----0. 退出游戏---n");
printf("-----------------n");
}
// 猜数字游戏
void game()
{
int guess = 0;
// 1. 生成随机数
int ret = rand() % 100 + 1;
// 2. 猜数字
while(1)
{
printf("请输入数字:");
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:
game();
break;
case 0:
printf("退出游戏n");
break;
default:
printf("输入有误,请重新输入n");
break;
}
}while(input);
return 0;
}
4. goto语句
- 不能跨函数跳转
- 常用场景:终止程序在某些深度嵌套的结构处理过程
- 不过一般没有goto语句也没关系,用其他方式也是可以实现相对应的逻辑的
goto语句使用例子
- 实现的逻辑:系统1分钟后关机,如果输入我是猪,就会取消关机
- 这个例子还挺好玩的哈哈哈,大家可以尝试一下
- 调用了system函数
int main()
{
char input[20] = {0};
system("shutdown -s -t 60");//system是一个库函数,用来执行系统命令的
n:
printf("请注意,你的电脑将在1分钟后关机,如果输入:我是猪,就取消关机n");
scanf("%s", input);
// 判断
if (strcmp(input, "我是猪") == 0)
{
system("shutdown -a");
}
else
{
goto n;
}
}
不用goto语句实现上面的逻辑
int main()
{
char input[20] = {0};
system("shutdown -s -t 60");//system是一个库函数,用来执行系统命令的
while(1)
{
printf("请注意,你的电脑将在1分钟后关机,如果输入:我是猪,就取消关机n");
scanf("%s", input);
// 判断
if (strcmp(input, "我是猪") == 0)
{
system("shutdown -a");
break;
}
}
}
scanf(“%s”, input);
// 判断
if (strcmp(input, “我是猪”) == 0)
{
system(“shutdown -a”);
}
else
{
goto n;
}
}
**不用goto语句实现上面的逻辑**
```cpp
int main()
{
char input[20] = {0};
system("shutdown -s -t 60");//system是一个库函数,用来执行系统命令的
while(1)
{
printf("请注意,你的电脑将在1分钟后关机,如果输入:我是猪,就取消关机n");
scanf("%s", input);
// 判断
if (strcmp(input, "我是猪") == 0)
{
system("shutdown -a");
break;
}
}
}



