P 81 breakd执行流程分析 2022/12/12
一、需求引入
- 随机生成一个数,直到生成了97这个数,看看你一共用了几次?
提示使用
- rand() 返回一个范围在 0 到 RAND_MAX 之间的伪随机数
- rand() 函数 在 stdlib.h 头文件.
c
#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或者循环[三大循环]中。
三、题目测试
c
#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
一、题目练习
题目一:分析下面代码输出内容是什么?
c
#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】
c
#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 循环完成
c
#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);
// 判断字符串是否相同使用strcmp
if(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的时候,下面变量的迭代是不会执行的,直接进行下一次循环条件的判断,而不是直接退出整个循环。
二、案例讲解
c
#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();
}
三、案例分析和说明
结合流程分析图,分析内存执行情况
c
#include<stdio.h>
void main() {
int i,j;
for( j = 0; j < 4; j++){
for( i = 0; i < 10; i++){
if(i == 2){
//看看分别输出什么值,并分析;不会输出i=2
continue ;
}
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使用。
c#include<stdio.h> void main() { int i = 0; switch(i) { case 1: continue; //错误 } if(i > 1) { continue; //错误 }}
二、题目练习
- 题目一 :从键盘读入 个数 不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序【使用for循环 ,break, continue完成】 【positive 正数,negative】
c
#include<stdio.h>
void main(){
/* 题目一 :从键盘读入 个数 不确定的整数,并判断读入的正数和负数的个数,
输入为0时结束程序【使用for循环 ,break, continue完成】 【positive 正数,negative】*/
// 分析:
// 1.定义变量positive保存正数的个数
// 2.定义变量negative保存负数的个数
// 3.使用for + break + continue
int 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方式完成
c
#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; // 现有的money
while(1){ // 死循环
if(money < 1000){ // 当现金小于1000的时候,退出循环
break;
}
if (money > 50000){// 当现金大于50000的时候,每次交5%
money = money * 0.95;
} else if(money <= 50000){// 当现金小于50000的时候,每次减100
money -= 1000;
}
count++; // 经过的路口增加1
}
printf("100,000元可以经过 %d个路口,剩余%d元",count,money);
getchar();
}
P 85 goto语句和return语句 2022/12/25
一、goto基本介绍
- C 语言的 goto 语句可以无条件地转移到程序中指定的行。
- goto语句通常与条件语句配合使用。可用来实现条件转移,跳出循环体等功能。
- 在C程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难
案例说明:
c
#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 + 55 5 + 333
c
#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)
c
#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+穿透)
- 看下面代码输出什么?
c
#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 假=0
printf("\n(b1=2>3) && (b2=5>0)为真");
}
printf("\nb1= %d ;b2= %d", b1,b2);
// 最后输出b1=0,b2=0
getchar();
}
- 看下面代码输出什么?
c
#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年内所有的闰年
c
#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
c
#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的和
c
#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.69
getchar();
}
P 88 枚举语法和快速入门 2022/12/26
一、引入
引入 :举个例子,比如:一星期有 7 天, 请定义数据表示星期一到星期天
传统方法:
c
使用#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,......};
快速入门:
c
#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 来遍历枚举的元素
c
#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 中可以使用枚举类型,案例如下:
c
#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,以此类推. [案例]
-
在定义枚举类型时改变枚举元素的值 [案例]
c
enum DAY {
MON, TUE, WED, THU=9, FRI, SAT, SUN //当THU=9,后面的会自动增加,而前面的未定义的值会默认为0增加到我们定义的位置
} day;
- 枚举变量的定义的形式1-先定义枚举类型,再定义枚举变量 [案例前面讲过]
c
enum DAY // 这里定义了枚举类型DAY
{
MON=1, TUE=2, WED=3, THU=4, FRI=5, SAT=6, SUN=7
}; // 这里DAY 就是枚举类型, 包含了7个枚举元素
enum DAY day; // 然后在定义枚举变量day
- 枚举变量的定义的形式2-定义枚举类型的同时定义枚举变量
c
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; // 这样使用枚举,该枚举类型只能使用一次
-
可以将整数转换为对应的枚举值 [案例]
c
#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;
}