本文主要是介绍最最最详细的C语言教程笔记零起步(8)进阶必备 同笔者一起学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
C语言教程笔记
- 十七. 循环辅助
- 1. 有限循环的3个要素
- 2. 使用break打破循环
- 3. 验证密码
- 4. continue开始新一轮循环
- 5. for循环中使用循环辅助关键词
- 5.1 for循环中使用 continue
- 5.2 for循环中使用 break
- 6. break 和 continue 与循环嵌套
- 十八. 多重选择 switch的使用
- 1. 航空字母读法
- 2. 字符到航空字母单词转换
- 3. switch语句
- 4. break在switch语句中的作用
- 5. 连续转换程序
- 6. break和continue究竟属于谁
- 6.1 break属于谁
- 6.2 continue 属于谁
十七. 循环辅助
1. 有限循环的3个要素
- 开始时,为计数器设置初始值。
- 计数器与一个有限值比较作为循环条件。
- 更新计数器。
2. 使用break打破循环
要达到上述效果,我们可以修改while中的循环条件。但是,现在有了一个新选择。 可以将循环条件放置于while括号以外的地方,并配合上 break 关键词,也能达到同样的效果。
#include <stdio.h>int main() { int i = 0; while(1) { if (i == 10) { break; } printf("%d ", i); i++; } printf("\ni=%d ", i); return 0;
}
这下代码仅打印了出了0到9就退出循环了。while的循环条件依然始终为真,因此没法指望从while处跳 出循环。但是,我们把实际的循环条件放置到了 if 语句中。计数器 i 在0到9时,无法进入 if 内部。而 一旦 i 为10,进入 if 内部,执行了 break 语句,立即跳出了while循环。
break执行后,程序立刻从break处跳至循环结束。
break语句后的循环行为将均不执行。
让我们把if和break放到printf的后面。
#include <stdio.h>int main() { int i = 0; while(1) { printf("%d ", i); if (i == 10) { break; } i++; } printf("\ni=%d ", i); return 0;
}
这一次比上面多打印了数字10。i为10时,printf函数将先执行。而后遇到if语句,条件满足进入if语句。 break被执行,这才跳出循环。
最后把if和break放到循环的最后。
#include <stdio.h>int main() { int i = 0; while(1) { printf("%d ", i); i++; if (i == 10) { break; } } printf("\ni=%d ", i); return 0;
}
这一次的结果和第一次结果一致,输出了0到9。
当i的值为9被打印后,紧接着i自增为10,最后进入if执行break,跳出了循环
3. 验证密码
我们来做一个验证密码的程序,要求用户输入一个密码。如果密码不为12345,那么输出密码错误。如 果密码输入正确,则退出程序。
#include <stdio.h>int main() { int password; while(1) { scanf("%d", &password); if (password == 12345) { break; } printf("password error\n"); } printf("welcome back\n"); return 0;
}
将while循环替换为for循环也是等效的。
#include <stdio.h> int main() { int password; for(;;) { scanf("%d", &password); if (password == 12345) { break; } printf("password error\n"); } printf("welcome back\n"); return 0;
}
4. continue开始新一轮循环
continue语句会跳过本次循环的内容,并开始下一轮的循环。
#include <stdio.h> int main() { int i = 0; while(i < 20) { if (i == 6) { i = 15; continue; } printf("%d ", i); i++; } return 0; }
代码本将输出0到19之间的整数。但是,6到14被跳过了。
0到5被正常输出。当 i 为6时, if 条件满足, i 被赋值为15,接着执行 continue 。 continue 将跳过本次循环的内容,重新开始循环,这下从15开始继续循环直到19为止。
5. for循环中使用循环辅助关键词
5.1 for循环中使用 continue
当然,continue在for循环中也可以生效。
#include <stdio.h>int main() { for(int i = 0; i < 20; i++) { if (i == 6) { i = 15; continue; } printf("%d ", i); } return 0;
}
结果略有不同,while循环中使用continue后,将回到循环开始,即计算表达式 i < 20 的值。 对于for循环,由于for循环在每次循环结束后,将执行for语句括号内的第三个表达式,即计数器更新表 达式。所以,遇到continue后,先执行 i++ ,值被更新成了16。再开始新的一轮循环,计算表达 式 i < 20 的值。
5.2 for循环中使用 break
#include <stdio.h>int main() { int i = 0; for(i = 0; i < 20; i++) { if (i == 6) { break; } } printf("%d ", i); return 0; }
与continue不一样,在for中使用break后将直接跳出循环,不会再更新计数器。
for中使用continue,将立即更新计数器,再进入新循环。
for中使用break,将跳出循环。
6. break 和 continue 与循环嵌套
#include <stdio.h>int main() { for(;;) { for(;;) { break; // 跳出内层循环 } break; // 跳出外层循环 } return 0; }
在循环嵌套中,break或continue将作用于自己的直属上级循环。 对于上面的代码,内层循环调用break跳出循环到外层。外层循环再次调用break才能结束外层循环。
十八. 多重选择 switch的使用
1. 航空字母读法
在航空通讯中,经常会出现信号失真和衰落现象,再加上人们口音的不同,很容易发生误听差错。尤其是在26个英文字母中,如BD、 PT、GJ、SX等读音相似的最容易被听错。为此,在航空通讯中,常把 一个字母,读成一个对应的单词。
例如:B读成bravo,D读成delta。
下表为字母A到G的航空字母读法:
字母 | 读法 |
---|---|
A | alpha |
B | bravo |
C | charlie |
D | delta |
E | echo |
F | foxtrot |
G | golf |
2. 字符到航空字母单词转换
需求: 编写一个程序,输入字母,输出航空字母单词。
很显然这个程序可以使用 if 嵌套来写。为了简单清晰,我们省略 if 的括号,写成 else if 的形式。
#include <stdio.h>int main() { char c; scanf("%c", &c); if(c == 'a') printf("alpha\n"); else if (c == 'b') printf("bravo\n"); else if (c == 'c') printf("charlie\n"); else if (c == 'd') printf("delta\n"); else if (c == 'e') printf("echo\n"); else if (c == 'f') printf("foxtrot\n"); else if (c == 'g') printf("golf\n"); else printf("i don't know\n"); return 0;
}
3. switch语句
除了用 if 嵌套,C语言还提供 switch 语句, switch 更适合这种情形,可以使得代码更加清晰明了。
#include <stdio.h>int main() { char c; scanf("%c", &c); switch(c) { case 'a': printf("alpha\n"); break; case 'b': printf("bravo\n"); break; case 'c': printf("charlie\n"); break; case 'd': printf("delta\n"); break; case 'e': printf("echo\n"); break; case 'f': printf("foxtrot\n"); break; case 'g': printf("golf\n"); break; default: printf("i don't know\n\n"); } return 0;
}
switch使用公式:
switch(整型表达式)
{ case 整型常量1: 语句 case 整型常量2: 语句 case 整型常量3: 语句 case 整型常量4: 语句 case 整型常量5: 语句 default: 语句 ...
}
字符型也是一种整型。
switch的跳转步骤:
- switch 会先计算括号内的整型表达式结果。
- 依次对比 case 中的常量,是否等于整型表达式的结果。
- 若不相等,对比下一个 case 。
- 若相等,跳转到这个 case 。
- 若没有相等的,跳转到 default 。
swtich语句的几个注意事项:
- switch 后面的括号里面只能填一个整型表达式
- case 后的常量不能有重复的。
- 可以没有 default 。
4. break在switch语句中的作用
把每个 case 后跟的 break 都去掉,然后输入 ‘e’ 。
#include <stdio.h>int main() { char c; scanf("%c", &c); switch(c) { case 'a': printf("alpha\n"); case 'b': printf("bravo\n"); case 'c': printf("charlie\n"); case 'd': printf("delta\n"); case 'e': printf("echo\n"); case 'f': printf("foxtrot\n"); case 'g': printf("golf\n"); default: printf("i don't know\n\n"); } return 0; }
结果为输出了从 e 开始其后的所有对应单词,同时 default 也被执行了。
事实上, switch 找到对应的 case 后,仅仅是从对应的 case 处开始执行。并不会执行完对应 case 就跳出整个 switch 了。
除非遇到break才会跳出整个switch。
如果你不想执行后续的case,请一定要加上break,跳出整个switch。
5. 连续转换程序
我们希望这个程序应该持续的为我们提供转换服务,而不是每次转换完就退出了。那么这个程序需要加上循环。
#include <stdio.h>int main() { char c; while(1) { scanf("%c", &c); switch(c) { case 'a': printf("alpha\n"); break; case 'b': printf("bravo\n"); break; case 'c': printf("charlie\n"); break; default: printf("i don't know\n\n"); } } return 0;
}
当输入 ‘a’ 后,输出了转换结果 alpha ,但是紧跟着出现了 i don’t know 。这是为什么呢?
这是因为我们输入的时候,首先键入了 ‘a’ ,之后再按下了回车键 ‘\n’ 。scanf首先吸收了 ‘a’ ,而后再吸收了 ‘\n’ ,所以才输出了 i don’t know 。
很显然我们不需要这个额外的 ‘\n’ ,可以使用函数 fflush(stdin) ,清除未被吸收的输入。
#include <stdio.h>int main() { char c; while(1) { scanf("%c", &c); switch(c) { case 'a': printf("alpha\n"); break; case 'b': printf("bravo\n"); break; case 'c': printf("charlie\n"); break; default: printf("i don't know\n\n"); } fflush(stdin); // 清空输入缓存区 }
return 0;
}
6. break和continue究竟属于谁
6.1 break属于谁
#include <stdio.h>int main() { char c; while(1) { scanf("%c", &c); switch(c) { case 'a': printf("alpha\n"); break; case 'b': printf("bravo\n"); break; case 'c': printf("charlie\n"); break; default: printf("i don't know\n\n"); } fflush(stdin); } return 0;
}
switch 中的 break 能让 while(1) 结束循环吗?
答案是不能, switch 中的 break 只属于switch语句。它的效果是跳出 switch 。无法对 while 语句产生效果。
若将 break 写在 switch 语句外,那么它将对 while 产生效果。
#include <stdio.h>int main() { char c; while(1) { scanf("%c", &c); switch(c) { case 'a': printf("alpha\n"); break; // 这个break直属于switch case 'b': printf("bravo\n"); break; // 这个break直属于switch case 'c': printf("charlie\n"); break; // 这个break直属于switch default: printf("i don't know\n\n"); } fflush(stdin); // 这个break直属于while break; }
return 0;
}
6.2 continue 属于谁
#include <stdio.h>int main() { char c; while(1) { scanf("%c", &c); switch(c) { case 'a': printf("alpha\n"); break; case 'b': printf("continue\n"); fflush(stdin); continue; // 这里有个continue printf("bravo\n"); break; case 'c': printf("charlie\n"); break; default: printf("i don't know\n\n"); } fflush(stdin); } return 0;
}
continue 由于对 switch 不产生影响。所以这个 continue 直属于while。 当我们输入 ‘b’ ,执行了 continue 前的两条语句后,循环重新开始。
点个赞吧 😉
这篇关于最最最详细的C语言教程笔记零起步(8)进阶必备 同笔者一起学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!