- Switch语句
- 也是一种分支语句,适用于多分支的情况
- 语句结构
- 语句项
- 入口问题
case
- 出口问题
break
- 细节表达式必须包含整形
- 细节表达式要包括常量
1+0
字符也行,因为字符也是整形,字符用的是字符的ASCII码值
- 关于break
break不是必须加
好习惯最后一个break1加上去!!!!!
- Switch怎么表示或?
Switch(ch){
case' ':case'\n':blank ++;break;
}
空格或者回车都要进去调整语句
- default语句
default可写在前面或者后面
经典题
- 循环语句
- while dowhile for
- while
- 语法结构
- break的用法
- continu的用法
光标还在闪,还在进行跑,是因为在死循环
continue的作用是跳过本次循环continue后面的代码
直接去判断部分,看是否进行下次循环
- 再分析几个代码
- 第一个
getchar() 意思就是获取一个字符从标准输入中
怎么工作
标准输入-键盘
返回类型是int类型
返回值的描述:,返回的是整形,返回的是她的ASCII码值,如果错误读取,返回的是
eof end of file 文件介绍标志
注意getchar是获取一个字符,putchar是输出一个字符
两者可以互相替代- 回归原题
作用意义就是不断输入输出一个字符
回车或ctrl+z 就是getcahr读取结束
回车也是输入字符
原理是这样的
getchar与键盘之间不是直接联系的
这个换行有两部
\n对于getchar也要去读取
因为他认为缓冲区里的都是字符
.c为后缀他就是一个C语言的代码了
- 继续专研
- getchar与scanf
你要写密码锁功能
密码是个字符串
字符串要存起来,所以char 在开头
char password[20] = {0};passwor这个数组可以放20个字符,默认全0;
password不用取地址,因为password是个数组,数组的数组名本来就是地址
我们现在需要这个人输入一个Y或N
我们现在就要把这个Y获取出来
输一个字符,我获取
就用getchar()
错了
解释:getchar还是scanf 就叫输入函数
他们从键盘直接拿到数据?不是
要从之间的缓冲区去拿数据
如果缓冲区没有数据,就会等待,等键盘输入,他就会拿走
回车会触发scanf去读内容,
敲回车会让123456放到缓冲区里去,然后scanf才回去读取信息,他只读123456
然后getchar再去看缓存区,发现还有一个\n,没有等待,直接拿走\n,直接放到ch里
刚刚并没有让我们等待,怎么解决呢?
清理缓冲区 getchar(); 清理\n
有时候不行嘞,
为什么失败了
scanf只会拿空格前面123456
缓冲区里可多了 getcahr();只能消灭一个字符
换个while循环
int tmp = 0;
while((读的不是\0,扔了
清理缓冲区多个字符
注意了和刚才while很相似
字符 本质是以 ASCII 形式储存
ASCII本质是整形
getchar返回的eof eof本质上是个-1;
-1不是ASCII,是整形
所以用int储存
所以我们经常讲函数不要研究太透
如果一个字符串有空格,gets这样的函数也能做,她能读一行
再强调一遍:b站的视频不代表你学会了
空杯心态,吊儿郎当,可能有些知识点没有消化
- 代码二
ASCII表就是非数字字符,只会打印数字字符
- getchar与scanf
- 继续专研
- 回归原题
- for循环
for循环把三部分结合在一起,比while优越- 语法结构
for循环用的最多
- 实际问题出现break和continue
- break
只要break执行了,循环终止
- continue
12346789不会有死循环
for和while的continue不一样
for的它跳到调整部分,while完全可能跳过调整部分,导致死循环
第二条建议:for循环控制变量的取值采用"前闭后开"写法
int arr[10] = {0};
for(i= 0;i<10;i++);
i=0是前闭
i<10是后开
这个前闭后开是有意义的:打印十个0,循环10次,效果可读性更好
- for循环的变种
判断部分的省略 - 这个循环的判断部分恒为真,死循环
答案是三个呵呵
省略带来的锅,是自己考虑不周全,此时j已经变成3了,以后的结果不成立
第二个变种:两个循环变量
作业:循环了几次
真坑啊,k=0 把零赋给k,0就是假,就是假,循环一次都不进,这个循环进行了零次
- break
- 语法结构
- 第一个
- do while
- 语法结构
和while的区别
do while是先执行后打印
- break
一个break只能跳出一层循环,
多层嵌套要每个都加break
- continue
跳过continue后面的代码
i++被跳过去了
i++的位置很重要,可能被continue的语句跳过去
- do的特点
至少循环一次
- 练习1.计算a的阶乘
明知次数是多少,用for循环好
- 练习2.计算1到10的阶乘之和
初始化的重要性
讲究效率的话,改进代码0-
- 练习3.>>在一个有序数组中查找具体的某个数,编写int binsearch(int x, int v[],int n);功能:在v[0]<=v[1]<=v[2]的数组中查找x
有序数组:数组已经排好序了
在1 2 3 4 5 6 7中找7
在有序数组中找号码,用二分法怎么做呢?
找这组数组的中间数,
如果简单从元素个数除以二来求中间元素是没用的
方法:找头和尾
最左边元素的下标是0,最右边的下标是9
9/2=4,来作为中间元素的下标
4作为下标所对元素是5
5和9的平均值是7
七作为下标所对元素是8
最坏情况我们找了四次
二分查找法:效率非常高
最坏情况查找log2 n次
比如要找2的三十二次方
- 第三题的几个思路(算法思想)
一次查找
但我们要多次查找
(6+6)/2=6才是答案
5要淘汰掉
5到9
mid-1左下标右下标相等
确定新的范围进行二分查找
- 练习四:编写代码,向中间汇聚
- 先必须有两个数组
char arr [] = "welcome to bit";
char arr [] = " ***************"
strlen(arr1)-1就是最后一个感叹号的下标;
注意互相替换:
arr 2 [left] = arr 1 [left];
arr2[right] = arr 1 [right];
while的条件就是left小于等于right;
strlen还要头文件
sleep单位是毫秒
sleep(10000);头文件window.h
system("cls");
太美了
头文件有string.h和windows.h
char arr[] = "abc";
a b c \0
你不减一怎么求它的下标
- 先必须有两个数组
- 第五题:
- 登入三次
注意strlen 和strcmp都属于字符串函数都要引用string.h
两个字符串比较.不能使用= =,应该使用strcmp
注意char password[20] = { 0 };
strcmp abcdef abccqqq比较的是对应字符的ASCII码值
不是比长度,d大于c,所以第一个字符串大于第二个字符串
数组名本来就是一个地址;
不能用==,这种比较是在比较两个首字符的地址,地址比较没有任何意义的;
- 登入三次
- 猜数字游戏
会自动产生一个一到一百的随机数
猜数字
猜对了,恭喜你,游戏结束
猜错了,会告诉你猜大了还是猜小了
游戏一个一个玩,除非直接退出游戏
- 先用do while循环进行猜数字游戏的开始
menu要自己写,不要引用头文件
- 正式进入猜数字游戏
1.先生产随机数
介绍rand函数,就是生产一个随机数
int ret = rand();
没0挑战了,rand返回的值在0到32767之内
还要调用scrand函数,设置一个随机的起点
scrand(100);
这需要一个变的量
电脑时间一直在发生变化,时间戳,一个时间戳就是一个数字
获取时间戳time,把时间戳传进去
有个库函数time会返回一个时间戳
注意给它传一个null值过去,我们不想用这个参数,time函数本来有参数的,
注意了,time函数的返回类型是time_t 也是一种整形类型,time函数的参数是空值
同时srand需要的是一个unsigned类型的函数,所以我们把time函数的返回值强制类型转换成unsigned类型就可以了即srand((unsigned int)time(NULL));
这个时候time函数引头文件time.h
这里出现一个随机值,但是数不够随机,随机数起点的设置要放对位置,放在主函数之前
但现在生产的随机数不在一到一百范围,我们可以让它模上一百,然后加一即
%100 ,然后+1,范围就是1到100了
%100+1
这时候生成的随机数就是1-100
小技巧
- 猜数字
scanf("");
真好玩
- 先用do while循环进行猜数字游戏的开始
- 语法结构
- while