一、PTA實驗作業
題目1:7-3 出生年
1. 本題PTA提交列表
2. 設計思路
- 1、聲明一個函數different()用來計算一個年份的不同數字個數
- 2、定義y(y是來計算符合要求的年份的量),n(n為題目要求的不同數字個數),x(x用來存放起始年份),flag(flag是用來表示每個y值中的不同數字個數的量)
- 3、輸入起始年份y和題目要求的n
- 4、x=y(存放起始年份)
- 5、do {flag計算y中不同數字個數;如果flag=n,符合題意,輸出相應結果,並結束循環;如果不符合,y自增一}while(1)
- 6、對函數different(y)定義:
- 首先定義一個數組a[4]和不同數字個數count等於4;
- a[4]存放y的每一位;
- for(int i=0;i<4;i++) {for(int j=i+1;j<4;j++)如果a[i]=a[j,count減一,結束j的循環;
- 函數結果返回count
3.代碼截圖
4.本題調試過程碰到問題及PTA提交列表情況說明。
- 1、題目要求不足4位的年份要在前面補零,一開始不知道這個要怎么輸出,百度后明白了只要輸出中使用%04d就能使不足的前面補零
- 2、函數中j的循環內,如果a[i]=a[j,count減一,就要立刻結束j的循環;我漏了結束循環,使得在年份不是四位的情況下,count會被多減少好幾次
題目2:7-7 找鞍點
1. 本題PTA提交列表
2. 設計思路
- 1、定義二維數組a[6][6]和n
- 2、輸入n
- 3、 for(i=0; i<n; i++) for(j=0; j<n; j++) { scanf("%d",&a[i][j]); } 輸入二維數組
- 3、定義k=0,q=0,p=0(k,q,p都是下面循環要使用的),flag=1(flag是來判斷鞍點存不存在的)
- 4、for(i=0; i<n; i++) { q=i(下面需要用來判斷此行最大值是不是列所在最小值); 。。。。。。}
- 5、 for(p=0; p<n; p++) { if(a[i][k]<=a[i][p]) //數組元素之間比較,若比a[i][k]大,則將數組列標賦給k k=p; } } 這里找出行最大值,並將該最大值所在列的值賦給k,以便進行下一步行最小值的查找
- 6、for(j=0; j<n; j++){ if(a[q][k]>a[j][k])//若此行最大值不是列所在最小值,把小的行標賦給q { q=j; break; } } 這里找列最小值,並將最小值所在列的值賦給q
- 7、找到后只需比較i和j是否相等,相等則說明此行最大值是列所在最小值,讓flag等於0,結束循環
- 8、if(flag==0) 輸出結果 else 輸出none
3.代碼截圖
4.本題調試過程碰到問題及PTA提交列表情況說明。
- 1、循環最開始,必須讓q=i,否則鞍點在最后一個時就會發生錯誤
- 2、這里循環有點多,我經常輸出錯誤后更改代碼不小心把某些循環的大括號刪了,導致編譯錯誤= =
題目3:7-10 楊輝三角
1. 本題PTA提交列表
2. 設計思路
- 1、定義數組a[10][10].i,j,n
- 2、輸入n
- 3、for(i=0;i<10;i++) 將行頭及對角線中存入1(a[i][i]=a[i][0]=1)
- 4、for(i=2;i<n;i++){for(j=1;j<i;j++){}a[i][j]=a[i-1][j-1]+a[i-1][j];//將第三行起的數存入 } }存入第三行起除對角線外的所有數
- 5、輸出數組
3.代碼截圖
4.本題調試過程碰到問題及PTA提交列表情況說明。
- 1、我一開始j用的是小於等於i,結果把對角線上的數改變了
- 2、第一次做的時候忘了換行,輸出結果錯誤
二、截圖本周題目集的PTA最后排名。
三、同學代碼結對互評
1.互評同學名稱
李於程
2.我的代碼、互評同學代碼截圖
-
我的代碼
-
於程同學代碼
3.我和同學代碼不同在哪里?有哪些各自優勢?你更喜歡哪種代碼風格?如果同學代碼有錯的也請幫忙指出來哪里出問題。
- 於程同學是通過使用一個變量diff來進行累加,而我是將為1的元素先賦值好,然后中間的數用規律對數組進行加法得到
- 我可能會更喜歡於程同學的代碼,因為其代碼比較短,用到的循環較少(我個人循環較多時容易亂)
四、本周學習總結(3分)
1.你學會了什么?
1.1 C中如何存儲字符串?
- 使用字符數組儲存字符串
1.2 字符串的結束標志是什么,為什么要結束標志?
- 結束標志為‘\0'
- 結束標志是用來判斷是否結束循環的
1.3 字符串輸入有哪幾種方法?
- 1、直接輸入,如a[5]={"happy};
- 2、使用scanf函數,格式控制為%s,輸入參數為字符數組名,遇回車或空格結束
- 3、使用gets函數,輸入參數為字符數組名,遇回車結束
1.4 數字字符怎么轉整數,寫個偽代碼?
- 1、數字單個轉換:數字字符-‘0’
- 2、多位轉換:
- 1.定義循環變量i,sum=0
- 2.i=0
- 3.while(a[i]!=‘\0‘) sum=sum*10+(a[i]-‘0‘)
- 4.i++
1.5 16進制、二進制字符串如何轉10進制?寫偽代碼?
- 1、16進制
- 1.定義循環變量i,sum=0
- 2.i=0
- 3.while(a[i]!=‘\0‘)if(a[i]是數字字符)sum=sum16+(a[i]-‘0‘) if(a[i]是A-F)sum=sum16+(a[i]-‘A‘+10) if(a[i]是a-f) sum=sum*16+(a[i]-‘a‘+10)
- 4.i++
- 2、2進制
- 1.定義循環變量i,sum=0
- 2.i=0
- 3.while(a[i]!=‘\0‘)sum=sum*2+(a[i]-‘0‘)
- 4.i++
2.本周的內容,你還不會什么?
- 1、雖然基本掌握了數組,但對其運用並不熟練
- 2、數組的運用經常要使用很多循環,導致我經常將循環的量搞混(即使有注釋也經常沒注意到= =)
- 3、雖然能夠理解排序法,但對於它的應用不夠熟練
3.期中考試小結
3.1 你認為為什么沒考好?
- 1、我的選擇題只得了8分,這說明我基礎知識掌握不夠扎實,要多看課本,加強對基本知識的了解和掌控
- 2、我的改錯也不是很好,主要是一些邏輯錯誤看得出來,卻不知道怎么修改,這一點我認為應該只有通過多做題增加經驗來解決
- 3、編程題我做得尚可,但在一些涉及數學公式的因果應用上,我容易突然短路(例如其中編程第二題,我做的時候居然忘了怎么解x了= =),我想這可能有心理因素的原因,或許是幾個月沒經歷過考試有點緊張了,這一點要盡力克服
- 4、填寫代碼的題目雖然做得可以,但一些簡單的地方卻錯了,這是不應該的,究其原因,我認為還是基礎的問題,要多回歸課本,掌握好最簡單的知識
3.2 羅列錯題。請在選擇題、填空題、改錯題、編程題分別舉一題說明為什么錯了,怎么改?
- 1、選擇題:
第一題我題目意思理解錯誤,我以為他問的是C語言可以輸出的數的進制位= =
- 2、填空題:
第七空為ch=getchar(),我只寫了ch,這是我沒把上課內容充分理解的原因,以后上完課我應該進行復習
- 3、改錯題:
改錯比較尷尬,因為我知道它錯了,錯在哪,卻不知道怎么改,我認為這是因為我閱讀程序能力不夠的原因,以后我要多讀程序,學會看程序
- 4、編程題:
編程題其他兩題我做得不錯,這一題我也知道怎么做,但是可能考試比較緊張了,我忘了怎么求x的值了= =,考試時時間比較緊迫,就沒仔細去想,希望下次做題能夠保持頭腦清晰,不要着急
3.3 下半學期要怎么調整C的學習?
- 1、基礎知識要先掌握好,即課本的內容先精通,再來談更進一步的深奧內容
- 2、通過期中,我明白了c的學習不只是pta上做編程題而已,一些基礎的理論的簡單知識也要明白
- 3、下半學期,要在搞好基礎知識的情況下,將這些知識運用於編程中