P 81 breakd执行流程分析 2022/12/12
一、需求引入
- 随机生成一个数,直到生成了97这个数,看看你一共用了几次?
提示使用
- rand() 返回一个范围在 0 到 RAND_MAX 之间的伪随机数
- rand() 函数 在 stdlib.h 头文件.
#include<stdio.h>
#include<stdlib.h>void main(){int i = 1;int count = 0;for(i=1;; i++){int num = rand()%100; // 如果要产生1~100,则是这样:int num = rand() % 100 + 1;
// 总结来说,可以表示为:int num = rand() % n +a;其中的a是起始值,n-1+a是终止值,n是整数的范围。printf("%d\n",num);count ++;if(num==97){break;}}printf("在100以内输出97共使用了%d次\n",count);getchar();
}
需求:通过该需求可以说明其它流程控制数据的必要性,比如break在执行循环的过程中,当满足某个条件时,可以提前退出该循环, 这时,就可能使用break
二、基本语法
介绍:break语句用于终止某个语句块的执行,一般使用在switch或者循环[三大循环]中。
三、题目测试
#include<stdio.h>
void main(){int i;for(i = 0; i < 10; i++) {
// if(i ==3) { //此时如果不添加break,会输出到9
// break; // 但是如果加上break会直接跳出循环,只会输出0,1,2;// 当执行到break的时候会直接退出循环,后面的将不执行}printf("i=%d\n", i);}getchar();
}
P 82 break课堂练习题 2022/12/13
一、题目练习
题目一:分析下面代码输出内容是什么?
#include<stdio.h>
void main(){int j,i;for( j = 0; j < 4; j++) {for( i = 0; i < 10; i++) {if(i == 2){ // 使用break语句会直接跳出内层循环break ; // 所以最终结果是输出4个i=0,i=1。} printf("i = %d \n" , i);}}getchar();
}
题目二:100以内的数求和,求出 当和 第一次大于20的当前数【for】
#include<stdio.h>
void main(){int i = 1;int sum = 0;for(i =1; i <= 100 ; i++){sum += i ;if(sum > 20){printf("当和第一次大于20的当前数 = %d",i); // 此时输出6,当添加到20的时候就已经超过20了break;}}getchar();
}
题目三:实现登录验证,有三次机会,如果用户名为”张无忌” ,密码”888”提示登录成功,否则提示还有几次机会,请使用for 循环完成
#include<stdio.h>
#include<string.h>
void main(){// 分析:// 1. 首先要定义一个变量,保存登录的机会(次数)chance// 2. 定义两个字符数组,接收用户名// 3. 使用for循环+break(如果登录成功就提前退出)int chance = 3;int logCount = chance; // 登录次数是需要固定char name[10] = "";char pwd[10] = "";int i = 1; // 循环变量for(i = 1; i <= logCount ; i++){ // 循环最多登录三次printf("\n请输入名字");scanf("%s",name); // 字符数组不用加&符printf("\n请输入密码");scanf("%s",pwd);// 判断字符串是否相同使用strcmpif(strcmp("张无忌",name)==0 && strcmp("888",pwd)==0){printf("\n登录成功");break; //}else{// 机会次数减一chance--;printf("\n你还有%d次登录机会",chance);}}getchar();getchar();
}
P 83 continue执行流程分析 2022/12/23
一、基本介绍
介绍:continue语句用于结束本次循环,继续执行下一次循环;当执行到continue的时候,下面变量的迭代是不会执行的,直接进行下一次循环条件的判断,而不是直接退出整个循环。
二、案例讲解
#include<stdio.h>void main() {int i = 1;while(i <= 4) {i++;if( i == 3) {continue; // 当i=3的时候,会直接进行下一次条件判断,将不会在执行下面的输出语句}printf("i=%d\n", i ); // 所以总共会输出 i=2,i=4,i=5 }getchar();
}
三、案例分析和说明
结合流程分析图,分析内存执行情况
#include<stdio.h>void main() {int i,j;for( j = 0; j < 4; j++){for( i = 0; i < 10; i++){if(i == 2){//看看分别输出什么值,并分析;不会输出i=2continue ;}printf("i = %d\n" , i);}printf("================\n");}getchar();
}// 输出 4次 i=0, 1 ,3,4,5,6,7,8,9
P 84 continue课堂练习 2022/12/24
一、注意事项和细节说明
-
continue语句,只能配合循环语言使用,不能单独和switch/if使用。
#include<stdio.h>void main() {int i = 0;switch(i) {case 1: continue; //错误}if(i > 1) {continue; //错误}}
二、题目练习
- 题目一 :从键盘读入 个数 不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序【使用for循环 ,break, continue完成】 【positive 正数,negative】
#include<stdio.h>void main(){/* 题目一 :从键盘读入 个数 不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序【使用for循环 ,break, continue完成】 【positive 正数,negative】*/// 分析:// 1.定义变量positive保存正数的个数// 2.定义变量negative保存负数的个数// 3.使用for + break + continueint positive = 0;int negative = 0;int num = 0; // 接收从控制台输入的数for(; ; ){ // 是一个死循环printf("请输入数");scanf("%d",&num);if(num == 0 ){break;}if(num > 0){positive++;continue; // 当为正数下面的将不会在执行}// num是一个负数negative++;}printf("正数个数%d,负数个数%d",positive,negative);getchar();getchar();
}
-
题目二:
-
某人有100,000元,每经过一次路口,需要交费,规则如下:
1.当现金>50000时,每次交5%
2.当现金<=50000时,每次交1000
编程计算该人可以经过多少次路口,使用 while break方式完成
#include<stdio.h>
void main(){// 题目二:某人有100,000元,每经过一次路口,需要交费,规则如下://1.当现金>50000时,每次交5%//2.当现金<=50000时,每次交1000//编程计算该人可以经过多少次路口,使用 while break方式完成// 分析:// 1. money 保存 金额// 2. 定义变量 count 统计可以经过多少个路口// 3. break 条件是money < 1000 时int count = 0;int money = 100000; // 现有的moneywhile(1){ // 死循环if(money < 1000){ // 当现金小于1000的时候,退出循环break;}if (money > 50000){// 当现金大于50000的时候,每次交5%money = money * 0.95;} else if(money <= 50000){// 当现金小于50000的时候,每次减100money -= 1000;}count++; // 经过的路口增加1}printf("100,000元可以经过 %d个路口,剩余%d元",count,money);getchar();
}
P 85 goto语句和return语句 2022/12/25
一、goto基本介绍
- C 语言的 goto 语句可以无条件地转移到程序中指定的行。
- goto语句通常与条件语句配合使用。可用来实现条件转移,跳出循环体等功能。
- 在C程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难
案例说明:
#include<stdio.h>
void main() {printf("start\n");goto label1; //label1 称为标签,与下面的标签是要有对应关系的printf("ok1\n");printf("ok2\n");
label1: printf("ok3\n");printf("ok4\n");getchar();
} //输出 ok3 和 ok4
二、return基本介绍
- return使用在函数,表示跳出所在的函数,在讲解函数的时候,会详细的介绍,这里我们简单的提一下。
P 86 流程控制综合练习(1) 2022/12/25
一、综合练习
- 实现判断一个整数,属于哪个范围:大于0;小于0;等于0 (多分支-if else if )
- 判断一个年份是否为闰年 [课堂上讲过:闰年-被四整除但不能被100整除,或者被400整除]
- 判断一个整数是否是水仙花数,所谓水仙花数是指一个3位数,其各个位上数字立方和等于其本身。例如: 153 = 111 + 555 + 333
#include<stdio.h>
void main(){/*题目:判断一个整数是否是水仙花数,所谓水仙花数是指一个3位数,其各个位上数字立方和等于其本身。例如: 153 = 111 + 5*5*5 + 3*3*3思路分析:1、先获取到一个三位数各个位上的数字2、先得到的各个数字(百位、十位、个位)立方并且求和*/int num,a,b,c;printf("\n请输入一个数:");scanf("%d",&num);a=num/100; // 百位b=(num/10)%10; // 十位c=num%10; // 个位if(a*a*a +b*b*b + c*c*c==num){printf("\n%d 是水仙花数",num);}else{printf("\n%d不是水仙花数",num);}getchar();getchar();
}
4.编写程序,根据输入的月份和年份,求出该月的天数(1-12), 就是需要考虑闰年(2月份 29)和平年(2月份 28)
#include<stdio.h>
void main(){//题目:编写程序,根据输入的月份和年份,// 求出该月的天数(1-12), 就是需要考虑闰年(2月份 29)和平年(2月份 28)// 规则 :// 1,3,5,7,8,10,12----31// 2月份:闰年(2月份 29)和平年(2月份 28)int year = 2020;int month = 2;switch(month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:printf("%d 这一年的%d月是31天",year,month);break;case 2:// 判断year是闰年还是平年if(year % 4 ==0 && year %100 != 0 || year % 400 == 0){printf("%d 这一年的%d月是29天",year,month);}else{printf("%d 这一年的%d月是28天",year,month);}break;default:printf("%d 这一年的%d月是30天",year,month);}getchar();
}
P 87 流程控制综合练习(2) 2022/12/25
一、综合练习
- 定义变量保存一个数,判断(if)是否能被3整除或(||)能被7整除(%),如果是,则提示:能,否则提示:不能
- 输入星期几,如果是星期一到星期三,打印:AAA,星期四到星期五,打印:BBB,星期六到星期日,打印CCC, 如果都不是,提示,输入错误(提示switch+穿透)
- 看下面代码输出什么?
#include<stdio.h>
void main(){int b1=0,b2=0;// 将 b2==5>0 改成 b2=5>0 又输出什么;赋值运算符的优先级比较低,5>0为真1,b2=1;都为真,则会输出下面内容,b1=0,b2=1// 这里改变后,有限考虑的是运算符优先级的问题if((b1==2>3) && (b2==5>0)){// 真=非0 假=0printf("\n(b1=2>3) && (b2=5>0)为真");}printf("\nb1= %d ;b2= %d", b1,b2);// 最后输出b1=0,b2=0getchar();
}
- 看下面代码输出什么?
#include<stdio.h>
void main(){int a=2;while(a<2){ //先判断printf("\n执行while");}do{printf("执行do-while");}while(a<2); //输出一次 "执行do-while "getchar();
}
- 复习:请使用for、while、do—while 三种形式打印1000——9999年内所有的闰年
#include<stdio.h>
void main(){int count = 0;int min = 1000;int max = 9999;int year;for(year=min;year<=max;year++){ // 只展示for循环其他同理if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){printf("%d年是闰年\n",year);count++;}}printf("1000到9999中有%d个闰年",count);getchar();
}
- 输出小写的a-z以及大写的Z—A
#include<stdio.h>
void main(){char c1;char c2;for(c1 = 'a'; c1 <= 'z'; c1++){printf("%c ",c1);}printf("\n");for(c2 = 'Z'; c2 >= 'A'; c2--){printf("%c ",c2);}getchar();
}
- 求出1-1/2+1/3-1/4……1/100的和
#include<stdio.h>
void main(){// 题目:求出1-1/2+1/3-1/4…..1/100的和// 分析:找到算式的规律,并且求解// 1-1/2+1/3-1/4…..1/100---->1/1-1/2+1/3-1/4....1/100// 1.分母是奇数,则符号是+;// 2.分母是偶数,则符号是-double sum = 0.0;int i;for(i= 1; i <= 100; i++){// 如果i是奇数if(i % 2 != 0 ){sum += 1.0/i; // 注意,考虑保留小数1.0,而不是1}else{ // 其余为偶数sum -= 1.0/i;}}printf("sum=%.2f",sum); //输出保留2为小数,最终得到0.69getchar();
}
P 88 枚举语法和快速入门 2022/12/26
一、引入
引入:举个例子,比如:一星期有 7 天, 请定义数据表示星期一到星期天
传统方法:
使用#define 来完成
#define MON 1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7
分析:传统方法代码量比较多,并且不好管理-----> 枚举
二、基本介绍
-
枚举是 C 语言中的一种构造数据类型,它可以让数据更简洁,更易读, 对于只有几个有限的特定数据,可以使用枚举.
-
枚举对应英文(enumeration, 简写 enum)
-
枚举是一组常量的集合,包含一组有限的特定的数据
-
枚举语法定义格式为
enum 枚举名 {枚举元素1,枚举元素2,……};
快速入门:
#include<stdio.h>
int main(){enum DAY{MON=1, TUE=2, WED=3, THU=4, FRI=5, SAT=6, SUN=7}; // 这里DAY 就是枚举类型, 包含了7个枚举元素enum DAY day; // enum DAY 是枚举类型, day 就是枚举变量day = WED; //给枚举变量 day 赋值,值就是某个枚举元素printf("%d",day);// 3 , 每个枚举元素对应一个值getchar();return 0;
}
P 89 枚举遍历和在switch使用 2022/12/26
一、枚举的遍历
- C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,枚举类型必须连续是可以实现有条件的遍历。以下实例使用 for 来遍历枚举的元素
#include<stdio.h>enum DAY {MON=1, TUE, WED, THU, FRI, SAT, SUN //如果没有给赋值,就会按照顺序赋值} day; // 表示 定义了一个枚举类型 enum Day ,同时定义了一个变量 day(类型是 enum DAY)int main() {// 遍历枚举元素,枚举的每一个元素都对应一个数据//day++ 会给出警告,但是可以运行for (day = MON; day <= SUN; day++) { // 要求枚举元素是连续赋值printf("枚举元素:%d \n", day);}getchar();return 0;}
二、枚举在switch中使用
C 语言中,switch 中可以使用枚举类型,案例如下:
#include<stdio.h>
void main() { enum SEASONS {SPRING=1, SUMMER, AUTUMN, WINTER}; //定义枚举类型 enum SEASONS enum SEASONS season;//定义了一个枚举类型变量 season(类型 enum SEASONS )printf("请输入你喜欢的季节: (1. spring, 2. summer, 3. autumn 4 winter): ");scanf("%d", &season);switch (season) {case SPRING:printf("你喜欢的季节是春天");break;case SUMMER:printf("你喜欢的季节是夏天");break;case AUTUMN:printf("你喜欢的季节是秋天");break;case WINTER:printf("你喜欢的季节是冬天");break;default:printf("这里没有你喜欢的季节");}getchar();getchar();
}
P 90 枚举类型使用注意事项和细节 2022/12/29
一、注意事项
-
第一个枚举成员的默认值为整型的 0(如果没有给予初始值),后续枚举成员的值在前一个成员上加1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推. [案例]
-
在定义枚举类型时改变枚举元素的值 [案例]
enum DAY {MON, TUE, WED, THU=9, FRI, SAT, SUN //当THU=9,后面的会自动增加,而前面的未定义的值会默认为0增加到我们定义的位置} day;
- 枚举变量的定义的形式1-先定义枚举类型,再定义枚举变量 [案例前面讲过]
enum DAY // 这里定义了枚举类型DAY{MON=1, TUE=2, WED=3, THU=4, FRI=5, SAT=6, SUN=7}; // 这里DAY 就是枚举类型, 包含了7个枚举元素enum DAY day; // 然后在定义枚举变量day
- 枚举变量的定义的形式2-定义枚举类型的同时定义枚举变量
enum DAY {MON, TUE, WED, THU=9, FRI, SAT, SUN //如果没有给赋值,就会按照顺序赋值} day; // 表示 定义了一个枚举类型 enum Day ,同时定义了一个变量 day(类型是 enum DAY)
- 枚举变量的定义的形式3-省略枚举名称,直接定义枚举变量 [案例]
enum { // 这里省略枚举名称MON, TUE, WED, THU=9, FRI, SAT, SUN } day; // 这样使用枚举,该枚举类型只能使用一次
- 可以将整数转换为对应的枚举值 [案例]
#include<stdio.h>
int main() {enum SEASONS {SPRING=1, SUMMER, AUTUMN, WINTER};enum SEASONS season;int n = 4;season = (enum SEASONS) n; // 这里将4转换成枚举类型,然后赋给枚举变量printf("season=:%d",season);getchar();return 0;
}