1. 程式人生 > >C語言--第2次作業

C語言--第2次作業

The %d 第一個 print 一道 推薦 鍛煉 重要 對比

1.本章學習總結 技術分享圖片

1.1思維導圖

技術分享圖片

1.2本章學習體會及本章代碼量

1.2.1學習體會技術分享圖片

不同於前幾周簡單的條件語句等,這一周開始學習循環結構for,while語句,甚至是多種語句嵌套使用,讓我直接感受到編程的難度,嵌套要求的不僅是基礎代碼的熟練使用、各個語句的掌握到位,更是對於思維的鍛煉,在這一章的練習中,我發覺自己在循環嵌套方面十分生疏,有的題目很難得到思路,容易直接下筆,明白部分題需要動腦思考去簡化進而提高代碼質量,慢慢加油鴨,不能懼怕去寫較為復雜的程序!
 首次接觸continue和break語句以及flag變量的使用,方便將程序分為幾種情況,不失為一種好工具。隨著代碼量的越來越大,程序調試為代碼糾錯提供了非常大的便利,調試十分有用的同時也十分有趣,林麗老師推薦的printf調試法也十分實用,在每一次錯誤之後,不要立馬去問別人,而是學會自己調試,發現錯誤,自己思考,改正錯誤,養成獨立思考的習慣;
 除去代碼學習,這章還接觸了在我看來如同列草稿的偽代碼,寫程序前使用偽代碼將思路寫下,進行算法分析十分有效,可以養成好習慣。
 不懂的地方:部分循環語句需要scanf兩次

1.2.2代碼量

技術分享圖片

2.PTA總分

2.1循環結構題集1+2

技術分享圖片
技術分享圖片

2.2我的總分

總分:290

3.PTA實驗作業技術分享圖片

3.1題目一

龜兔賽跑比賽
烏龜每分鐘前進3米,兔子每分鐘9米;
兔子每跑10分鐘回頭看一下烏龜,若發現自己超過烏龜就休息30分鐘,否則繼續跑10分鐘,而烏龜不休息;
假定烏龜與兔子在同一起點同一時刻開始起跑,比較T分鐘後烏龜和兔子誰跑得快.

3.1.1算法分析

- 定義兔子路程distance1,烏龜路程distance2,休息時間restTime,(皆初始化為0),運動時間runTime=10,規定時間time;
- 在規定時間範圍內循環輸入時間
   for from i=0 to i= time i++
- 從開始每十分鐘做一次判斷
   if(runTime==0) then  runTime=10 ; if(restTime==0) then runTime--
- if distance1>distance2 休息30分鐘(即restTime=30),restTime--, distance2+=3
  else restTime=0 distance1+=9,distance2+=3 
  end for 
- if(distance1<distance2)
  printf("@_@ %d",tortoise); 
  else if(distance1>distance2)
  printf("^_^ %d",rabbit); 
  else printf("-_- %d",rabbit); 
  end if

3.1.2代碼截圖

技術分享圖片

3.1.3測試數據

技術分享圖片

3.1.4PTA提交列表及說明

技術分享圖片

說明: 這道題是在Devc上做了很多次,測試多組數據後放到PTA上所以提交結果只出現一次錯誤;
錯誤原因: 多個if分類討論不清晰,造成答案錯誤,經過重新分析題目,列草稿,得出正確答案;
值得汲取經驗:描述較長的題目劃出重點,即化文字直接轉化為代碼,運用多個條件語句時註意每一部分的邏輯是否清晰,括號的一一對應,註意休息時間和運動時間的特殊化,進而按情況賦予初始值。

3.2題目二

將一筆零錢換成5分、2分和1分的硬幣,要求每種硬幣至少有一枚,計算有幾種不同的換法

3.2.1算法分析

- 定義硬幣種類:fen5,fen2,fen1(註意每一種都要有),初始化為零只是方便後面語句,零錢為x,硬幣個數count=0;
- 三種硬幣同時存在,互不幹擾但是各種可能互相搭配,故采用三個for循環嵌套,極限思想,

for from fen5=1 to fen5=x/5,fen5++ {for from fen2=1 to fen2=x/2,fen2++ {for from fen1=1 to fen1=x,fen1++}
- 當滿足條件
if fen55+fen22+fen1=x then printf(“”)count++ 最後輸出count的值

3.2.2代碼截圖

技術分享圖片

3.2.3測試數據

技術分享圖片

3.2.4PTA提交列表及說明

技術分享圖片

說明:老師在課堂上詳細講解了一道類似的題,所以這一段代碼非常順暢,之所以記下來是因為解法較為特殊,值得記下來;
值得汲取經驗:本題要求算出各種可能的解,較為抽象,思路非常重要,首先要明白各種硬幣的取數互不幹擾但互相配合,應將各種硬幣所有可取數自由組合,再從中挑選符合題意的,即根據極限思想,算出只用某一種硬幣,需要的最大數量,嵌套循環,保證各種可能性

3.3題目三

輸入一段文本,統計每個單詞的字母數,以句號為結束標誌(單詞中的字符也算一個字母),每個單詞之間以空格隔開

3.3.1算法分析

- 定義num為字母數,blank判斷是否有空格 ,word是否存在單詞,flag判斷是否為單詞,皆初始化為0;
- 情況一:輸入一句話,句末存在句號結束輸入 while(ch!=“.”)
  是單詞 if(ch!=“ ”)then flag=1,num++,word=1;
  第一個結果前無空格 if flag==1&&ch==‘ ‘ &&blank==0,直接輸出字母數,
  之後的即在前加一個空格,printf(“ %d”)      
  每一次循環末端將flag和num歸零便於下一次判斷統計
  輸入最後一個單詞, if(word==1&&num!=0) blank!=0 printf(“ %d”)
- 只輸入一個單詞,if(word==1&&num!=0) blank==0  printf(“%d”)

3.3.2代碼截圖

技術分享圖片

3.3.3數據測試

技術分享圖片

3.3.4PTA提交列表

技術分享圖片

說明:這道題不是非常難,但是由於考慮欠缺,在Devc上嘗試了很多次加上同學的建議才做出來,值得記下來
 第一次做的時候忽略了flag和num的歸零問題,改過來之後,發現自己還忽略了如果只輸入一個單詞的情況,應該記錄下來,提醒自己以後要仔細    分析每一種情況,理清邏輯,內外for循環的變量名相同會導致程序錯誤!

4.代碼互評技術分享圖片

4.1代碼截圖

同學代碼
技術分享圖片

我的代碼
技術分享圖片

4.2代碼對比
相同點:1.均采用for循環輸入數據;
2.采用五個for循環分別輸出每一種結果的 *;
不同點:1.對於每一種結果的統計方式:他采用數組的方式,不用輸入每一種情況,對於整個程序來說較為簡潔,我還沒有接觸數組,只能老老實 實將每一個情況輸入,代碼量太大,質量不高;
2.對於結果的輸出方式:他依舊借助數組,省去麻煩,不用編寫五個for循環,整個程序簡潔明了,代碼質量較高,易於編寫
值得學習這位同學的提前學習,自主學習意識,有簡化程序的意識,勤於思考,但是數組在一定程度上沒有for語句清晰明了[]
技術分享圖片

C語言--第2次作業