前言
C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构。
我们可以使⽤ if , switch 实现分⽀结构,使⽤ for 、 while 、 do while 实现循环结构。
一、分支结构
1.if语句
1.1 if
//if语句的形式
if(表达式){
语句;
}
如果表达式的值为真,执行语句,否则不执行
例:
//写一个函数可以判断一个数是不是素数
//是素数返回1
//不是素数返回0
int is_prime(int n){
int j=0;
for(j=2;j<=sqrt(n);j++){
if(n%j==0)
{
return 0;
}
}
return 1;//n是素数
}
#include <stdio.h>
int main(){
int i=0;
int count=0;
for(i=101;i<=200;i+=2){
if(is_prime(i)) {
printf("%d ",i);
count++;
}
}
printf("\ncount=%d",count);
return 0;
}
1.2 else
if ( 表达式 )语句 1;else语句 2;
例:输入年龄,大于等于18则输出成年,否则输出未成年
#include <stdio.h>
int main()
{
int age;
scanf("%d", &age);
if(age>=18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
注:默认在
if
和
else
语句中默认都只控制⼀条语句,
else总是和最近的if语句匹配
2.switch语句
switch
语句是⼀种特殊形式的
if...else
结构,⽤于判断条件有多个结果的情况。使运行结果看起来
更加清晰,明确,增加了可读性。
switch (number) {
case 1:
printf("nice"):
case 2:
printf("good");
default:
printf("error");
}
上⾯代码中,根据表达式number
不同的值,执⾏相应的
case
分⽀。如果找不到对应的值,
就执⾏
default
分⽀。
注:
•
switch
后的
number
必须是整型表达式
•
case
后的值,必须是整形常量表达式
2.1 if语句与switch语句的比较
练习:输⼊任意⼀个整数值,计算除3之后的余数
如果使⽤if语句完成,如下:
#include <stdio.h>
int main()
{
int n ;
scanf("%d", &n);
if(n%3 == 0)
printf("整除,余数为0\n");
else if(n%3 == 1)
printf("余数是1\n");
else
printf("余数是2\n");
return 0;
}
如果使⽤switch语句改写,就可以是这样的:
#include <stdio.h>
int main()
{
int n ;
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;
}
注:
每⼀个
case
语句中的代码执⾏完成后,需要加上
break
,才能跳出这个switch语句。
2.2 switch语句中的break
前⾯的代码中,如果我们去掉case语句中的break,会出现什么情况呢?
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
}
return 0;
}
测试⼀组,看⼀下结果:
我们发现,7除以3本来余数是1,但是我们发现程序运⾏的结果多了⼀⾏“余数是2”的打印。
这是为什么呢?
原因是
switch
语句也是分⽀效果的,只有在
switch
语句中使⽤
break
才能在跳出
switch
语
句,如果某⼀个
case
语句的后边没有
break
语句,代码会继续往下执⾏,有可能执⾏其他
case
语句中的代码,直到遇到
break
语句或者
switch 语句结束。
所以在
switch
语句中
break
语句是⾮常重要的,能实现真正的分⽀效果。
当然,
break
也不是每个
case
语句都得有,这就得根据实际情况来看了。
练习:
输⼊⼀个1~7的数字,打印对应的星期⼏
例如:
输⼊:1 输出:星期⼀
输⼊:2 输出:星期⼆
输⼊:3 输出:星期三
输⼊:4 输出:星期四
输⼊:5 输出:星期五
输⼊:6 输出:星期六
输⼊:7 输出:星期天
参考代码如下:
include <stdio.h>
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;
}
上⾯的练习中,我们发现应该根据实际的情况,来在代码中觉得是否使⽤
break
,或者在哪⾥使⽤
break
,才能正确完成实际的需求。
2.3 switch语句中的default
在使⽤
switch
语句的时候,我们经常可能遇到⼀种情况,⽐如
switch
后的表达式中的值⽆法匹
配代码中的
case
语句的时候,这时候要不就不做处理,要不就得在
switch
语句中加⼊ default ⼦句。
switch (expression) {
case value1: statement
case value2: statement
default: statement
}
switch
后边的
expression
的结果不是
value1
,也不是
value2
的时候,就会执⾏
default
⼦句
2.4 switch语句中的case和default的顺序问题
在
switch
语句中
case
语句和
default
语句是没有顺序要求的,只要你的顺序是满⾜实
际需求的就可以。
不过我们通常是把
default
⼦句放在最后处理的。
二、循环结构
1.for
- for循环的语法形式
for ( 表达式 1 ; 表达式 2 ; 表达式 3 );
- for循环的执⾏流程
代码如下(示例):
//练习:在屏幕上打印1~10的值
1 #include <stdio.h>
2
3 int main()
4 {
5 int i = 0;
6 for(i=1; i<=10; i++)
7 {
8 printf("%d ", i);
9 }
10 return 0;
11 }
2.while
- while循环的语法形式
while ( 表达式 )语句;
代码如下(示例):
#include <stdio.h>
int main()
{
while(1)
printf("nice\n"); //while后边的条件满⾜,死循环的打印nice
return 0;
}
-
while语句的执⾏流程
- 练习
输⼊⼀个正的整数,逆序打印这个整数的每⼀位例如:输⼊:1234,输出:4 3 2 1输⼊:521,输出:1 2 5
注:
1.
要想得到n的最低位,可以使⽤n%10的运算,得到的余数就是最低位.
2.
要想去掉n的最低位,找出倒数第⼆位,则使⽤
n=n/10
操作就可以去掉最低位.
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while(n)
{
printf("%d ", n%10);
n /= 10;
}
return 0;
}
3.do...while
- do...while循环的语法形式
do语句;while ( 表达式 ) ;
while
和
for
这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳
出循环;
⽽
do while
循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏
while
后的判断表达式,表
达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。
在
do while
循环中先执⾏“语句”,执⾏完语句,在去执⾏“判断表达式”,判断表达式的结果是!=0,则继续循环,执⾏循环语句;判断表达式的结果==0,则循环结束。
所以在
do while
语句中循环体是⾄少执⾏⼀次的,这是
do while
循环⽐较特殊的地⽅
- 练习
输⼊⼀个正整数,计算这个整数是⼏位数?例如:输⼊:1234 输出:4输⼊:12 输出:2
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int cnt = 0;
do
{
cnt++;
n = n / 10;
} while (n);
printf("%d\n", cnt);
return 0;
}
4.补充知识
4.1 while循环中的break和continue
4.1.1 break举例
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;//当i等于5后,就执⾏break,循环就终⽌了
printf("%d ", i);
i = i+1;
}
return 0;
}
4.1.2 continue举例
continue
是继续的意思,在循环中的作⽤就是跳过本次循环中
continue
后边的代码,继续进⾏
下⼀次循环的判断
4.2 for循环中的break和continue
4.2.1 break 举例
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ", i);
}
return 0;
}
break
的作⽤是永久的终⽌循环,未来我们在某个条件发⽣的时候,不想再继续循环的时候,就可以 使⽤ break
来完成。
4.2.2 continue举例
在
for
循环中
continue
的作⽤是跳过本次循环中
continue
后的代码,直接去到循环的调整部分。未来当某个条件发⽣的时候,本次循环⽆需再执⾏后续某些操作的时候,就可以使⽤ continue 来实现。