1.switch语句
switch语句是一种特殊形式的if ...else结构,用于判断条件有多个结果的情况。它把多重的else if改成更易用,更可读的形式。
switch(expression)
{
case value1: statement
case value1: statement
...
case value1: statement
default:statement
}
根据expression表达式结果的不同,执行相应的case分支。如果摘不到对应的值就执行default分支。
注意:1 switch后加的expression必须是整形表达式
2 case后的值,必须是整形常量表达式
1.1 if和switch语句的对比
练习:输入任意一个整数值,计算除3之后的余数
if语句
int main()
{
int a = 0;
scanf("%d", &a);
if (a % 3 == 0)
printf("余数为0\n");
else if (a % 3 == 1)
printf("余数为1\n");
else if (a % 3 == 2)
printf("余数为2\n");
return 0;
}
switch语句
int main()
{
int a = 0;
scanf("%d", &a);
switch (a % 3)
{
case 0:
printf("余数为0\n");
break;
case 1:
printf("余数为1\n");
break;
case 2:
printf("余数为2\n");
break;
}
注意:1 case后必须有空格再加数字;
2 每一个case语句中的代码执行完后,需加上break才能跳出这个switch语句
1.2switch中的break
刚才的代码如果去掉break会有什么影响呢
int main()
{
int a = 0;
scanf("%d", &a);
switch (a % 3)
{
case 0:
printf("余数为0\n");
case 1:
printf("余数为1\n");
case 2:
printf("余数为2\n");
}
return 0;
}
输入7时,余数却出现1和2,这是由于switch语句也是分支效果的,只有再switch语句中使用break才能跳出switch语句,如果某一个case语句后面有break语句,代码就会继续往下执行,有可能执行其他case语句中的代码。
所以再switch语句中break语句是非常重要的,能实现真正的分支效果。
练习:
输入一个1~7的数
字,打印对应的星期几
例如:
输入:1 输出:星期一
输入:2 输出:星期二
输入:3 输出:星期三
输入:4 输出:星期四
输入:5 输出:星期五
输入:6 输出:星期六
输入:7 输出:星期天
int main()
{
int day = 0;
scanf("%d", &day);
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;
}
当题目改为
1. 输入1~5,输出的是“工作日”;
2. 输入6~7,输出“休息日”
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}
在上面代码中,是否使用break语句根据实际需要来决定
1.3 switch语句中的default
在使用switch语句时,如果switch后的表达式中的值无法匹配代码中case语句的时候,这时候可以在switch中加入default子句.
switch(expression)
{
case value1: statement
case value1: statement
default: statemnt
}
switch后面expression的结果不是value1,也不是value2时,就会执行default的子句.例如
int main()
{
int day = 0;
scanf("%d", &day);
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;
default:
printf("输入错误\n");
}
return 0;
}
1.4 switch语句中的case子句和default自居有顺序要求吗?default只能放在最后吗?
其实,在switch语句中case子句和default子句没有顺序要求的,只要你的顺序满足实际要求就行.
2 while循环
while的语法结构
while(表达式)
语句;//如果循环体包含更多语句,要使用大括号
int main()
{
while (1)
printf("hehe");
return 0;
}
死循环打印hehe
2.1while循环的实践
练习:在屏幕上打印1~10的值
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
2.2 练习
输入一个正的整数,逆序打印这个整数的每一位
例如:
输入:1234,输出:4 3 2 1
输入:521,输出:1 2 5
int main()
{
int i = 0, b = 0;
scanf("%d", &i);
while (i%10)
{
b=i % 10;
printf("%d ", b);
i /= 10;
}
return 0;
}
3.for循环
3.1语法形式
for(表达式1;表达式2;表达式3)
语句;//如果循环体想包含多条语句,必须使用大括号
表达式1用于循坏变量初始化,每次只执行一次,
表达式2用于循环结束条件的判断;
表达式3用于循环变量的调整;
执行顺序:首先执行表达式1初始化循环变量,接下来执行表达式2判断部分,表达式2的结果如果==0,则循环结束;表达式2的结果如果!=0则执行循环语句,循环语句执行完后再执行表达式3,调整循环变量,然后再去表达式2判断是否为0决定是否再执行.
3.2for循环的实践
练习:在屏幕上打印1~10的值
int main()
{
int i = 0;
for (i = 1;i <= 10; i++)
printf("%d ", i);
return 0;
}
while和for循环的对比
for和while在实现循环过程中都有初始化、判断、调整这三部分,但是for循环的三个部分非常集中,便于代码的维护,而如果代码较多的时候while循环的三个部分就比较分散,所以从形式上for循环更优一些。
3.3
练习:计算1~100之间3的倍数的数字之和
int main()
{
int i = 0;
int sum = 0;
for (i = 1;i <= 100;i++)
{
if (i % 3 == 0)
{
sum += i;
}
}
printf("%d", sum);
return 0;
}
此代码还可进行小小的优化
int main()
{
int i = 0;
int sum = 0;
for (i = 3;i <= 100;i+=3)
{
sum += i;
}
printf("%d", sum);
return 0;
}
4.do—while循环
4.1语法形式
在循环语句中do while语句的使用最少,它的语法如下
do
语句;
while(表达式);
while和for都是先判断,条件如果满足就进入循环,执行语句,不满足就跳出循环;
do while则是先直接进入循环体执行语句,再执行while后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再继续循环。其特点是循环体至少被执行一次。
4.2 do while循环实例
再屏幕上打印1~10的值
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
4.3 练习
输入一个正整数,计算这个整数是几位数?
例如:
输入:1234 输出:4
输入:12 输出:2
int main()
{
int n = 0;
scanf("%d", &n);
int cnt = 0;
do
{
cnt++;
n = n / 10;
} while (n);
printf("%d\n", cnt);
return 0;
}
cnt就相当于是这个代码循环的计数器,记录这个循环体被执行了几次.