达内嵌入式课程
day5:分支语句、for循环、break和continue
STDC01_day05_01-运算符11.ts
如果一个表达式里多个数字的类型不同就必须首先转换成同一个类型然后才能计算
这个转换过程叫隐式类型转换,由计算机完成
隐式类型转换中一定把占地小的类型转换成占地大的类型
/CSD1702/biaoc/day05 01type.c
/*
类型转换演示
*/
#include <stdio.h>
int main(){
printf("sizeof(1 ? 1 : 0.9)是%d\n",sizeof(1 ? 1 : 0.9));
return 0;
}
结果:
sizeof(1 ? 1 : 0.9)是8
如果不同类型的大小一样就把整数类型转换成浮点类型,把有符号类型转换成无符号类型
/CSD1702/biaoc/day05 01type.c
/*
类型转换演示
*/
#include <stdio.h>
int main(){
printf("sizeof(1 ? 1 : 0.9)是%d\n",sizeof(1 ? 1 : 0.9));
printf("-7 + 3 > 0是%d\n", -7 + 3 > 0);
printf("-7 + 3u > 0是%d\n", -7 + 3u > 0); //隐式类型转换为无符号类型 将-7转换成无符号类型 保存在计算机内的二进制数不变
return 0;
}
结果:
sizeof(1 ? 1 : 0.9)是8
-7 + 3 > 0是0
-7 + 3u > 0是1
-7转换成无符号类型时是一个非常大的数字,如果用%d作为占位符显示-7+3u为-4,用%u作为占位符就是一个非常大的数字,我们能看到什么内容取决我们用的占位符
C语言里可以随时给一个数字指定一个类型,这叫做强制类型转换
强制类型转换的格式如下
(char)300
强制类型转换有可能造成数据丢失
/CSD1702/biaoc/day05 01type.c
/*
类型转换演示
*/
#include <stdio.h>
int main(){
printf("sizeof(1 ? 1 : 0.9)是%d\n",sizeof(1 ? 1 : 0.9));
printf("-7 + 3 > 0是%d\n", -7 + 3 > 0);
printf("-7 + 3 > 0是%d\n", -7 + 3u > 0);
printf("%d %d\n",300,(char)300);
return 0;
}
结果:
sizeof(1 ? 1 : 0.9)是8
-7 + 3 > 0是0
-7 + 3 > 0是1
300 44
类型转换不会修改现有存储区的内容,计算机会分配一个新的存储区记录转换后的数字
STDC01_day05_02-分支语句01.ts
分支结构可以从几组语句选择一组执行而忽略其他组
如果程序中遇到多种可能性,每种可能性需要专门的语句处理就可以使用分支语句
if关键字可以用来编写分支
if分支里需要为每种可能性编写对应的处理语句
if分支里需要为每组语句编写配对的逻辑表达式,当某个逻辑表达式为真的时候就执行它配对的语句
if(){
}
else if(){
}
else if(){
}
有可能同时执行的语句不可以包含在一个分支里
编写if分支之前必须首先确定有多少个可能性
/CSD1702/biaoc/day05 02if.c
/*
if分支演示
*/
#include <stdio.h>
int main(){
int num = 0;
printf("请输入一个数字:");
scanf("%d",&num);
if (num >= 0){
printf("非负数\n");
}
else if(num < 0){
printf("负数\n");
}
return 0;
}
结果:
请输入一个数字:4
非负数
请输入一个数字:-6
负数
/CSD1702/biaoc/day05 02if.c
/*
if分支演示
*/
#include <stdio.h>
int main(){
int num = 0;
printf("请输入一个数字:");
scanf("%d",&num);
/*if (num >= 0){
printf("非负数\n");
}
else if(num < 0){
printf("负数\n");
}*/
if (num > 0){
printf("正数\n");
}
else if (num < 0){
printf("负数\n");
}
else if (!num){
printf("零\n");
}
return 0;
}
结果:
请输入一个数字:6
正数
请输入一个数字:-3
负数
请输入一个数字:0
零
STDC01_day05_03-分支语句02.ts
/CSD1702/biaoc/day05 02if.c
/*
if分支演示
*/
#include <stdio.h>
int main(){
int num = 0;
printf("请输入一个数字:");
scanf("%d",&num);
/*if (num >= 0){
printf("非负数\n");
}
else if(num < 0){
printf("负数\n");
}*/
if (num > 0){
printf("正数\n");
}
else if (num < 0){
printf("负数\n");
}
else {
printf("零\n");
}
return 0;
}
结果:
请输入一个数字:5
正数
请输入一个数字:-2
负数
请输入一个数字:0
零
如果分支中一定要执行一组语句就可以省略最后一组语句的逻辑表达式和if关键字
如果if分支中多个逻辑表达式同时为真就执行其中前一个逻辑表达式对应的语句而忽略后面的逻辑表达式
/CSD1702/biaoc/day05 03if.c
/*
if分支演示
*/
#include <stdio.h>
int main(){
int num = 0;
printf("请输入一个数字:");
scanf("%d",&num);
if (num < 0){
printf("负数\n");
}
else if (num & 1){
printf("奇数\n");
}
else if (!(num & 1)){
printf("偶数\n");
}
return 0;
}
结果:
请输入一个数字:-1
负数
1的二进制为 00000000 00000000 00000000 00000001
-1的二进制为 11111111 11111111 11111111 11111110 +1
= 11111111 11111111 11111111 11111111
上述程序输入-1时同时满足前两个if条件(num < 0)和(num & 1)
if分支里每组语句和前面的所有逻辑表达式都有关系
编写if分支的时候应该把逻辑表达式简单的写在前面
练习:
编写程序从键盘得到三个数字,找到其中最大的数字并显示在屏幕上
STDC01_day05_04-分支语句03.ts
/CSD1702/biaoc/day05 04if.c
/*
分支练习
*/
#include <stdio.h>
int main(){
int num = 0, num1 = 0, num2 = 0;
printf("请输入三个数字:");
scanf("%d%d%d",&num,&num1,&num2);
if (num > num1 && num > num2){
printf("最大数字是%d\n",num);
}
else if (num1 > num && num1 > num2){
printf("最大数字是%d\n",num1);
}
else {
printf("最大数字是%d\n",num2);
}
return 0;
}
结果:
请输入三个数字:34 56 72
最大数字是72
/CSD1702/biaoc/day05 04if.c
/*
分支练习
*/
# include <stdio.h>
int main(){
int num = 0, num1 = 0, num2 = 0;
printf("请输入三个数字:");
scanf("%d%d%d",&num,&num1,&num2);
//初学者做法
/*if (num > num1 && num > num2){
printf("最大数字是%d\n",num);
}
else if (num1 > num && num1 > num2){
printf("最大数字是%d\n",num1);
}
else {
printf("最大数字是%d\n",num2);
}*/
//提倡的做法
if (num > num1){
if (num > num2){
printf("最大数字是%d\n",num);
}
else {
printf("最大数字是%d\n",num2);
}
}
else {
if (num1 > num2){
printf("最大数字是%d\n",num1);
}
else{
printf("最大数字是%d\n",num2);
}
}
return 0;
}
如果一个分支里包含有限个整数,每个整数都要使用专门的语句处理就可以使用switch...case格式编写分支解决
/CSD1702/biaoc/day05 05switch.c
/*
switch...case分支演示
*/
#include <stdio.h>
int main() {
int season = 0;
printf("请输入一个整数:");
scanf("%d",&season);
switch (season) {
case 0:
printf("春天\n");
break;
case 1:
printf("夏天\n");
break;
case 2:
printf("秋天\n");
break;
case 3:
printf("冬天\n");
break;
default:
printf("不认识的数字\n");
}
return 0;
}
STDC01_day05_05-for循环01.ts
循环可以让一组语句反复多次执行
for关键字可以用来编写循环
for循环里可以让一个变量一次代表一组数字,然后使用一组语句处理它所代表的每个数字
这个变量叫做循环变量
采用如下结构描述循环变量的变化过程
(把开始数字赋值给循环变量;用逻辑表达式描述循环变量和结束数字的关系;循环变量每次的变化规律)
/CSD1702/biaoc/day05 06for.c
/*
for循环演示
*/
#include <stdio.h>
int main() {
int num = 0;
for(num = 1;num <= 5;num++){
printf("%d ", num);
}
printf("\n");
return 0;
}
结果:
1 2 3 4 5
在编写for循环之前必须使用一组数字的变化过程描述问题
练习:
编写程序在屏幕上显示如下5行内容
每次显示一行
54321
5432
543
54
5
STDC01_day05_06-for循环02.ts
/CSD1702/biaoc/day05 07for.c
/*
for循环练习
*/
#include <stdio.h>
int main() {
int num = 0;
for(num = 54321;num >= 5;num /= 10){
printf("%d\n", num);
}
return 0;
}
结果:
54321
5432
543
54
5
练习:
编写程序从键盘得到两个整数,计算它们之间所有整数的和并把结果显示在屏幕上
自己练习程序
/*
for循环练习
*/
#include <stdio.h>
int main(){
int sum = 0;
int num = 0,num1 = 0, i = 0;
printf("请输入两个整数:");
scanf("%d %d",&num,&num1);
printf("%d和%d之间的数之和是",num,num1);
if (num > num1){
for(i = num1;i <= num;i++){
sum = sum + i;
}
}
else {
for(i = num;i <= num1;i++){
sum = sum + i;
}
}
printf("%d\n",sum);
}
/CSD1702/biaoc/day05 08for.c
/*
for循环练习
*/
# include <stdio.h>
int main(){
int min = 0, max = 0, num = 0, tmp = 0, sum = 0;
printf("请输入两个整数:");
scanf("%d %d", &min, &max);
if (max < min){
tmp = max;
max = min;
min = tmp;
}
for (num = min;num <= max;num++){
sum += num;
}
printf("求和结果是%d\n",sum);
return 0;
}
STDC01_day05_07-for循环03.ts
假设有如下的for循环
for (1;2;3){
4
}
它按照以下方式分组执行
[1,2][4,3,2][4,3,2]...[4,3,2]
第一组和其他组都不同,正常情况下for循环应该在两组之间结束
如果某一组最后编号为2的逻辑表达式结果为假就立刻结束循环
如果for循环正常结束则结束后循环变量一定落在指定数字范围之外
for循环有可能不执行大括号里面的语句
for循环小括号里任何部分都可以省略
如果省略小括号中间的逻辑表达式就表示逻辑表达式结果永远为真,这种循环不能正常结束,它们叫做死循环
/CSD1702/biaoc/day05 09for.c
/*
for循环演示
*/
#include <stdio.h>
int main(){
int num = 0;
for (num = 1;;num++){
printf("%d\n", num);
}
return 0;
}
小括号里最前面和最后面的部分可以是用逗号链接的多条语句
/CSD1702/biaoc/day05 09for.c
/*
for循环演示
*/
#include <stdio.h>
int main(){
int num = 0, num1 = 0;
/*for (num = 1;;num++){
printf("%d\n", num);
}*/
for (num = 1,num1 = 9;num <= num1;num++,num1--){
printf("%d X %d = %d\n", num, num1,num * num1);
}
return 0;
}
结果:
1 X 9 = 9
2 X 8 = 16
3 X 7 = 21
4 X 6 = 24
5 X 5 = 25
STDC01_day05_08-for循环04.ts
C99规范里允许在循环的小括号里临时声明循环变量
这种循环变量只能在循环里使用,循环结束后就不能使用了
/CSD1702/biaoc/day05 09for.c
/*
for循环演示
*/
#include <stdio.h>
int main(){
/*int num = 0, num1 = 0;
for (num = 1;;num++){
printf("%d\n", num);
}*/
/*for (num = 1,num1 = 9;num <=num1;num++,num--){
printf("%d X %d = %d\n", num, num1,num * num1);
}*/
for (int num2 = 1;num2 <= 5;num2++){
printf("%d", num2);
}
printf("\n");
//printf("num2是%d\n",num2); 错误
return 0;
}
结果:12345
采用C99规范编译命令 gcc -std=c99 09for.c
练习:鸡兔同笼
一共40个头,100只脚
编写程序计算兔子和鸡各有多少只
/CSD1702/biaoc/day05 10for.c
/*
鸡兔同笼
*/
#include <stdio.h>
int main(){
int num = 0; //兔子数量(头的数量)
for (num = 0;num <= 40;num++){
if (4 * num + 2 * (40 - num) == 100) { //腿数量和为100
printf("兔子一共有%d只,鸡一共有%d只\n", num, 40 - num);
}
}
return 0;
}
结果:
兔子一共有10只,鸡一共有30只
STDC01_day05_09-break和continue01.ts
/CSD1702/biaoc/day05 10for.c
/*
鸡兔同笼
*/
#include <stdio.h>
int main(){
int num = 0;
for (num = 0;num <= 40;num++){
if (4 * num + 2 * (40 - num) == 100) {
printf("兔子一共有%d只,鸡一共有%d只\n", num, 40 - num);
}
}
printf("num是%d\n",num);
return 0;
}
结果:
兔子一共有10只,鸡一共有30只
num是41 //循环正常结束,循环变量落在指定范围之外
可以在循环里使用break;语句立刻结束循环的执行
执行完break;语句后,循环里的一切语句都不再执行,包括循环变量也不再变化
如果循环采用break;语句结束则结束后循环变量一定落在数字范围之内
如果编写循环的时候无法事先计算循环的次数就可以编写死循环,然后在循环里使用break;语句结束循环
可以在循环里使用continue;语句直接跳到循环大括号的末尾,中间的语句这次循环都不执行
/CSD1702/biaoc/day05 11continue.c
/*
continue语句演示
*/
#include <stdio.h>
int main(){
int num = 0;
for (num = 1;num <= 5;num++){
printf("%d ",num);
printf("%d ",10 + num);
}
printf("\n");
return 0;
}
结果:
1 11 2 12 3 13 4 14 5 15
/CSD1702/biaoc/day05 11continue.c
/*
continue语句演示
*/
#include <stdio.h>
int main(){
int num = 0;
for (num = 1;num <= 5;num++){
printf("%d ",num);
continue; //跳到循环末尾
printf("%d ",10 + num);
}
printf("\n");
return 0;
}
结果:
1 2 3 4 5
continue;和break;语句一般在分支中使用
/CSD1702/biaoc/day05 11continue.c
/*
continue语句演示
*/
#include <stdio.h>
int main(){
int num = 0;
for (num = 1;num <= 5;num++){
printf("%d ",num);
if (num == 3){
continue; //跳到循环末尾 不打印13
}
printf("%d ",10 + num);
}
printf("\n");
return 0;
}
结果:
1 11 2 12 3 4 14 5 15
练习:
编写程序从键盘得到一个0到100之间的数字,把这个数字到100之间所有和7无关的数字显示在屏幕上。
自己编写的程序
/*
continue语句练习
*/
#include <stdio.h>
int main(){
int num = 0,i = 0;
printf("请输入一个0到100之间的数字:");
scanf("%d",&num);
for (i = num;i <= 100;i++){
if (i % 7 == 0 || i / 10 == 7 || i % 10 == 7){ //i % 7 == 0 表示7的倍数
continue; //跳到循环末尾 //i / 10 == 7 表示70-79
} //i % 10 == 7 判断个位是不是7
printf("%d\n",i);
}
return 0;
}
/CSD1702/biaoc/day05 12for.c
/*
for循环练习
*/
#include <stdio.h>
int main(){
int num = 0, min = 0;
printf("请输入一个数字:");
scanf("%d", &min);
for (num = min;num <= 100;num++){
if(!(num % 7)){ //相当于 num % 7 == 0再取反,判断num是7的倍数
continue; //不执行操作,跳到循环末尾
}
if(num % 10 ==7){//判断num是否个位是7
continue;
}
if(num >= 70 && num <= 79){ //判断在70到79之间
continue;
}
printf("%d ",num);
}
return 0;
}
结果:
请输入一个数字:10
10 11 12 13 15 16 18 19 20 22 23 24 25 26 29 30 31 32 33 34 36 38 39 40 41 43 44 45 46 48 50 51 52 53 54 55 58 59 60 61 62 64 65 66 68 69 80 81 82 83 85 86 88 89 90 92 93 94 95 96 99 100
预习:
1.for循环
2.多重循环
3.while循环和do...while循环
4.缓冲区管理
5.数组