三、选择循环

三、选择循环

1.if -else语句

程序员控制程序执行逻辑运算需要选择和循环结构,

算术运算符的优先级高于关系运算符、关系运算符的优先级高于逻辑与和逻辑或运算符、相同优先级的运算符从左至右进行结合等, 那么表达式5>3&&8<4-!0的最终值是多少? 其计算过程如下图所示。

  1. 5>3逻辑值为1
  2. !0逻辑值1
  3. 4-1=3
  4. 8<3逻辑值0
  5. 1&&0逻辑值为0

if判断条件(表达式) 为真, 就执行某个语句, 反之不执行这个语句。也可以if判断条件(表达式) 为真, 就执行某个语句, 反之用else分支执行另一个语句, 具体流程如下图1和图2所示。

if语句流程1

if语句流程2

下面来看一个判断输入值是否大于0的例子。

#include <stdio.h>

//练习if与else
int main() {
    int i;
    while(scanf("%d",&i))
    {
        if(i>0)//if下面加一个大括号
        {
            printf("i is bigger than 0\n");
        }else{
            printf("i is not bigger than 0\n");
        }
    }

    return 0;
}

当输入值大于0时,打印“i is bigger than 0”,当输入值小于等于0时,打印“i is not biggerthan 0”, 注意, 在这个例子中, if后面不能加分号, 因为如果有 else 分支语句, 那么加分号会导致编译不通过;如果没有 else分支语句, 那么加分号会导致i无论取何值, 都会打印“i is bigger than 0”。

if语句和else 语句也可以多个同时使用(多分支语句) , 如下图 3 所示,但是, 无论有多少个if 语句或else if 语句, 程序都只会执行其中的一个语句,下面是一个关于用电量的例子:用电量越高,电的单价越高, 但最终 cost 只会被赋值一次, 同时, if语句也支持多层嵌套, 在if 语句中又包含一个或多个if语句称为if 语句的嵌套

多分支语句与if嵌套

if (number>500) cost=0.15;
    else if(number>300) cost=0.10;
        else if(number>100) cost=0.075;
            else if(number>50) cost=0.05;
                else cost=0;

使用if 嵌套语句时,要考虑“悬空的else”问题。例如, 在下面的例子中, else子句从属于哪个 if 语句?

if(i>1)
    if(i<10)
        printf("i>1 and i<10\n");
    else
        printf("no, they are not\n");

和其他绝大多数语言一样, C语言中的else子句从属于最靠近它的不完整的if语句。上例中的else子句从属于第二个if语句, 如果想让它从属于第一个 if语句, 那么可以用一个花括号把第二个 if语句包含在一个单独的代码块内, 如下所示。

if(i>1){
    if(i<10)
        printf("i>1 and i<10\n");
}
else
    printf("no, they are not\n");

在 if语句中的语句列表前后加上花括号, 可以防止不小心加了一句代码后, 使实际未被包含的语句被包含在某个if语句中的错误。

2.while循环

当型”循环结构,一般形式为“while(表达式) 语句;”, 当表达式的值非0时, 执行while语句中的内嵌语句。其特点是: 先判断表达式, 后执行语句。当表达式的值非0时, 就会执行语句, 从而实现语句多次执行的效果。为了避免程序进入死循环(不停地进行循环操作) , 在语句中需要有让表达式趋近于假的操作来使程序跳出循环。

while循环流程

while后面不能加分号, 否则虽然编译可以通过, 但是执行程序时会发生死循环。通常会将 while语句用花括号括起来, 就算while语句只有一句, 也会用花括号括起来, 这么做是因为一个程序往往会经过多次修改, 使用花括号可以让程序更加清晰, 避免向循环内添加语句时出错。

例计算1-100整数和

#include <stdio.h>
// while
int main (){
    int i =1;
    int sum=0;
    while (i<=100)//加分号死循环
    {
        sum+=i;//没有趋近于假的操作也会死循环
        i++;//i=i+1 i+=1
    }
    printf("%d",sum);

}

3.for循环

C语言中的for循环语句使用最为灵活, 不仅可以用于循环次数已经确定的情况, 而且可以用于循环次数不确定而只给出循环结束条件的情况, 它完全可以代替while循环语句。其一般形式为

for(表达式1;表达式2;表达式3) 语句;
  1. 先求解表达式1。

  2. 求解表达式2, 若其值为真 (值为非0) , 则先执行 for语句中指定的内嵌语句, 后执行第(3) 步。若其值为假 (值为0) , 则结束循环, 转到第 (5) 步。

  3. 求解表达式3。

  4. 转回第 2步继续执行。

  5. 循环结束, 执行for语句下面的语句。

    fou循环语句流程

for循环语句中必须且只能有两个分号, 用于分割表达式1、表达式2 和表达式3。表达式1、表达式2、表达式3可以省略, 表达式1可以使用逗号初始化多个变量,表达式3的作用是使表达式2趋近于假。for循环可读性好。

计算1到100之间的所有整数之和

#include <stdio.h>
int main (){
    int i,total=0;
    for (i=1;i<=100;i++)//加分号不会死循环结果会不对
    {
        total+=i;
    }
    printf("%d",total);
}

4.continue语句

continue语句的作用为结束本次循环, 即跳过循环体中下面尚未执行的语句, 接着进行是否执行下一次循环的判断。其一般形式为

continue;

1到100之间的奇数进行求和

#include <stdio.h>
int main (){
    int i,total;
    for (i=1,total=0;i<=100;i++)
    {
        if(i%2==0)
        {
            continue;//continue下面代码都不会执行
        }
        total+=i;
    }
    printf("%d",total);
    return 0;
}

用于while和 do while 循环中时,注意不要跳过让循环趋近于假的语句。

5.break语句

break语句的作用是结束整个循环过程, 不再判断执行循环的条件是否成立。

例子从1开始累加, 当累加的和大于 2000时, 结束 for循环, 同时打印此时 total的 值 和 i 的 值 。 一 旦 执 行 break语 句 , 下 一 句 要 执 行 的 就 是“printf(“total=%d,i=%d\n”, total,i);”。break语句也可用在 while 循环和 do while 循环中, 起结束对应循环的作用。

#include <stdio.h>
int main (){
    int i,total;
    for(i=1,total=0;i<=100;i++)
    {
        if(total>2000)
        {
            break;
        }
        total+=i;
    }
    printf("%d %d\n",total,i);
    return 0;
}

6.列题

6.1 判断是否是对称数

输入一个整型数,判断是否是对称数,如果是,输出yes,否则输出no,不用考虑这个整型数过大,int类型存不下,不用考虑负值;

例如 12321是对称数,输出yes,124421是对称数,输出yes,1231不是对称数,输出no

#include <stdio.h>
int main(){
    int i,a=0,b=0,c=0;
    scanf("%d",&i);
    b=i;
    while(i)
    {
        c=i%10;
        i=i/10;
        a=a*10;
        a+=c;
    }
    if (a==b)
    {
        printf("yes\n");
    }else
    {
        printf("no\n");
    }
      
}

6.2 100元换零钱

某人想将手中的一张面值100元的人民币换成10元、5元、2元和1元面值的票子。要求换正好40张,且每种票子至少一张。问:有几种换法?

#include <stdio.h>
int main(){
    int w,x,y,z;
    int n=0;
    for(w=1;w<10;w++)
    {
        for(x=1;x<20;x++)
        {
            for(y=1;y<37;y++)
            {
                for(z=1;z<37;z++){
                    if (w*10+x*5+y*2+z==100&&x+y+z+w==40)
                    {
                        n++;
                    }
                }
            }
        }
    }
    printf("%d",n);
    return 0;
}