分支结构
1、简单if
基本结构
if (表达式) { 如果表达式为真,则执行语句,否则跳过不执行
执行语句;
}
e.g
int result = 100;
if (result == 100) {
printf("考试成绩满分");
}
2、if-else
基本结构
if (表达式) { //如果表达式为真,执行语句1,否则执行语句2
执行语句1;
} else {
执行语句2;
}
e.g
int result = 69;
if (result >= 60) {
printf("成绩及格");
} else {
printf("成绩不及格");
}
3、多重嵌套if-else
基本结构
//多重
if (表达式) { //直到满足表达式为真,执行对应语句
执行语句1;
} else if (表达式2) {
执行语句2;
} .... else {
执行语句n;
}
//嵌套
基本结构
if (表达式1) {
if (表达式2) { //满足表达式1为真,并且满足表达式2为真,执行语句1
执行语句1;
} else { //满足表达式1为真,并且不满足表达式2为真,执行语句2
执行语句2;
}
} else {
执行语句3;
}
int result = 69;
if (result >= 90) {
if (result > 95) { //嵌套,这里也可以直接写成多重,但在有些情况下嵌套能更好的表述问题。
printf("成绩:A+");
} else {
printf("成绩:A");
}
} else if (result >= 80) {
printf("成绩:B");
} else if (result >= 70) {
printf("成绩:C");
} else if (result >= 60) {
printf("成绩:D");
} else {
printf("成绩:E");
}
4、switch分支
switch
用于多分支选择。
一般表达式
switch (表达式) {
case 常量表达式1:
执行代码块1
break;
case 常量表达式2:
执行代码块2
break;
......
default:
break;
}
switch
后面括号里的表达式将被逐个与常量表达式进行比较,如果表达式与常量表达式的值相等,对应该常量表达式后面的语句将被执行。
break
语句表示某个case
语句结束,同时switch语句执行也将中止。每个case
的最后要加上break,否则程序就会转到后面的case
中。
如果表达式和任何一个常量表达式都不相同,那么程序将执行default
语句。
switch
语句可以理解为多重的if-else
语句。
成绩分级
int result = 69;
result = result / 10;
switch (result) {
case 10:
case 9:
printf("成绩:A");
break;
case 8:
printf("成绩:B");
break;
case 7:
printf("成绩:C");
break;
case 6:
printf("成绩:D");
break;
default:
printf("成绩:E");
break;
}
printf("\n");
打印结果:
成绩:D
循环结构
1、for循环
一般表达式
for (初始化表达式; 循环条件; 循环表达式) { //只要循环条件为真,就一直执行
执行代码块;
}
初始表达式,对循环变量做初始化;
循环条件,结果为真执行循环体,结果为假,跳出循环;
循环表达式,改变循环变量
e.g 计算10以内所有整数和
// 定义变量sum, num
int sum, num;
sum = 0;
for(num = 0; num <= 10; num ++ ) //for循环条件与num的变化值
{
sum += num ; //计算每次数字之间的和sum
}
printf("10以内数的和为:%d\n", sum);
e.g 打印所有水仙花数 (所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数,如:153就是一个水仙花数,153=1*1*1+5*5*5+3*3*3。)
//定义三位数num,个位数sd,十位数td,百位数hd
int num, sd, td, hd;
//循环所有三位数
for(num = 100 ; num < 1000 ; num ++)
{
//获取三位数字num百位上的数字
hd = num/100;
//获取三位数字num十位上的数字
td = num/10 % 10;
//获取三位数字num个位上的数字
sd = num % 10;
//水仙花数的条件是什么?
if( num == hd * hd * hd + td * td * td + sd * sd * sd)
{
printf("水仙花数字:%d\n", num);
}
}
for循环一般用于指定次数的循环
2、while循环
一般形式
while (循环条件) { //只要循环条件为真,就一直执行。所以要在循环体中改变循环变量的值,否则会出现死循环
执行代码块;
}
通过while循环计算任意两个整数的最大公约数。这个算法是阿基米德在大约公元前300年发现的,算法描述如下:
问题:找出两个非负整数u和v的最大公约数
第一步:如果v等于0,那么u就是最大公约数
第二步:执行下面表达算式:temp = u%v,u=v,v=temp,然后执行第一步
这里不研究这个算法能否正确工作,只是通过程序实现这个算法:
e.g (C语言编程)
int u,v,temp;
printf("Please type in tow nonnegative integers.\n");
scanf("%i%i",&u,&v);
while (v != 0) {
temp = u % v;
u = v;
v = temp;
}
printf("Their greaterst common divisor is %i\n",u);
输出结果:
Please type in tow nonnegative integers.
12 45
Their greaterst common divisor is 3
while 语句一般用于知道结束条件,但是循环次数不确定的情况。
3、do-while循环
for和while循环语句,在执行循环体之前,都会检测特定循环条件,因此如果一开始就不满足循环条件,循环体会一次也不执行。 有些时候,我们需要在循环体结束的时候,而不是在循环开始的地方检验循环条件,因此有了do-while
循环。
一般表达式
do { //先至少执行一次代码块,再验证表达式是否为真,如果为真继续下一次循环,如果为假则跳出循环。
执行代码块;
} while (循环表达式)
e.g 倒序打印输入的数字 (C语言编程)
int number ,right_digit;
printf("enter your number: \n");
scanf("%i",&number);
do {
right_digit = number % 10;
printf("%d",right_digit);
number /= 10;
} while (number != 0);
printf("\n");
打印结果:
enter your number:
13457
75431
4、多重循环
多重循环,即循环嵌套。
在执行过程中,外层循环为父循环,内层为自循环。父循环一次,自循环需要全部执行完,知道跳出循环。父循环再进入下一次,子循环继续执行...
一个父循环可以有多个自循环。
打印 :
*
***
*****
*******
int i, j, k;
for(i=1; i<5; i++)
{
/* 观察每行的空格数量,补全循环条件 */
for(j = i ; j < 5 ; j++ )
{
printf(" "); //输出空格
}
/* 观察每行*号的数量,补全循环条件 */
for( k = 0 ; k < i * 2 - 1; k ++ )
{
printf("*"); //每行输出的*号
}
printf("\n"); //每次循环换行
}
倒打乘法表,正打乘法表
int i,j,result;
for (i=9; i > 0; i--) {
for (j = 1; j <= i; j++) {
result = j * i;
printf("%d*%d=%2d ",i,j,result);
}
printf("\n");
}
for (i = 1; i <= 9; i ++) {
for (j = 1; j <= i; j ++) {
result = i * j;
printf("%d*%d=%2d ",j,i,result);
}
printf("\n");
}
打印结果:
9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
7*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25
4*1= 4 4*2= 8 4*3=12 4*4=16
3*1= 3 3*2= 6 3*3= 9
2*1= 2 2*2= 4
1*1= 1
1*1= 1
1*2= 2 2*2= 4
1*3= 3 2*3= 6 3*3= 9
1*4= 4 2*4= 8 3*4=12 4*4=16
1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25
1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8= 8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
break 语句
在某些情况下,需要在某个条件成立的时候(非循环条件)立刻退出循环,这个时候需要break语句。
使用break;
可以使程序退成正在执行的循环,直接中止当前循环,break后的语句直接跳过,程序接着循环后面的语句开始执行。
在多层循环中,一个break语句只能跳出当前循环。
查找0-50之间的所有素数:
tips:素数就是只能被1和它本身整除的数
int n ,m;
for (m = 2; m <= 50; m++) {
for (n = 2; n < m; n++) { //遍历1-m判断是否有能被其整除的数,如果有跳出循环。
if (m%n == 0) {
break;
}
}
if (m == n) { //两种情况,自循环break跳出,m != n,说明其有可整除的数,不是素数;子循环结束,1-m没有其能整除的数,是素数。
printf("%d ",m);
}
}
continue 语句
continue语句,结束本次循环并开始执行下一次循环。
当程序执行到continue语句时,该语句后面的所有语句都被跳过,循环其他部分照常执行。
打印20以内能被3整除的数
for (int i = 0; i < 20; i ++) {
if (i % 3 != 0) {
continue;
}
printf("%d",i);
}
打印结果:
0 3 6 9 12 15 18