ACM - 暑期第十二天:排序 + 搜索 + c++各种输入的区别

来源:互联网 发布:淘宝嘉年华价格变更 编辑:程序博客网 时间:2024/06/09 22:11

1.遐想



经过快两个礼拜的努力,校ACM已经AC了84题了。我很爱很爱你,84!在今天这个特殊的日子里我愿意为你停留,但是我却不能一直为你停留,这就是现实,我必须用力奔跑,将来才有勇气有资格去面对你。接下来我要疯狂继续AC,进阶人生的地位。恍然间已经22岁,已经 2 年了。路一直在,人已走远!

2.排序 

杭电排序系列

自己按照杭电的这个系列做下来,发现大都是水题,拿来练信心的。排序有快速排序,归并排序,堆排序,基数排序,冒泡排序,选择排序...总共八大排序。记得写一个系列博客。


3.搜索

在校ACM1001上就有用搜索来做题的(校ACM1001)。给个杭电搜索系列的链接:杭电搜索系列链接。在hdu1010上,用 剪枝 + 深度优先搜索(递归实现)比较简单的。


4.c++各种输入的区别

输入操作的原理:程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。

问题描述一:(分析scanf()和getchar()读取字符)
scanf()和getchar()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。
而读取时遇到回车(\n)而结束的,这个\n会一起读入输入流缓冲区的

问题描述二:(分析scanf()和gets()读取字符串)
用scanf来读取一个字符串时,scanf()函数取数据是遇到回车、空格、TAB就会停止
字符串中是不可以出现空格的,一旦出现空格,后面的数据就会舍弃残留在缓冲区中。
另外一个函数是可以接受空格的,那就是gets()

问题描述三:cin<<

该操作符是根据后面变量的类型读取数据。

输入结束条件:遇到Enter、Space、Tab键。

对结束符的处理:丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab) (有争议= - =)


总结:

第一:要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题!


读取字符时:

scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,也不会舍弃最后的回车符;

读取字符串时:
scanf()以Space、Enter、Tab结束一次输入
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!


第二:为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决:
C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
这个函数是fflush(stdin)。

原创粉丝点击