分支语句和循环语句
1. 什么是语句?
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。
2. 分支语句(选择结构)
2.1 if语句
语法结构:
/*第一种*/
if(表达式)
{
语句;
}
/*第二种*/
if(表达式)
{
语句1;
}
else
{
语句2;
}
/*第三种*//*多分支*/
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
实践如下:
#include <stdio.h>
//代码1
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("未成年\n");
}
}
//代码2
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
}
//代码3
#include <stdio.h>
int main()
{
int age = 0;
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");
}
}
补充:在C语言中如何表示真假?
2.1.1 悬空else
else的匹配:else是和它离的最近的if匹配的。
矛盾代码如下:
#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与哪个if匹配?
答案:
与第二个if匹配,但是代码多了后直接是不容易看出来的,所以有了如下规定:
//适当的使用{}可以使代码的逻辑更加清楚。
//代码风格很重要
#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;
}
2.1.2 if书写形式的对比
//代码1
if (condition) {
return x;
}
return y;
//代码2
if (condition)
{
return x;
}
else
{
return y;
}
//1,2比较得出大括号的位置,应该上下对应,代码才清楚
//代码3
int num = 1;
if (num == 5)
{
printf("hehe\n");
}
//代码4
int num = 1;
if (5 == num)
{
printf("hehe\n");
}
/*3,4对比得出,如果判断语句出现,等于一个数的条件,应该让数字在
前*/
原因是:在代码3中,如果不小心把num==5,写成num=5 那么判断语句也会
通过。原因是if进行判断时,判断的是*括号里的表达式,是否为真。
num = 5 赋值表达式,整体值为赋值值5,(除非赋值值为0时,if不成立
其余都会成立的)并且if无论成不成立,num的值都会改变成为,赋值的值
num == 5 判断表达式,只有0和1,num值如果等于5,那么这个表达式的值
也就等于1,num如果不等于5,那么这个表达式的值,为0.(并且if不管成
立不成立,num的值不会变)
2.1.3 练习
问题1:
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
if (n % 2 == 1)
{
printf("%d是奇数\n", n);
}
else
{
printf("%d不是奇数\n", n);
}
return 0;
}
问题2:
#include<stdio.h>
int main()
{
/*方法1*/
int i;
for (i = 1; i <= 100; i++) //遍历1-100间的所有数
{
if (i % 2 == 1) //判断是否为奇数
{
printf("%d ", i);//如果是奇数,输出,别忘记每个数之间要有空格
}
}
return 0
/*方法2*/
int i;
for (i = 1; i <= 100; i = i + 2)//直接遍历1-100间的奇数
{
printf("%d ", i); //直接输出即可,别忘记每个数之间要有空格
}
}
2.2 switch语句
比如:
如果写成if…else if …else if,可以尝试一下,但是switch语句更好,如下:
而语句项是什么呢?
2.2.1 在switch语句中的 break
在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支
#include <stdio.h>
int main()
{
int day = 0;
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;
}
#include <stdio.h>
//switch代码演示
int main()
{
int day = 0;
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
}
return 0; }
编程好习惯
2.2.2 default子句
编程好习惯
2.2.3 练习(C语言第5道总例题)
#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);//输出的是m = 5, n = 3
return 0;
}
3. 循环语句
3.1 while循环
我们已经掌握了,if语句:
if(条件)
语句;
//while 语法结构
while(表达式)
循环语句;
比如我们实现:
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i = i+1;
}
return 0;
}
上面的代码已经帮我了解了while 语句的基本语法,那我们再了解一下:
3.1.1 while语句中的break和continue
//break 代码实例
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d ", i);
i = i + 1;
}
return 0;
}
这里代码输出的结果是什么?
总结:
//continue 代码实例1
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i = i + 1;
}
return 0;
}
这里代码输出的结果是什么?
//continue 代码实例2
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
i = i + 1;
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
这里代码输出的结果是什么?
再看几个代码:
//代码什么意思?
//代码1
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
//这里的代码适当的修改是可以用来清理缓冲区的.自行百度,缓冲区
/*1.EOF等于-1,getchar相等于scanf的作用,当gerchar能读取到数据
时,ch = gerchar()表达式的返回值是 1。但是没有读取到值的时候,
返回值是-1。*/
/*所以用 while ((ch = getchar()) != EOF)
作用:持续读入数据。当没有数据读入时,才停止循环
也可以用 while(scanf("%d",&ch) != EOF)
*/
//代码2
#include <stdio.h>
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < ‘0’ || ch > ‘9’)
continue;
putchar(ch);
}
return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的
3.2 for循环
我们已经知道了while循环,但是我们为什么还要一个for循环呢?
首先来看看for循环的语法:
3.2.1 语法
for(表达式1; 表达式2; 表达式3)
循环语句;
实际的问题:
#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
现在我们对比一下for循环和while循环
int i = 0;
//实现相同的功能,使用while
i = 1;//初始化部分
while (i <= 10)//判断部分
{
printf("hehe\n");
i = i + 1;//调整部分
}
//实现相同的功能,使用while
for (i = 1; i <= 10; i++) {
printf("hehe\n");
}
3.2.2 break和continue在for循环中
在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。
但是还是有些差异:
//代码1
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
/*最终输出结果是 1 2 3 4.表面for中遇到break就结束*/
//代码2
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
/*输出结果是1 2 3 4 6 7 8 9 10
表面for中遇到continue是直接再次循环,不继续往下走,但是i++(也就
是每次for循环的,调整语句在continue后还会执行)
*/
3.2.3 for语句的循环控制变量
建议:
int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}
前闭后开的好处是:可以直接看出循环次数 10-0=10
3.2.4 一些for循环的变种
#include <stdio.h>
int main()
{
//代码1
for(;;)
{
printf("hehe\n");
}
//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是
//不建议初学时省略,容易导致问
题。
//代码2
int i = 0;
int j = 0;
//这里打印多少个hehe?
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
printf("hehe\n");
}
}
//代码3
int i = 0;
int j = 0;
//如果省略掉初始化部分,这里打印多少个hehe?
for(; i<10; i++)
{
for(; j<10; j++)
{
printf("hehe\n");
}
}
//代码4-使用多余一个变量控制循环
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("hehe\n");
}
return 0; }
3.2.5 一道笔试题(C语言第6道总例题)
//请问循环要循环多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)
k++;
return 0;
}
3.3 do…while()循环(了解即可,不常用)
3.3.1 do语句的语法
do
循环语句;
while(表达式);/*注意此处while后是有分号的*/
3.3.2 do语句的特点
循环至少执行一次,使用的场景有限,所以不是经常使用
#include <stdio.h>
int main()
{
int i = 10;
do
{
printf("%d\n", i);
} while (i < 10);
return 0;
}
3.3.3 do while循环中的break和continue
#include <stdio.h>
int main()
{
int i = 10;
do
{
if (5 == i)
break;
printf("%d\n", i);
} while (i < 10);
return 0;
}
#include <stdio.h>
int main()
{
int i = 10;
do
{
if (5 == i)
continue;
printf("%d\n", i);
} while (i < 10);
return 0;
}
3.4 练习
3.4.1 练习参考代码
//代码1
//编写代码,演示多个字符从两端移动,向中间汇聚
#include <stdio.h>
int main()
{
char arr1[] = "welcome to bit...";
char arr2[] = "#################";
int left = 0;
int right = strlen(arr1) - 1;
printf("%s\n", arr2);
//while循环实现
while (left <= right)
{
Sleep(1000);//了解即可,请百度一下
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
printf("%s\n", arr2);
}
//for循环实现
for (left = 0, right = strlen(src) - 1;
left <= right;
left++, right--)
{
Sleep(1000);
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", target);
}
retutn 0;
}
//代码2
int main()
{
char psw[10] = "";
int i = 0;
int j = 0;
for (i = 0; i < 3; ++i)
{
printf("please input:");
scanf("%s", psw);
if (strcmp(psw, "password") == 0)
break;
}
if (i == 3)
printf("exit\n");
else
printf("log in\n");
}
3.4.2 折半查找算法
实现在主函数内:
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 = 7;
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");
}
3.4.3 猜数字游戏实现
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("**********************************\n");
printf("*********** 1.play **********\n");
printf("*********** 0.exit **********\n");
printf("**********************************\n");
}
//RAND_MAX--rand函数能返回随机数的最大值。
void game()
{
int random_num = rand() % 100 + 1; //生成随机数
int input = 0;
while (1)
{
printf("请输入猜的数字>:");
scanf("%d", &input);
if (input > random_num)
{
printf("猜大了\n");
}
else if (input < random_num)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned)time(NULL)); //生成随机数时,必须写的这个
do
{
menu();
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("选择错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
4. goto语句
goto语言真正适合的场景如下:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;//跳出多重循环中,用goto
}
}
…
error:
一个关机程序
#include <stdio.h>
int main()
{
char input[10] = { 0 };
system("shutdown -s -t 60");//倒计时关机代码
again:
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
if (0 == strcmp(input, "我是猪"))
{
system("shutdown -a"); //关机取消代码
}
else
{
goto again;
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
char input[10] = {0};
system("shutdown -s -t 60");
while(1)
{
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
if(0 == strcmp(input, "我是猪"))
{
system("shutdown -a");
break;
}
}
return 0; }
关于shutdown命令的扩展-(请点这里)
本章结束。