這個作業屬於哪個班級 | C語言--網絡2011/2012 |
---|---|
這個作業的地址 | C博客作業01--分支、順序結構 |
這個作業的目標 | 初步認識C語法,掌握數據表達、printf、scanf語法及分支結構內容 |
0.目前我PTA兩次作業的完成情況:
0.1順序結構:
0.2分支結構:
1.本章學習內容的總結
1.1學習內容的總結:(這里不贅述在第一次作業中就完成的任務,將選擇一些我認為的重點很難點來簡述)
- 再次強調一遍科學命名的重要性,規范化使用就是變量名使用駝峰法,函數名使用帕斯卡命名法(首字母也要大寫)。(老師的提醒,那就是學習C語言不是學習英語,所以命名的用詞簡潔明了就好。)
- 學習了內存方面的知識,知道了:
- float和int占據4個存儲單元。
- double占據8個存儲單元。
- char占據1個存儲單元。
- 老師提到了一個點就是定義符號常量,這里我們拋出define但是先不拓展。define
- 學習了對一個程序的設計應該要從兩個角度入手:(1.數據表達 2.流程控制 )去仔細拆解一道題目。
- 強化一下該記的數學函數: 1.sprt() 求方根。 2. fabs() 針對全數據類型的求絕對值。 3.pow() 冪函數。 4.exp() 指數函數。 5. log() 求以e為底數的對數函數。
- 無論是整型還是浮點數都可以設置字符長度,都是在小數點前。 eg.
%6.d
%6.f
- 設置從隨機數中引出來的學習:
1.兩個新的頭文件。#include<stdlib.h>
#include<time.h>
2.獲取隨機數的程序如下:
深度思考srand(time(0)); //隨機產生一個隨機數。 =rand()%100 + 1; //輸出這個平均數, %可以用來設置范圍,此處為不超過一百的整數。
- 三種分支結構的性質:
1.單分支結構:適用於簡單的分支情況。
2. 嵌套的if-else: 適用於多對象的分支,程序程序運行的過程中需要一種一種情況進行判斷,效率在某種情況上,會比較低.
3. 級聯的if-else: 適用於單層多情況的分支,程序運行的過程中不需要一種情況一種情況判斷,效率會比較高,但是不利於處理分支情況很多種層次的情況.
小總結:提高效率的要點,是要在邏輯上就避免去執行不需要執行的語句. - 字符型數據的學習:(由於前面沒有整理所以這里將會詳細整理一下)
- 1.字符常量:
- 要用單引號來表示,如果沒有加單引號的話就會變成常規的運算符。(此處針對運算符)
- 但凡被加上單引號的內容,無論默認是什么,都會被視為是字符。
3.一些特殊字符的表示可以用轉義符“ \ ”來實現。
- 2.字符變量
1.字符變量的定義與賦值:
char character; //定義變量
character = 'a'; //字符的賦值
2.字符型數據再計算機的存儲:
* 字符型數據需要轉二進制,統一編碼。
* ASCII碼表。
* 字符型數據在計算機的內部都是用二進制編碼來表示的。
* 聲音,和圖片都是二進制表示。
3.關於ASCII碼表和字符的關系:
ASCII碼表的定義原理。
()
ASCII碼表是連續編譯的,其中切記,數字 1 和 字符 '1',這兩者是不一樣的!!!,在ASCII碼表的位置也不一樣!!(其他數字同理。)
4.字符可以通過ASCII碼表和整型相通:
(所以字符本身是可以比較大小的,其實比的就是ASCII碼表對應的同一進制的數字大小)
測試結果顯示:字符型的變量,如果進行數字賦值,那么這個變量它既存儲了ASCII碼表中該十進制數字所對應的字符,同時也存儲了該十進制數字,兩者是可以在一個變量中輸出的。
-
- 字符型數據的輸入和輸出
1.用 %c 來存儲字符數據。printf 和 scanf都一樣。
2.輸入的時候,操作數和運算符之間不能有空格,因為空格也是一個字符!!!,輸入空格會被當成有效字符,進而導致程序錯誤!
3.詳細如圖:
- 字符型數據的輸入和輸出
4.獨屬於字符的輸入和輸出:
//輸入
char ch;
scanf("%c",&ch);
或者
char ch;
ch = getchar();
//輸出
printf("%c",ch);
putchar(ch); //輸出變量
putchar('A'); //輸出常量
- 4.其他拓展
字符的很多條件關系的成立背后靠的確是,ASCII碼表背后進制數字的大小關系!!!
9. switch-case語句的升華: 要學會避免重復(將同樣的部分可以利用case的連續性來縮減代碼長度)
10. for語句和while語句的區別:
1. for語句更多的用於已知循環次數的情況
2. while語句則更適合不知道具體的循環次數的情況
1.2編程技巧的小總結:
- 可以定義一個變量來控制符號,即符號變量sign或者一些功能變量flag,這樣的做法會比機械地使用數學方式來求更高效。
- 典型的案例是對於加減交錯的情形的處理:使用sign變量會比引用pow去計算-1的奇偶指數下的不同結果會方便很多。
- 對浮點數的相等的判斷不能直接用
==
,應該用 兩個浮點數相減的結果小於一個無窮小的數來實現,效果會更好.
大概的代碼如下:
if (numb1 - numb2 <= 0.00000000001)
- switch-case結構的語句可以利用好沒有break情況下的連續執行語句的效果來進行龐大一常量條件的讀取.比如各類字符量的統計那一道題目可以借鑒.
大概的代碼如下:
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
- 避免由於if-else的匹配原則所帶來的錯誤的方式:
1.使用大括號,制造一個復合語句
2. 增加一個空的else - 學會利用 temp 變量,設立一個temp變量,用來儲存中間量可以在需要比大小的環境中讓largest始終存放大的那一個數據,讓smallest始終存放小一點的那一個數據.
if (largest < smallest)
{
temp = largest , largest = smallest , smallest = temp;
}
- 判斷奇偶常用:
if(number%2 == 0)
- 求兩個數的最大公約數用輾轉相除法 \ 兩個數的最小公倍數等於這兩個數相乘后除以他們的最大公約數. 假設(M>N):
while (N != 0)
{
number = N;
N = M % N;
M = number;
gcd = M;
lcm = product / gcd;
}
- 解決輸出一段數,要用空格隔開,而最后不要出現空格的辦法是,最后的數獨立一個輸出,前面的數在數后面多輸出一個空格。
1.3本章的學習體會:
==總得來說,這兩周的學習有收獲的地方,但也有很值得反思和思考的地方.==
* 先說有收獲的地方吧,大概明白了線下學習的學習方式,不同於暑假線上 慕課+PTA的慢慢學習的過程,線下的學習節奏更快,需要更==專注的態度==和==更清晰的組織能力==,線下的模式將主要變成這樣的樣式:
1.[課前准備部分] 首先是在 課堂派上結合書本進行預習任務的完成,在預習的過程中多思考和完成筆記的記錄(有點像是把看慕課和邊整理筆記的時間放到這里來了), 然后是完成測試作業並做好思考的總結,相關筆記的整理.
2.[課上聽課部分] 跟着老師的思路, 在自己的腦子中形成完整的知識框架, 鞏固已經學會的知識點, 重點記錄和研究自己還不太懂的部分.
3.[課后鞏固部分] PTA平台保持刷題習慣,看超星平台的視頻進行鞏固和補充 {有時間的話 對可以拓展的點進行自行拓展和學習}
* 再說說存在危機的地方,那就是我在時間安排和管理上還不能讓我很舒適地按照我想要的節奏學習C語言,沒有那種很輕松的感覺,感覺我能跟得上目前的上課節奏的主要原因還是暑假的小段時間的自習,而不是說在學習的過程中,沒有那種很舒適和順暢的感覺,尤其是在編程思維上,我感覺自己遲鈍了很多,第一次上機課的效果還算可以,但是第二次上機課的效果卻有一點點糟糕,這讓我有點焦慮和惶恐.很明顯的一個地方就是,我可以肯定我對C語言程序設計的緊張感由於大量事情的沖擊而有所松懈了,我得自己調整好,堅持以C語言程序設計為中心的大學課程學習,把握好時間安排,加大代碼量的編寫!
* 嚴格地來說這兩周地代碼量幾乎為微!並且還主要集中在上機課.這是很嚴重的問題!
2.PTA實驗作業
2.1前天是哪天
2.1.1數據處理:
- 數據表達:需要設置三個變量,year month day用來保存年月日這3個數字,數據類型為整型。
- 流程設計:
采用級聯的if-else結構:
第一種情況是 年需要借位的情況,month==1 && day <= 2
第二種類型是 月份需要借位的情況:其中第一類是借位后為大月的情況 條件為 month為2 4 6 8 9 11且day <= 2時才會觸發。
第二類時借位后為小月的情況 條件為 month為5 7 10 12且day <= 2時才會觸發。
第三類是2月份的情況 條件為 month為3且day <= 2時才會觸發。 並且需要事先判斷該年年份是否為閏年。
最后就是剩下的比較簡單的情況,直接就是day-2
2.1.2代碼截圖:
級聯的if-else版本:
switch-case版本:
2.1.3 PTA提交列表及說明
一次過:這里要強調一下先思考再去寫代碼的至關重要性和高效性!
2.2單詞長度
2.2.1數據處理:
數據表達:用一個字符變量op來存儲字符;用一個整型變量count來計數。
流程設計:
2.2.2 代碼截圖:
(還存在一個 格式錯誤 沒有找出來時間 花費太多了,腦子有點亂 暫時先到這里)
2.2.3PTA提交截圖:
- 這里的多次提交可以分為兩種類型的思路的交叉,原本的do-while結構能夠滿足10分的要求,但是對於 空句子 連續空格 和 開頭結尾多空格的小細節不好處理。
於是改用 外部先輸入一次加while結構 這樣可以解決開頭空格輸入對do - while結構的邏輯性打擊。這里插入一個關鍵點:如果使用while結構要注意循環內的賦值應該放在最后這也是解釋我提交當中出現1分的情況的問題。
往后回到10分就是那三個問題的未解決。
改動了這兩個地方:
第一 插入了一個判斷在第一個輸出的地方把連續空格所造成的結果會輸出0的問題解決。
第二 將第二個輸出的地方將條件從op == '.'
改成了count != 0
這也是為了解決連續空格問題。
尚未解決的疑問:不知道最后的關於開頭結尾的空格的格式錯誤這個問題怎么解決。
這個疑問的解決,其實說的問題是在 . 和語句之前存在空格的話要怎么去解決。
好的辦法是使用狀態變量,直接采用讓第一個輸出和后面的輸出分開來就可以解決問題。
但是這個過程下又會產生新的問題,那就是只有一個單詞的測試點反而過不了了。
最終經過測試發現,是來自於循環外部的那個判斷語句的問題,那個判斷語句直接面對的是結尾是 . 的輸出情況,在只打一個單詞的情況下,也會有區別,所以也要有分支來提調節。
最后是,格式的錯誤中!不僅要考慮空格不計數,還要考慮換行也不計數!!
2.3單步調試解決 單詞長度這道題,
2.3.1單步調試截圖
調試到這里的代碼可以完成這道題目的大體的要求
這里是發現了從do-while換成while時忘記該換輸出語句的位置,導致了大錯誤!