這個作業屬於哪個課程 | C語言課程設計 |
---|---|
這個作業要求在哪里 | 作業要求 |
這個作業的目標 | 回顧去年學習的C語言知識,開啟下一學期新的征程,重點放在第6章回顧數據類型和表達式和第12章文件,熟練運用測試程序 |
學號 | 20208980 |
2.1 題目:給定一個十進制正整數N,寫下從1開始,到N的所有整數,然后數一下其中出現的所有“1”的個數。
例如:
N=2,寫下1,2。這樣只出現了1個”1“。
N=12,我們會寫下1,2,3,4,5,6,7,8,9,10,11,12。這樣,1的個數是5。
問題是:
1.寫出一個函數f(N),返回1到N之間出現的”1“的個數,比如f(12)=5;
2.滿足條件”f(N)=N“的最大的N是多少?
要求:
1.貼出代碼圖片,寫出解題思路,列出測試數據(5分)
解題思路:這次程序自己首先想到的是把1—N的每個數里邊的1數一遍。但這不是最有效的辦法。
改進的思路如下:(C語言編寫的代碼目前沒有實現,但是Java可以實現且簡單)
1.一位十進制數:當N>=1時,f(N)=1;當N=0時,f(N)= 0;
2.兩位十進制數:f(13)=個位出現1的個數+十位出現1的個數=2+4=6;
f(23)=個位出現1的個數+十位出現1的個數=3+10=13;
......
f(93)=個位出現1的個數+十位出現1的個數=10+10=20;
3.三位十進制數:f(123)=個位出現1的個數+十位出現1的個數+百位出現1的個數=13+20+24=57;
4.f(abcde),計算c位上的1的個數,需要看ab、c、de的情況:
當c=0時,受高位影響,百位上出現1的個數為:(ab)100
當c=1時,受高位和低位影響,百位上出現1的個數為:(ab)100+((cde)+1)
當c>1時,受高位影響,百位上出現1的個數為:((ab)+1)*100
自己理解的不是很到位,但是可以明白基本的意思。
2.給出不同測試數據的運算時間,如果你的運算時間不變,說明你的測試數據不夠大(5分)
3.思考針對足夠大的數據,如何減少運算時間,並給出在原有算法基礎上的改進算法和改進思路。(10分)
分析得出規律:
<1>1位數情況
這個簡單,如果N = 3,那么從1到3的所有數字:1,2,3,只有個位數出現1,而且只出現一次。可以發現,N是個位數時,N >=1,那么f(N)= 1;N = 0,f(N)= 0;
<2>2位數情況
<3>3位數情況
同理分析4位數,5位數。。。。。
設N = abcde ,其中abcde分別為十進制中各位上的數字。
如果要計算百位上1出現的次數,它要受到3方面的影響:百位上的數字,百位一下(低位)上的數字,百位一上(高位)上的數字。
如果百位上數字為0,百位上可能出現1的次數由更高位決定。比如:12013,則可以知道百位出現1的情況可能是:100199,11001199,21002199,,.........,1110011199,一共1200個。可以看出是由更高位數字(12)決定,並且等於更高位數字(12)乘以 當前位數(100)。
如果百位上數字為1,百位上可能出現1的次數不僅受更高位影響還受低位影響。比如:12113,則可以知道百位受高位影響出現的情況是:100199,11001199,21002199,,.........,1110011199,一共1200個。和上面情況一樣,並且等於更高位數字(12)乘以 當前位數(100)。但同時它還受低位影響,百位出現1的情況是:12100~12113,一共114個,等於低位數字(113)+1。
如果百位上數字大於1(29),則百位上出現1的情況僅由更高位決定,比如12213,則百位出現1的情況是:100199,11001199,21002199,...........,1110011199,1210012199,一共有1300個,並且等於更高位數字+1(12+1)乘以當前位數(100)。
2.2 將上題中多組測試數據寫入文件,並給出測試程序以檢測你的代碼有沒有問題,貼出你的代碼、運行結果和文件內容。(5分)
2.3 用自己的語言回答兩個問題,並給出所查閱資料的引用(10分)
1.什么是文件緩沖系統?工作原理如何?
文件緩沖系統:系統會自動的在內存區為每一個正在使用的文件開辟一塊緩沖區,緩沖區的大小一般由各個C的版本規定,一般的為512Byte即0.5K大小。從此盤向內存讀數據時,則一次將一些數據從磁盤文件送內存緩沖區(充滿緩沖區),然后再從緩沖區逐個將數送給接收變量(文件描述符);從內存寫數據到磁盤文件時,現將數據塞滿緩沖區,在一次性將數據從緩沖區送到磁盤文件。用緩沖區可以一次讀入一批數據,或輸出一批數據,而不是執行一次輸入或輸出函數就去訪問一次磁盤,這樣做的目的是減少對磁盤的實際讀寫次數,因為每一次讀寫都要移動磁頭並尋找磁道扇區,花費一定的時間。緩沖文件系統是借助文件結構體指針來對文件進行管理,通過文件指針來對文件進行訪問,既可以讀寫字符、字符串、格式化數據,也可以讀寫二進制數據,緩沖文件系統函數一般是由f開頭的函數,如fopen(),fwrite(),fread()。
工作原理:如果bai打開讀,就只有輸入緩沖區,打du開寫,則為輸出zhi緩沖區,如dao果讀寫則有兩個緩沖區了zhuan。你不shu能獲得這個緩沖區地址,如果要強行刷新緩沖區,需要利用函數,如fflush,緩沖區就是預先開辟的內存,你也可以自己實現,文件等到緩沖區滿了再一次寫入文件,或一次讀入一個緩沖區數據,所有這些都是為了加快文件讀寫,因為文件讀寫是程序中最費時的操作之一!
2.什么是文本文件和二進制文件?
ASCII文件也稱為文本文件,這種文件在磁盤中存放時每個字符對應一個字節,用於存放對應的ASCII碼。
二進制文件是按二進制的編碼方式來存放文件的。 例如, 數5678的存儲形式為: 00010110 00101110只占二個字節。二進制文件雖然也可在屏幕上顯示, 但其內容無法讀懂。C系統在處理這些文件時,並不區分類型,都看成是字符流,按字節進行處理。 輸入輸出字符流的開始和結束只由程序控制而不受物理符號(如回車符)的控制。 因此也把這種文件稱作“流式文件”。
2.4 請給出本周學習總結(15分)
1 學習進度條(5分)
2 累積代碼行和博客字數(5分)
3 學習內容總結和感悟(5分)
1.學習一門編程語言少不了先學習基本語法。
首先我們要對C語言的語法有所了解,也就是變量,數組,指針,表達式,邏輯操作,函數,宏定義等等。學習這些東西肯定需要買一下資料和書籍,當然這些都是根據你自身學習的情況而定。
2.寫代碼練習
要想學好一門編程語言,往往只追求於對書籍的了解和領會是遠遠不夠的,我們要學會把書里的東西(代碼)搬到電腦里去。