2021-09-14 Day4控制语句

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语句的使用

  1. 每个常量表达式的值必须各不相同,否则将会出现矛盾
  2. 当表达式的值与case后面的常量表达式值相等时,就执行此case后面的语句
  3. switch中的表达式可以是整型、字符型表达式或枚举
  4. case常量只起语句标号作用
  5. break语句用于强行跳出switch体,一般每个case后面应有一个break语句,default分支后的break可以省略
  6. 多个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语句把这些出口集中到一处是很方便的,特别是函数中有许多重复的清理工作的时候
优点:

  1. 无条件跳转易于理解;
  2. 可以减少嵌套;
  3. 可以避免那种忘记跟新某一个出口点的问题;
  4. 算是帮助编译器做了代码优化。

2.while语句
基本形式:

while(表达式){
	语句块;
}

注意循环语句的使用:

  1. 循环变量初始化
  2. 循环终止条件
  3. 循环变量的变化

例:

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的函数的执行,若终止的为主函数,则主程序结束。

上一篇:【Python每日作业】Day4:写一个函数统计传入的列表中每个数字出现的次数并返回对应的字典。


下一篇:Day4 Java基础