ACM金牌带你零基础直达C语言精通-课程资料
本笔记属于船说系列课程之一,课程链接:ACM金牌带你零基础直达C语言精通
你也可以选择购买『船说系列课程-年度会员』产品『船票』,畅享一年内无限制学习已上线的所有船说系列课程:船票购买入口
一.条件表达式
什么是条件表达式,由关系运算符组成的表达式就叫做条件表达式;
C语言关系运算符
代码演示:
int main() { int a, b; scanf("%d%d", &a, &b); //输出每个条件表达式对应的整形值 printf("a == b (%d)\n", a == b); printf("a != b (%d)\n", a != b); printf("a < b (%d)\n", a < b); printf("a > b (%d)\n", a > b); printf("a <= b (%d)\n", a <= b); printf("a >= b (%d)\n", a >= b); printf("!(a == b) (%d)\n", !(a == b)); printf("a = %d\n", a); //看关系表达式对应整形值是否可以参与运算 a += (a == b); printf("a = %d\n", a); //实践判断逻辑与和逻辑或的判断逻辑 printf("a < b && a == 3 (%d)\n", a < b && a == 3); printf("a < b || a == 3 (%d)\n", a < b || a == 3); printf("1 && 1 (%d)\n", 1 && 1); printf("1 && 0 (%d)\n", 1 && 0); printf("0 && 1 (%d)\n", 0 && 1); printf("0 && 0 (%d)\n", 0 && 0); printf("1 || 1 (%d)\n", 1 || 1); printf("1 || 0 (%d)\n", 1 || 0); printf("0 || 1 (%d)\n", 0 || 1); printf("0 || 0 (%d)\n", 0 || 0); return 0; }
最终结果:
练习:
要求不能使用分支结构
代码实现:
#include<stdio.h> int main() { int a, b; scanf("%d%d", &a, &b); //这里需要用到printf函数的返回值 //printf返回值是输出了多少个字符 //而这里printf 输出了4个字符 Y E S \n,所以返回值为4 //那么就可以看为 a < b && 4, 而非0及真所以后半部分为真 //a < b如果成立就会输出YES //不成立就不会输出 //因为逻辑与如果前面的条件表达式不成立那么,他就不会再去执行后面的代码了 a < b && printf("YES\n"); //这里的逻辑和上面相同 !(a < b) && printf("NO\n"); return 0; }
结果展示:
二.分支结构
if-else 语句
还有一种格式,就是没有{},
#include <stdio.h> int main() { int a, b; scanf("%d%d", &a, &b); //这种形式只会执行if()后面的一条语句,记住是一条 if (a < b) printf("YES\n"); //同理else 也是 else printf("NO\n"); return 0; }
练习:
代码实现:
#include<stdio.h> int main() { int n; scanf("%d", &n); if (n == 0) { printf("HEHE"); } else if (n > 0 && n < 60) { printf("FAIL"); } else if (n >= 60 && n < 75) { printf("MEDIUM"); } else if (n >= 75 && n <= 100) { printf("GOOD"); } printf("\n"); return 0; }
最终结果:
switch 语句:
a为一个表达式,
然后如果表达式的值
如果等于v1 执行代码块1,然后依次执行代码块2,代码块3;
如果等于v2, 然后执行代码块2, 代码块3;
如果等于v3, 执行代码块3;
然后如果在case v3下面可能还有一条语句:
default : 代码块4
这条语句的作用就是,如果上面的v1,v2,v3都不等于,就执行代码块4;
对于break的使用在下面代码中来看;
代码演示:
#include<stdio.h> int main() { int a; scanf("%d", &a); switch (a) { //break的作用,如果a = 1,那么就会进入case 1, 执行case 1中的代码段 //如果没有break,那么执行完case 1中的语句,会接着执行case 2中的语句 //直到switch 结构末尾才结束 //那么break的作用就是在相应位置结束switch语句,不在往下执行 case 1: printf("case a = 1\n"); break; case 2: printf("case a = 2\n"); break; case 3: printf("case a = 3\n"); break; case 4: printf("case a = 4\n"); break; default : printf("default value\n"); break; } return 0; }
最终效果:
while 语句
while语句执行流程
代码演示:
int main() { //读入一个n,输出1-n int n; scanf("%d", &n); //第一种 实现方式 int i = 0; while (i < n) { i += 1;//同理代码 i = i + 1; printf("i = %d\n", i); } //第二种 printf("-----------------\n");//分界线 i = 1; while (i <= n) { //i++,这个代码的意思就是,先用i的值,然后在对i进行+1操作 //就比如现在 i为1,然后输出i = 1, 现在在对i进行+1操作,i就为2了 printf("i = %d\n", i++); } i = 0; //第三种 printf("-----------------\n");//分界线 while (i < n) { //++i,这个代码的意思就是,先对i进行+1操作,然后在用i的值 //比如现在i为0,先对i进行+1操作,现在i = 1,然后在使用i,也就是输出i = 1; printf("i = %d\n", ++i); } printf("-----------------\n");//分界线 i = 1; //第四种 //这种会有一个bug,当n为0的时候应该不会输出,但是他要执行一次 //这就是 while 和 do_while 的区别 //do_while 不管表达式成不成立都会先执行一次 do { printf("i = %d\n", i++); } while (i <= n); return 0; }
最终结果:
BUG结果:
这里就是do_while语句执行了一次
技巧,如何通过while循环读入
#include<stdio.h> int main() { int x; //利用scanf的返回值,scanf的返回值是成功读入了多少个参数 //而EOF对应整形值是-1,EOF也称文件结束符 //scanf读到文件末尾时,就会返回-1 //就会结束循环 while (scanf("%d", &x) != EOF) { printf("2 * x = %d\n", x * 2); } return 0; }
最终结果:
如何结束循环读入 ctrl + c
for 语句
循环执行流程:
代码演示:
#include<stdio.h> int main() { //实现打印1-n; int n, i; scanf("%d", &n); for (i = 1; i <= n; i++) { printf("%d ", i); } printf("\n---------------\n"); //条件可以为空,三个条件都可以为空,但是需要注意避免死循环 for (i = 1; ; i++) { //遇见break 就会跳出循环 if (i > n) break; printf("%d ", i); } printf("\n---------------\n"); //只输出单数 for (i = 1; i <= n; i++) { if (i % 2 == 0) continue; printf("i = %d\n", i); } printf("\n"); return 0; }
最终结果:
goto语句
goto语句使用代码演示:
#include <stdio.h> int main() { goto lab_1;//执行完后直接跳转到lab_1: printf("hello world\n"); lab_1 ://上面的printf不会被执行,直接被跳过,直接执行下面的代码 printf("hello hangzhou\n"); goto lab_2;//同理跳转到lab_2: int a = 0, b = 0; scanf("%d%d", &a, &b); lab_2 ://这里可以使用变量a,b但是上面的赋值是无效的 printf("%d\n", a * b); return 0; }
代码执行结果:
可以看到a * b 的结果不是0,而是一个陌生的值,而且也没有利用scanf输入a和b的值
goto 语句模拟if-else 语句
#include <stdio.h> int main() { //判断n是偶数,还是基数 int n; scanf("%d", &n); //{}里可以放多条表达式,而小括号的作用就是将大括号里的内容变为具有返回值的表达式 //而返回值的是多少,就是最后一条表达式的值 //这里括号里面的返回值是最后表达式的值,那么就是1 //通过逻辑与的判断,只要前面的语句为真就会执行后面的语句 //因为后面的语句为1,所以一定为真 //然后通过goto语句直接跳转,从而模拟了if_else 语句 n % 2 == 0 && ({ goto if_stmt; 1; }); !(n % 2) == 0 && ({ goto else_stmt; 1;}); if_stmt: printf("%d is even\n", n); goto if_end; else_stmt: printf("%d is odd\n", n); if_end: return 0; }
执行结果:
goto 语句模拟switch 语句
#include <stdio.h> int main() { //输入数字1-3,然后输出对应的英文 int n; scanf("%d", &n); //和if—else 语句同样的实现方法 n == 1 && ({goto lab_1; 1; }); n == 2 && ({goto lab_2; 1; }); n == 3 && ({goto lab_3; 1; }); //error 就相当于default的作用 goto error; lab_1: printf("One\n"); //这里为什么要goto end //如果没有goto end,就会往下继续执行 lab_2 //所以需要跳转到结束 goto end; lab_2: printf("Two\n"); goto end; lab_3: printf("Tree\n"); goto end; error: printf("input error\n"); end: return 0; }
执行结果:
goto 语句模拟while 语句
可以回顾一下while语句的执行流程
#include <stdio.h> int main() { //代码要求,输出1-n的值 int n, i = 1; scanf("%d", &n); judge: //这里判断i是否小于等于n, 如果满足那就继续执行 if (i <= n) goto lab_1;//循环判断条件 //不满足就跳出循环 else goto while_end;//这里就是结束循环 lab_1: //这里需要i++,不然会死循环一直输出1 //也可以不用i++,在下面使用i += 1; printf("%d ", i++); //这个位置使用i += 1; goto judge;//这里judge的作用就是返回到判断条件除 while_end: printf("\n"); return 0; }
最终执行结果:
goto 语句模拟for 语句
可以先回顾上面的for语句执行流程
代码演示:#include<stdio.h> int main() { //输出1-n int n; scanf("%d", &n); int i; //初始化 for_1: i = 1; goto for_2; for_2: if (i <= n) goto for_4;//为真执行代码块 else goto for_end;//为假循环结束 //执行后操作 for_3: i += 1;//或者i++; goto for_2; //回到条件判断 //执行代码块 for_4: printf("%d ", i); goto for_3; //循环结束 for_end: printf("\n"); return 0; }
代码执行结果:
C语言中的[一条语句]
代码解释:
#include<stdio.h> int main() { //1为真所以一定会执行if后面的代码段 //{}中的代码就是一条语句,也就是复合语句 if (1) { printf("hello\n"); printf("ni hao\n"); } //while后面控制一条语句也就是if语句 //然后if后面控制复合语句 //所以这里if语句会执行55次 int n = 5; while (n--) if(1) { printf("hello\n"); printf("666\n"); } //循环1后面的语句就是循环1和代码段2组成的复合语句 //循环1开始后,先执行循环2,循环2开始执行然后执行代码段1 //循环2结束后,执行代码段20 //然后又返回到循环1,直到循环1结束 for (int i = 1; i <= 3; i++) {//循环1 for (int j = 1; j <= 3; j++) {//循环2 printf("(%d, %d), ", i, j);//代码段1 } //代码段2 printf("\n"); } return 0; }
代码运行结果:
本章小结:
本章学习了控制流,掌握了对代码执行流程的改变;学习了这么多新的语句,在学习过后一定要实际的去用新学的语句进行写代码,做题,加深对新知识的理解和记忆,以及加快打代码的速度。
最后加油,看到这里你已经超过百分之95的人了。