简介:流程控制语句
1.分支语句(条件语句)
if/else(重点)
switch/case
2.循环语句
for(重点)
while
do while
分支语句
1> if/else
按照一定的条件执行不同的代码,可以使用分支语句。
if(逻辑表达式条件1){ //如果 必须出现1次
满足条件1时执行的语句;
}
else if(逻辑表达式条件2){ //或者 出现0-n次
满足条件2时执行的语句;
}
else{ //否则 出现0-1次
以上条件都不满足时执行的语句
}
练习:输入一个整数,判断 是正数、负数、零。
int a; if(a>0){ printf("%d是正数\n",a); }else if(a==0){ printf("%d是零\n",a); }else{ printf("%d是负数\n",a); }
注:
a> if/else 只会执行一个分支,因此,如果第一个分支满足条件了,不再执行后面的分支。-> 如果执行到了第n个分支,前面n-1个分支一定不成立。
b> 有else的分支语句必选其一执行,没有else的分支语句可选其一执行。
c> 如果分支内部只有一条语句,{}可以省略。一般执行:break/continue/return 语句时,{}通常省略。
d> 流程控制语句 需要 注意临界点的处理。
e> 经常 用于 处理 业务的需求。
#include <stdio.h> /* 使用if语句来判断输入输入 某年某月 有几天 */ int main() { printf("请输入年月\n"); int y,m,maxDay=31; scanf("%d%d",&y,&m); if(m<1 || m>12){ printf("输入非法\n"); return -1; } if(m==4||m==6||m==9||m==11){ maxDay = 30; } else if(m==2){ maxDay=28+ (y%4==0 && y%100!=0 || y%400==0); /*if((y%4==0 && y%100!=0)||y%400==0) maxDay = 29; else maxDay = 28;*/ } printf("%d\n",maxDay); return 0; }
注:
a> if/else 只会执行一个分支,因此,如果第一个分支满足条件了,不再执行后面的分支。-> 如果执行到了第n个分支,前面n-1个分支一定不成立。
b> 有else的分支语句必选其一执行,没有else的分支语句可选其一执行。
c> 如果分支内部只有一条语句,{}可以省略。一般执行:break/continue/return 语句时,{}通常省略。
d> 流程控制语句 需要 注意临界点的处理。
e> 经常 用于 处理 业务的需求。
#include <stdio.h> /* 使用if语句来判断输入输入 某年某月 有几天 */ int main() { printf("请输入年月\n"); int y,m,maxDay=31; scanf("%d%d",&y,&m); if(m<1 || m>12){ printf("输入非法\n"); return -1; } if(m==4||m==6||m==9||m==11){ maxDay = 30; } else if(m==2){ maxDay=28+ (y%4==0 && y%100!=0 || y%400==0); /*if((y%4==0 && y%100!=0)||y%400==0) maxDay = 29; else maxDay = 28;*/ } printf("%d\n",maxDay); return 0; }
2> switch/case
格式:
switch(控制表达式){
case 常量表达式 :语句; break;
…
default: 语句;
}
控制表达式被当做整数处理,可以是字符,不能是浮点数或字符串
常量表达式必须是常量,如: 3 ‘A’ 2+5
语句 可以是 零到多条
不允许重复分支(值不能相同)
default不一定在最后(但一般都在最后)
switch的执行机制,语句只有遇到break或者结束才能退出,否则会一直向下执行下去。
switch(a){ case 1: printf("1\n"); break; case 2: printf("2\n"); break; case 3: printf("3\n"); break; default: printf("d\n"); }
2. 循环语句
1> for循环
循环语句 用于 反复执行某段代码,直到满足某些条件(退出条件而非循环条件)后退出。
for 循环的语法结构:
for(循环变量的初始化1;循环条件2;步进语句3){
需要反复执行的代码段 //循环体4
}
int i; for(i=0;i<10;i++){ printf("%d\n",i); }
如果退出条件永远不能满足,叫 死循环(无限循环),ctrl+c可以退出死循环。
无限循环最简单写法: for(;;){ }
在C99中,支持:for(int i=0;i<10;i++){ },但是编译时要使用std=c99
#include <stdio.h> /* 练习:计算某班学生的总分、平均分和最高分。 分数需要输入,无需保存分数。 人数的问题: 1 先输入人数,在输入分数。(用这个) 2 可以用 -1 做退出的条件。 */ int main() { int sum=0,max=0x80000000;//表示最小的int型整数1000...0000 double avg; int i,num=0; /*printf("请输入人数\n"); scanf("%d",&num); if(num<1){ printf("非法人数\n"); return -1; } for(i=0;i<num;i++){ int temp; scanf("%d",&temp); sum = sum+temp; if(max<temp) max = temp; }*///次数在循环前确定 for(;;){//循环次数不能确定,输入-1表示输入结束 int temp; scanf("%d",&temp); if(temp == -1) break;//退出循环 sum = sum+temp; if(max<temp) max = temp; num++; } printf("sum=%d,avg=%lf,max=%d\n", sum,1.0*sum/num,max); return 0; }
break 可以退出 循环/switch,退出函数用return。
循环可以分为:次数确定、次数不确定、无限循环。
次数确定的: int i; for(i=0;i<num;i++){...}
次数不确定: for(;;){...if(条件) break; ...}
无限循环: for(;;){...}
循环中经常嵌套另外的循环,叫多重循环,最常用的是二重循环
二重循环的难点在于内层循环次数的控制,具体公式如下:
i如果递增1,那么
j< m*i + n ;j++
m 是 内层循环递增的次数,如果递减取负数
n 是 内层循环第一次循环的次数
前提:i和j的初始值保持一致,最好都为0。
#include <stdio.h> /* 使用双重for循环打印 * *** ***** ******* ********* */ int main() { int i,j;//i控制行,j控制列 for(i=0;i<5;i++){ for(j=0;j<2*i+1;j++){ printf("*"); } printf("\n"); } return 0; }
#include <stdio.h> /* 使用双重for循环 打印9*9乘法表 j*i 1*1=1 1*2=2 2*2=4 ...... */ int main() { int i,j; for(i=1;i<10;i++){ for(j=1;j<i+1;j++){ printf("%d*%d=%d ",j,i,j*i); } printf("\n"); } return 0; }
2> while循环
while循环和for循环 除了语法不同,其他都可以互通。
语法:
循环变量的声明和初始化;
while(条件){
循环体;
步进语句;
}
#include <stdio.h> int main() { int sum=0; while(1){ int temp; printf("请输入数字(0退出)\n"); scanf("%d",&temp); if(temp == 0) break; sum += temp; } printf("sum = %d\n",sum); return 0; }
int i=0; while(i<10){ printf("%d\n",i); i++; }
while(1){} // 死循环
3> do-while循环
do while循环
语法:
循环变量的声明和初始化;
do{
循环体;
步进语句;
}while(条件);
do-while 循环 先do 后判断条件,所以 至少执行一次。
int i=10,j=10; do{ printf("%d\n",i); i++; }while(i<10); while(j<10){ printf("%d\n",j); j++; } // 当i,j 初始 不满足条件时,do循环打印i,while不打印j。 // 当i,j 初始 满足条件时,无区别。 // 很多情况下,do循环和while(1){ ...if() break; }可以互通。
#include <stdio.h> /* 使用do-while来计算输入数字的位数 注意:do-while();分号结束 */ int main() { int num,count=0; printf("请输入一个整数\n"); scanf("%d",&num); do{ num = num/10; count++; if(num==0) break; }while(1/*num!=0*/); printf("%d\n",count); return 0; }
注:
break和continue
continue用于循环内部,结束本次循环,继续下一次循环,如果下一次循环条件不成立,也会退出。
break 用于循环内部,中断所有循环,结束整个循环(如果是嵌套循环,break只是退出本层循环)。