4.1关系表达式与逻辑表达式
- 算术运算符的优先级高于关系运算符
- 关系运算符的优先级高于逻辑与 和 逻辑或运算符
- 相同优先级的运算符从左到右进行结合
【例】
表达式 5 > 3 && 8 < 4 - !0 的最终值为多少
4.2 if-else语句
4.2.1 if-else单分支语句
- if判断条件(表达式)为真,就执行某个语句,反之不执行这个语句
- if判断条件(表达式)为真,就执行某个语句,反之用else分支执行另一个语句
【if-else单分支例子:判断输入值是否大于0】
#include <stdio.h>int main() {//if-else单分支//判断输入值是否大于0int i;//用while循环是因为可以反复进行测试while (scanf("&d", &i)) {if (i > 0) {printf("i is bigger than 0\n");} else {printf("i is smaller than 0\n");}}return 0; }
4.2.2 if-else多分支语句
无论有多少个if语句或else if语句,程序都只会执行其中的一个语句
【if-else多分支例子:阶梯电费】
#include <stdio.h>int main() {//if-else多分支语句//阶梯电费int num; //用电几度while (scanf("%d", &num)) {if (num > 500) {printf("电费为0.15元/度\n");} else if (num > 300) {printf("电费为0.10元/度\n");} else if (num > 100) {printf("电费为0.075元/度\n");} else if (num > 50) {printf("电费为0.05元/度\n");} else {printf("电费为0元/度\n");}} }
【运行结果】
【小结】
注意多个if-else语句要加上 {} 括号
若没有加上 {} 括号,else子句从属于最靠近它的不完整if语句
4.3循环语句
4.3.1 while循环
- while语句用来实现“当型”循环结果,其一般形式为“while(表达式) 语句;”
- 当表达式的值非0时,执行while语句中的内嵌语句
- while循环特点:先判断表达式,后执行语句
- 为避免程序死循环,在语句中需要有让表达式趋近于假的操作来使程序跳出循环
【while循环实现计算1-100之间所有整数之和】
#include <stdio.h>//while循环 int main() {//计算1到100的和int i = 1, total = 0;while (i <= 100) { //若是在这里的while后加上分号会导致死循环total = total + i;//把i加到total上i++; //若是循环体内没有让while判断表达式趋近于假的操作会导致死循环}printf("total=%d\n", total);return 0; }
【运行结果】
4.3.2 for循环
for循环可用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while循环语句,其一般形式为
for(表达式1;表达式2;表达式3) 语句;
其中:
- 表达式1为循环变量初始化
- 表达式2为循环条件
- 表达式3为循环变量迭代
for循环执行过程如下:
(1)先求解表达式1
(2)求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,后执行第(3)步。若其值为假(为0),则结束循环,转第(5)步
(3)求解表达式3
(4)转回第(2)步继续执行
(5)循环结束,执行for语句下面的语句
【for循环实现计算1-100所有整数之和】
#include <stdio.h>//for循环 int main() {//计算i到100的和int i, total = 0;for (int i = 1; i <= 100; i++) {total += i;}printf("total=%d\n", total);return 0; }
【运行结果】
【小结】
- for循环语句中必须且只能有2个分号,用于分割表达式1,表达式2和表达式3
- 表达式1,表达式2和表达式3也可以省略,但省略写法用的较少
- 表达式1中可以用逗号初始化多个变量,如:i=1,total=0
- 表达式3的作用是使表达式2趋近于假
- for循环的可读性要比while循环好,能使用for循环时不要强制改为while循环
4.3.3 continue语句
continue语句作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行是否执行下一次循环的判断
continue;
【for循环中的continue语句】
#include <stdio.h>//for循环中的continue语句 int main() {//计算i到100之间奇数的和int i, total = 0;for (int i = 1; i <= 100; i++) {if (i % 2 == 0) {//如果为偶数则不加入totalcontinue;//continue下面的代码均不会得到执行}total += i;}printf("total=%d\n", total);return 0; }
【运行结果】
【while循环中的continue语句】
#include <stdio.h>//while循环中的continue语句 int main() {//计算1到100之间所有奇数的和int i = 1, total = 0;while (i <= 100) { //若是在这里的while后加上分号会导致死循环if (i % 2 == 0) {//如果为偶数则不加入totali++;//这里也需要i++,不然没有让循环结束的条件continue;//continue下面的代码均不会得到执行}total = total + i;//把i加到total上i++; //若是循环体内没有让while判断表达式趋近于假的操作会导致死循环}printf("total=%d\n", total);return 0; }
【运行结果】
4.3.4 break语句
- break语句的作用是结束整个循环过程,不再判断执行循环的条件是否成立。
- break语句也可以用在while循环和do while循环当中,起到结束对应循环的作用。
【break语句例子】
从1开始累加,累加的和大于2000时结束for循环,同时打印此时total和i的值
#include <stdio.h>int main() {int i, total;for (i = 1,total = 0; i <= 100; i++) {if (total > 2000) {break;//当和大于2000时,循环结束}total += i;}printf("total=%d,i=%d\n", total, i);//total=2016 i=64//i = 64并没有加入到total当中,所以2016其实是1加到63的总值return 0; }
【运行结果】
【小结】
- i=64并没有加入到total中,所以2016其实是1累加到63的总和
- 一旦执行break语句,下一句要执行的就是 printf("total=%d,i=%d\n", total, i);
4.4课时作业
-
课时4作业1
描述:输入一个整型数,判断是否为对称数,如果是,输出yes,否则输出no。不用考虑这个整型数过大,int类型存不下,不用考虑负值
输入:一个整型数
输出:输出yes或no
【课时4作业1代码】
#include <stdio.h>//逆置数的判断 //比如:12321 逆置后:12321 与原来数相等 int main() {int a;int b = 0, backup;backup = a;//备份后的变量scanf("%d", &a);//读取一个整型数backup = a;//备份awhile (a) {//a%10取出最后面一位数//b*10将原来的数*10b = b * 10 + a % 10;//b把原来的值乘10,然后再加上余数a = a / 10;}//printf("b=%d\n",b);//判断b和backup是否相等,相等即为对称数if (b == backup) {printf("yes\n");} else {printf("no\n");}return 0; }
【运行效果】
-
课时4作业2
描述:利用while 或 for循环计算n!的值
n!=1*2*3…*n
输入:一个正整数n (1<=n<=10)
输出:n!的值
【课时4作业2代码】
#include <stdio.h>//求n的阶乘 int main() {int n;scanf("%d", &n);//输入一个正整数nint i, result = 1;//i 为游标for (int i = 1; i <= n; i++) {result *= i;}printf("%d\n", result);return 0; }
【运行结果】
-
课时4作业3
描述:某人想将手中一张面值100元的人民币换成10元、5元、2元和1元面值的票子。要求正好40张,且每种票子至少一张,问:有几种换法
输入:无输入
输出:一个数,表示共有多少种换法
【课时4作业3代码】
#include <stdio.h>int main() {//a面值为10元,b面值为5元,c面值为2元,d面值为1元int a, b, c, d, count = 0;//count为换法for (int a = 1; a <= 10; a++) {for (int b = 1; b <= 20; b++) {for (int c = 1; c <= 40; c++) { //c<=37for (int d = 1; d <= 40; d++) { //d<=37if (a + b + c + d == 40 && 10 * a + 5 * b + 2 * c + d == 100) {count++;//换法加1}}}}}printf("count=%d\n", count);return 0; }
【运行效果】