Loading... # 三、选择循环 # 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所示。   下面来看一个判断输入值是否大于0的例子。 ```c #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 语句的嵌套  ```c 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 语句? ```c 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语句包含在一个单独的代码块内, 如下所示。 ```c 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语句只有一句, 也会用花括号括起来, 这么做是因为一个程序往往会经过多次修改, 使用花括号可以让程序更加清晰, 避免向循环内添加语句时出错。 例计算1-100整数和 ```c #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循环语句。其一般形式为 ```c for(表达式1;表达式2;表达式3) 语句; ``` 1. 先求解表达式1。 2. 求解表达式2, 若其值为真 (值为非0) , 则先执行 for语句中指定的内嵌语句, 后执行第(3) 步。若其值为假 (值为0) , 则结束循环, 转到第 (5) 步。 3. 求解表达式3。 4. 转回第 2步继续执行。 5. 循环结束, 执行for语句下面的语句。  for循环语句中**必须且只能有两个分号**, 用于分割表达式1、表达式2 和表达式3。表达式1、表达式2、表达式3可以省略, 表达式1可以使用逗号初始化多个变量,表达式3的作用是使表达式2趋近于假。for循环可读性好。 计算1到100之间的所有整数之和 ```c #include <stdio.h> int main (){ int i,total=0; for (i=1;i<=100;i++)//加分号不会死循环结果会不对 { total+=i; } printf("%d",total); } ``` ## 4.continue语句 continue语句的作用为结束本次循环, 即跳过循环体中下面尚未执行的语句, 接着进行是否执行下一次循环的判断。其一般形式为 ```c continue; ``` 1到100之间的奇数进行求和 ```c #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 循环中, 起结束对应循环的作用。 ```c #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 ```c #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张,且每种票子**至少一张**。问:有几种换法? ```c #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; } ``` End 本文作者: 彼岸花露 文章标题:三、选择循环(C语言) 本文地址:https://blog.tianlei.work/archives/108/ 版权说明:若无注明,本文皆悟思记原创,转载请保留文章出处。 最后修改:2024 年 04 月 12 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏
1 条评论
审核测试