switch语句
1.1 初步认识switch
在c语言中,除了if语句,还可以使用switch语句来实现分支结构。
switch语句用于判断条件有多个结果的情况,它把多重的else if改成更易用、可读性更好的形式。
switch的形式如下;
1 switch (expression){
2 case value1 : statement
3 case value2 : statement
4 default : statement
5 }
上述代码形式中,根据表达式expression不同的值,执行相应的case分支,如果没有相对应的case,则执行default分支。
注意:
1 switch后面的erpression必须时整型表达式
2 case 后的值,必须是整型常量表达式。
下面给出一个例题:
输入任意一个整数值,计算除3之后的余数。
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d",&n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
上述代码中我们需要注意的有:
1 case和后面大的数字之间必须有空格
2 每一个case 语句中的代码执行完成后,需要加上break才能结束这个switch语句。
1.2 break 在switch中的应用
假如将上述代码中的break删去,则结果会出乎我们的意料。
会出现如上结果,因为7%3 == 1,进入case1,执行下面的语句,因为没有break,故还会进入case2并执行下面的语句。
所以在switch语句中break语句是非常重要的,能实现真正的分支效果。
当然,break 也不是每个case语句都得有,这就得根据实际情况来看了。
1.3 switch语句中的default
在使用switch语句的时候,我们经常可以遇到一种情况,比如switch后的表达式中的值无法匹配代码中case语句的时候,这时候可以选择不做处理,也可以在switch语句中假如default子句。
switch (expression)
{
case value1: statement
case value2: statement
default :statement
}
switch后面的expression的结果不是value1,也不是value2的时候,就会执行default语句。
例如打印星期几的练习,如果day输入的不是1~7的值,如果我们要提示:输入错误,则可以这样完成代码:
#include <stdio.h>
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;
default:
printf("输入错误\n");
break;
}
return 0;
}
1.4switch语句中的case和default的顺序问题
在switch语句中通常case和default是没有顺序要求的,只要你的顺序是满足实际需求就可以。
不过我们通常是把default子句放在最后处理。
while循环
c语言中提供了3种循环,while就是其中的一种,下面我们来介绍while语句。
2.1 while语句的执行流程
首先上来就是执行判断表达式,表达式的值为0时,循环直接结束;表达式的值不为0时,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。
2.2 while循环的实践
练习:在屏幕上打印1~10的值
#include <stdio.h>
int main()
{
int i = 0;
while(i<=10)
{
printf("%d ",i);
i++;
}
return 0;
}
输出结果自然是:1 2 3 4 5 6 7 8 9 10;
2.3练习
输入一个正的整数,逆序列打印这个整数的每一位
例如:
输入:1234,输出:4 3 2 1
输入:521,输出:1 2 5
题目解析
1.要想得到n的最低位,可以使用n%10的运算,得到的余数就是最低的,如:123%10 == 3;
2.要想去掉n的最低位,找出倒数第二位,则使用n = n / 10操作就可以去掉最低位,如:n = 123 / 10 得到12,12%10,就得到了倒数第二位 2;
3.利用while循环前面两个步骤,直到n为0,停止。
参考代码:
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
while(a)
{
printf("%d",n%10);
n / = 10;
}
return 0;
}
for循环
3.1 for循环的语法形式
首先执行表达式1 初始化循环变量,接下来就是执行表达式2的判断部分,表达式2的结果如果==0,则循环结束;表达式2的结果如果!=0则执行循环语句,循环语句执行完后,再去执行表达式3,调整循环变量,再去表达式2的地方执行判断,表达式2的结果是否为0,决定循环是否继续。
注意:整个循环的过程中,表达式1初始化部分只被执行一次,剩下的就是表达式2、循环语句、表达式3在循环。
3.2 for循环的实践
练习:在屏幕上打印1~10的值
参考代码:
#include <stdio.h>
int main()
{
int i = 0;
for(i = 1;i<=10;i++)
{
printf("%d ",i);
}
return 0;
}
运行结果自然是:1 2 3 4 5 6 7 8 9 10
3.3 练习
计算1-100之间3的倍数的数字之和
参考代码:
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
for(i = 1;i<=100;i++)
{
if(i%3 == 0)
sum += i;
}
printf("%d\n",sum);
return 0;
}
上述代码是我们一般的基本思路。
当然我们也可以对他进行优化,我们可以从i= 3开始每次i+=3,直接求i的和,这样是不是更简单了呢。
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
for(i = 3;i<=100;i+=3)
{
sum+= i;
}
printf("%d\n",sum);
return 0;
}
do while 循环
4.1 语法形式
在循环语句中do while语句的使用应该是最少的,它的语法如下:
do
语句
while(表达式)
while 和 for循环都是先判断是否符合条件,如果条件符合就进入循环,执行循环语句,如果不满足就跳出循环;而do while循环则是先直接进入循环,执行循环语句,然后再执行while后的判断表达式,表达式为真,就睡进入下一次,表达式为假,则不再进入循环。
4.2 do while 循环的执行流程
do while循环先进入循环体,执行相关语句,再去判断表达式真假,所以不同于前面两个循环的是,dowhile循环最少执行一次,这是do while循环特殊之处。
4.3 do while循环的实例
在屏幕上打印1-10的值
参考代码:
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ",i);
i = i+1;
}while(i<=10)
return 0;
}
正是由于do while 使用在循环体至少被执行一次,所以用的比较少。
4.4 练习
输入一个正整数,计算这个整数是几位数?
例如:
输入:1234 输出:4
输入12 输出:2
参考代码:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d",&n);
int count = 0;
do
{
count ++;
n/=10;
}while(n);
printf("%d\n",count);
return 0;
}
上面这一练习题,并非一点更要用do while循环,但是用do while循环会简化步骤,因为输入0,也会count++一次,输出1。
break 和continue语句
在循环语句中,遇到复杂问题常常会用到这两个语句。
break的作用是用于永久的终止循环,只要break被执行,直接就会跳出循环,看往后执行。
continue的作用是跳过本次循环continue后边的代码,在for循环和while循环中有所差异。
5.1break的举例
#include <stdio.h>
int main()
{
int i = 0;
while(i<=10)
{
if(i == 5)
break;
printf("%d ",i);
i = i + 1;
}
return 0;
执行的结果是1 2 3 4;
在这里当i == 5的时候执行break,跳出while循环,所以只打印1 2 3 4.由于其他循环中break的作用与之差不多,在这儿不再举例。
5.2 while循环中的continue
#include <stdio.h>
int main()
{
int i = 0;
while(i<=10)
{
if(i == 5)
continue;
printf("%d ",i);
i = i + 1;
}
return 0;
当i == 5的时候,就执行continue 直接跳过continue后面的代码,去循环判断的地方,因为这里跳过了i = i+1,所以程序陷入了死循环,只打印出1 2 3 4.
5.3for循环中的continue
#include <stdio.h>
int main(){
int i = 0;
for(i = 1;i<=10;i++)
{
if(i == 5)
continue;
printf("%d ",i);
i = i+1;
}
return 0;
}
上述代码的结果是1 2 3 4 6 7 8 9 10
在for循环中 循环变量的变化语句没有放在for循环里面,所以,当i= 5,执行continue的时候,跳过了打印5,但i仍会++。这也是与continue在while中不同的地方。
循环嵌套
6 循环嵌套
练习:找出100-200之间的素数,并打印在屏幕上。
注:素数又称质数,是只能被1或本身整除的数字。
题目解析:
1.要产生100-200的数字,应该用循环产生。
2.假设判断i是否为素数,需要拿出2~i-1之间大的数字去试除i,可以用循环解决。
3.如果2~i-1有数字可以整除i,则i不是素数,反之是素数。
参考代码:
#include <stdio.h>
int main()
{
int i = 0;
for(i = 100;i<=200;i++)
{
int x = 1; //假设i是素数
for(int j = 2;j<=i-1;j++)
{
if(i%j == 0)
{
x = 0;//i不是素数。
}
if(x == 1)
{
printf("%d ",i);
}
}
return 0;
}
goto语句
7 goto语句
c语言提供了非常特别的语法,就是goto语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的标号处,
例如:
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
值得注意的是 goto语句使用不当,就会导致在函数内部乱旋转,打乱程序的流程。所以我们在非必须的时候尽量不使用。
当然goto语句也不是一无用处,在多层循环中,如果想快速跳出循环,使用goto语句是个不错的选择。
for()
{
for()
{
for()
{
if()
goto error;
}
}
}
error:
感谢阅读!