ACM記錄:分析排序 + 搜索 + c++各種輸入的區(qū)別
1.遐想
經(jīng)過(guò)快兩個(gè)禮拜的努力,校ACM已經(jīng)AC了84題了。我很愛(ài)很愛(ài)你,84!在今天這個(gè)特殊的日子里我愿意為你停留,但是我卻不能一直為你停留,這就是現(xiàn)實(shí),我必須用力奔跑,將來(lái)才有勇氣有資格去面對(duì)你。接下來(lái)我要瘋狂繼續(xù)AC,進(jìn)階人生的地位。恍然間已經(jīng)22歲,已經(jīng) 2 年了。路一直在,人已走遠(yuǎn)!
2.排序?
杭電排序系列
自己按照杭電的這個(gè)系列做下來(lái),發(fā)現(xiàn)大都是水題,拿來(lái)練信心的。排序有快速排序,歸并排序,堆排序,基數(shù)排序,冒泡排序,選擇排序...總共八大排序。
3.搜索
在校ACM1001上就有用搜索來(lái)做題的(校ACM1001)。在hdu1010上,用
剪枝 + 深度優(yōu)先搜索(遞歸實(shí)現(xiàn))比較簡(jiǎn)單的。
4.c++各種輸入的區(qū)別
輸入操作的原理:程序的輸入都建有一個(gè)緩沖區(qū),即輸入緩沖區(qū)。一次輸入過(guò)程是這樣的,當(dāng)一次鍵盤輸入結(jié)束時(shí)會(huì)將輸入的數(shù)據(jù)存入輸入緩沖區(qū),而cin函數(shù)直接從輸入緩沖區(qū)中取數(shù)據(jù)。正因?yàn)閏in函數(shù)是直接從緩沖區(qū)取數(shù)據(jù)的,所以有時(shí)候當(dāng)緩沖區(qū)中有殘留數(shù)據(jù)時(shí),cin函數(shù)會(huì)直接取得這些殘留數(shù)據(jù)而不會(huì)請(qǐng)求鍵盤輸入。
問(wèn)題描述一:(分析scanf()和getchar()讀取字符)
scanf()和getchar()函數(shù)是從輸入流緩沖區(qū)中讀取值的,而并非從鍵盤(也就是終端)緩沖區(qū)讀取。
而讀取時(shí)遇到回車(n)而結(jié)束的,這個(gè)n會(huì)一起讀入輸入流緩沖區(qū)的。
問(wèn)題描述二:(分析scanf()和gets()讀取字符串)
用scanf來(lái)讀取一個(gè)字符串時(shí),scanf()函數(shù)取數(shù)據(jù)是遇到回車、空格、TAB就會(huì)停止。
字符串中是不可以出現(xiàn)空格的,一旦出現(xiàn)空格,后面的數(shù)據(jù)就會(huì)舍棄殘留在緩沖區(qū)中。
另外一個(gè)函數(shù)是可以接受空格的,那就是gets()。
問(wèn)題描述三:cin<<
該操作符是根據(jù)后面變量的類型讀取數(shù)據(jù)。
輸入結(jié)束條件:遇到Enter、Space、Tab鍵。
對(duì)結(jié)束符的處理:丟棄緩沖區(qū)中使得輸入結(jié)束的結(jié)束符(Enter、Space、Tab) (有爭(zhēng)議= - =)
總結(jié):
第一:要注意不同的函數(shù)是否接受空格符、是否舍棄最后的回車符的問(wèn)題!
讀取字符時(shí):
scanf()以Space、Enter、Tab結(jié)束一次輸入,不會(huì)舍棄最后的回車符(即回車符會(huì)殘留在緩沖區(qū)中);
getchar()以Enter結(jié)束輸入,也不會(huì)舍棄最后的回車符;
讀取字符串時(shí):
scanf()以Space、Enter、Tab結(jié)束一次輸入
gets()以Enter結(jié)束輸入(空格不結(jié)束),接受空格,會(huì)舍棄最后的回車符!
第二:為了避免出現(xiàn)上述問(wèn)題,必須要清空緩沖區(qū)的殘留數(shù)據(jù),可以用以下的方法解決:
C語(yǔ)言里提供了函數(shù)清空緩沖區(qū),只要在讀數(shù)據(jù)之前先清空緩沖區(qū)就沒(méi)問(wèn)題了!
這個(gè)函數(shù)是fflush(stdin)。