Day4控制语句
分支结构:if()~else、switch
循环结构:for()、while()、do~while()、goto
辅助控制:contine、break、return
分支结构
1.if-else语句
1.1.一般形式:
if(表达式)
语句块1;
else
语句块2;
1.2.常见形式
1.2.1. 简化形式:if(表达式) 语句块 ;
例:if(x>y) printf(“%d”,x) ;
1.2.2. 阶梯形式:(命令行模式下输入gg=G美化代码)
if(表达式1) 语句块1;
else if(表达式2) 语句块2 ;
else if(表达式3) 语句块3 ;
……
else 语句块n ;
例:
if (!(score >= 0 && score <= 100))
printf("not in [0, 100]\n");
else if (score >= 90)
printf("A-excellent\n");
else if (score >= 70)
printf("B-good\n");
else if (score >= 60)
printf("C-OK\n");
else
printf("D-not pass\n");
注:
语句块:当有若干条语句时,必须用{……}括起来。
表达式:一般情况下为逻辑表达式或关系表达式(如:if(ab&&xy) printf(“a=b,x=y”);)也可以是任意类型(包括整型、实型、字符型、指针类型)(如:if(‘a’) printf(“%d”,’a’) ; )注意区分if(x=1)和if(x==1)是不同的。
1.2.3. 嵌套形式
if(表达式1)
if(表达式2) 语句块1 ;
else 语句块2 ;
else
if(表达式3) 语句块3 ;
else 语句块4 ;
注:
else总是与它上面的最近的if配对,与书写格式无关;要实行强行配对关系可以利用{……}。
1.3.示例
已知三角形三边a、b、c,海伦公式:p=(a+b+c)/2、S=√(p(p-a)(p-b)(p-c)),求S。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
float a, b, c;
float p;
float area;
printf("input a b c:");
scanf("%f%f%f", &a, &b, &c);
if ( a + b <= c || a + c <= b || b + c <= a) {
printf("invalid input--1\n");
return 0;
}
if (abs(a - b) >= c || abs(a - c) >= b || abs(b - c) >= a) {
printf("invalid input--2\n");
return 0;
}
p = (a + b + c) / 2;
area = sqrt(p * (p - a) * (p - b) * (p - c));
printf("%.2f, %.2f, %.2f--->%.2f\n", a, b, c, area);
return 0;
}
2.switch语句
2.1.switch语句的基本形式
switch (表达式)
{
case 常量表达式1 : 语句块1 ;break ;
case 常量表达式2 : 语句块2 ;break ;
……
case 常量表达式n : 语句块n ;break ;
default : 语句块n+1 ;
}
2.2.switch语句的使用
- 每个常量表达式的值必须各不相同,否则将会出现矛盾
- 当表达式的值与case后面的常量表达式值相等时,就执行此case后面的语句
- switch中的表达式可以是整型、字符型表达式或枚举
- case常量只起语句标号作用
- break语句用于强行跳出switch体,一般每个case后面应有一个break语句,default分支后的break可以省略
- 多个case可以执行一组语句
2.3. 示例
enum weekday
{sun,mon,tue, wed} a;
a = wed;
switch (a) {
case 1:
printf("1\n");
case 2:
printf("2\n");
case 3:
printf("3\n");
break;
default:
printf("not 1 2 3\n");
}
return 0;
循环语句
1.goto语句
例:
int i = 1 ; int num = 0 ‘
_loop :
if(i <= 100){
sum += i ;
i ++;
goto _loop ;
}
printf(“1+2+3+……+%d\n”,i.sum) ;
注:
goto语句集中于一处退出函数
当函数有很多个出口,使用goto语句把这些出口集中到一处是很方便的,特别是函数中有许多重复的清理工作的时候
优点:
- 无条件跳转易于理解;
- 可以减少嵌套;
- 可以避免那种忘记跟新某一个出口点的问题;
- 算是帮助编译器做了代码优化。
2.while语句
基本形式:
while(表达式){
语句块;
}
注意循环语句的使用:
- 循环变量初始化
- 循环终止条件
- 循环变量的变化
例:
int i = 1 ; int sum = 0 ;
while(i <= 100){
sum += i ;
i++ ;
}
printf(“1+2+3+ ……+%d\n”,i,sum) ;
先判断,后执行
3.do - while语句
基本形式:
do{
语句块 ;
}while(表达式) ;
先执行,后判断
4.程序举例
“水仙花数”是指一个三位数,其各个位数字立方之和等于它本身。
int n = 100;
int a, b, c;//bai shi ge 123
while (n <= 999) {
a = n / 100;
b = n / 10 % 10;
c = n % 10;
//if (a*a*a + b*b*b + c*c*c == n)
if (pow(a, 3) + pow(b, 3) + pow(c, 3) == n)
printf("%d\n", n);
n++;
}
5.for语句
一般形式:
for(表达式1;表达式2;表达式3){
语句块;
}
其中表达式1通常代表初始值,表达式2通常代表循环条件,表达式3通常代表结束语句。
执行过程:
① 先求解表达式1(设初值)
② 求解表达式2,若为真,则执行循环体(语句块),然后执行步骤3;若为假,则执行步骤5
③ 求解表达式3
④ 转回执行步骤2
⑤ 执行for下面的语句(跳出for循环)
例:
for( i = 1 ; i <= 100 ; i ++ ){
sum = sum + i ;
}
注:
① 表达式1可以省略,但循环之前应给循环变量赋值
② 表达式2可以省略,但将陷入死循环
③ 表达式3可以省略,但在循环体中增加使循环变量改变的语句
④ for括号内的“ ; ”不可省略
案例一:打印乘法表
int i, j;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= i ;j++)
printf("%d*%d=%d\t", j, i, i * j );
puts("");
}
案例二:利用循环打印以下图案:
F
_FE
__FED
___FEDC
____FEDCB
_____FEDCBA
int i, j;
char ch = 'F';
printf("please input char:");
scanf("%c", &ch);
for (i = 0; i <= ch - 'A' ; i++) {
for(j = 0; j < i; j++)
putchar('_');
for(j = 0; j <= i; j++)
putchar(ch-j);
putchar('\n');
}
辅助控制语句
1.break语句
用于从循环体内跳出循环体,即提前结束本层循环;break语句只能用于循环语句和switch语句中。
例:
for( r = 1 ; r <= 10 ; r ++ ){
area = pi * r *r ;
if( area > 100 ) break ;
printf(“%f”,area) ;
}
案例:判断素数
对于一个大于或等于3的正整数,判断它是不是一个素数
步骤:
① 输入整数n的值
② i = 2;
③ n被i除得余数r
④ 若r = 0,则打印“n不是素数”,算法结束;否则执行步骤5
⑤ i++
⑥ 若i <= √n ,返回步骤3;否则打印“n是素数”,算法结束。
int n, m;
int i;
printf(“input :”);
scanf("%d", &n);
i = 2;
m = sqrt(n);
while (i <= m) {
if (n % i == 0)
break;
i++;
}
if (i > m)
printf(“yes:%d\n”, n);
2.continue语句
结束本次循环,接着判定下一次是否执行循环;注意continue和break的区别:continue直接结束本次循环,而break终止本层循环。
例:
for( n = 100 ; n <= 200 ; n ++ ){
if( n % 3 == 0 ) continue ;
printf(“%d”,n) ;
}
案例:对判断素数的程序进行完善,若用户输入的不是整数重新输入。
int n, m;
int i;
int ch;
while (1) {
printf("input num(# exit):");
if (scanf("%d", &n) == 0) {
if ((ch = getchar()) == '#')
return 0;//break;
else {
printf("error:again!\n");
continue;
}
}
i = 2;
m = sqrt(n);
while (i <= m) {
if (n % i == 0)
break;
i++;
}
if (i > m)
printf("yes:%d\n", n);
else
printf("not:%d\n", n);
3.return语句
一般形式:return(<表达式>)
主要用于终止包含该return的函数的执行,若终止的为主函数,则主程序结束。