- 要求二
題目7-4 fibonacci數列
1.實驗代碼
1 #include<stdio.h> 2 int main() 3 { 4 int i,f[12]={1,1}; 5 for(i=2;i<=11;i++) 6 f[i]=f[i-1]+f[i-2]; 7 for(i=0;i<=11;i++) 8 { 9 printf("%6d",f[i]); 10 if((i+1)%3==0) 11 printf("\n"); 12 } 13 return 0; 14 }
2.設計思路
(1)主思路
- 第一步:定義整數型變量i(循環變量)和整數型數組f(長度為12);
- 第二步:使用循環結構為數組f賦初值;
- 第三步:使用循環按格式輸出數組f,循環內嵌套條件語句判斷換行。
注解:數組前兩個數要事先賦初值,還有要注意fibonacci數列的計算式。
(2)流程圖
3.本題調試過程碰到問題及解決辦法
換行判斷條件為"i%3==0",導致錯誤,因為數組是從0開始計數的。
將判斷條件改為"(i+1)%3==0"即可,也可以定義數組長度為13,然后從1開始計數。
題目7-14 組個最小數
1.實驗代碼
1 #include <stdio.h> 2 int main() 3 { 4 int count[10],i,x; 5 for(i=0;i<10;i++) 6 { 7 scanf("%d",&count[i]); 8 } 9 for(i=1;i<10;i++) 10 { 11 if(count[i]!=0) 12 { 13 printf("%d",i); 14 count[i]--; 15 break; 16 } 17 } 18 for(i=0;i<10;i++) 19 { 20 for(x=count[i];x>0;x--) 21 { 22 printf("%d",i); 23 } 24 25 }return 0; 26 }
2.設計思路
(1)主思路
- 第一步:定義整數型變量i和x(循環變量)、數組count(長度為10);
- 第二步:使用循環為數組count賦初值;
- 第三步:使用循環判定第一個最小非零數並輸出,再令該數下標對應的數組值減一;
- 第四步:使用雙循環結構順序輸出所給數字即可。
注解:用所有所給數字組最小數首位非零。
(2)流程圖
3.本題調試過程碰到問題及解決辦法
本題首次編程陷入了慣性誤區,將輸入10個數順勢思考為輸出最多也為10個數,所以在輸出循環的時候只給了10次輸出,導致錯誤。
將輸出雙循環上限取消,分別以10個數字i變量和每個數字的次數x變量為循環變量控制輸出。
題目7-15 冒泡法排序
1.實驗代碼
1 #include <stdio.h> 2 int main() 3 { 4 const int n; 5 int i,j,x,k; 6 scanf("%d %d",&n,&k); 7 int a[n]; 8 for(i=0;i<n;i++) 9 scanf("%d",&a[i]); 10 for(j=0;j<k;j++) 11 { 12 for(i=0;i<n-j;i++) 13 { 14 if(a[i]>a[i+1]) 15 { 16 x=a[i]; 17 a[i]=a[i+1]; 18 a[i+1]=x; 19 } 20 } 21 } 22 for(i=0;i<n-1;i++) 23 printf("%d ",a[i]); 24 printf("%d",a[n-1]); 25 return 0; 26 }
2.設計思路
(1)主思路
- 第一步:定義整數型變量i和j(循環變量)、x(交換變量)、k(掃描次數)、整數型常量n(數組長度)和整數型數組a(長度為n);
- 第二步:讀入n以確定數組a的長度;
- 第三步:使用循環為數組a賦初值;
- 第四步:用雙循環再加以判斷結構在數組中進行k次的最大值沉底;
- 第五步:使用循環輸出k次冒泡排序之后的數組。
注解:冒泡排序需要注意的是循環結構的判定條件和冒泡方向,本題還應注意輸出格式末尾沒有空格。
(2)流程圖
3.本題調試過程碰到問題及解決辦法
本題為課堂老師重點所講所以提交沒有錯誤,不過對於這道可控制掃描次數的冒泡排序,我用編譯器編譯的時候在循環條件上停留了一會,而且針對末尾無空格進行了調整。
題目7-20 點贊
1.實驗代碼
1 #include<stdio.h> 2 int main() 3 { 4 int n,i,j,k,x,max; 5 static int f[1001]; 6 scanf("%d",&n); 7 for(i=1;i<=n;i++) 8 { 9 scanf("%d",&k); 10 for(j=1;j<=k;j++) 11 { 12 scanf("%d",&x); 13 f[x]++; 14 } 15 } 16 max=f[1]; 17 x=1; 18 for(i=1;i<=1000;i++) 19 { 20 if(max<=f[i]) 21 { 22 max=f[i]; 23 x=i; 24 } 25 } 26 printf("%d %d",x,max); 27 return 0; 28 }
2.設計思路
(1)主思路
- 第一步:定義整數型變量n(點贊的博文數量)、i和j(循環變量)、k(博文特征數量)、x(中間轉載變量)、max(特征最大值數)和靜態數組f(長度為1001);
- 第二步:讀入n以確定接下來的外循環循環數量;
- 第三步:使用雙層f循環結構讀入每一篇博文的特征數量,並將每一個特征編號對應f數組下標的位置計數;
- 第四步:使用循環並判斷條件句獲得f數組中最大的值以及對應的下標;
- 第五步:按照題目格式輸出即可。
注解:本題需要注意的是“如果有並列,則輸出編號最大的那個”。
(2)流程圖
3.本題調試過程碰到問題及解決辦法
本題在進行if條件判斷時,忽視了“並列則輸出編號最大標簽”的要求,所以在進行例題代入時發現錯誤。
改正將if判斷條件的“max<f[i]”改成“max<=f[i]”即可。
題目7-23 判斷上三角矩陣
1.實驗代碼
1 #include<stdio.h> 2 int main() 3 { 4 int i,j,k,x; 5 const int n; 6 scanf("%d",&x); 7 for(i=0;i<x;i++) 8 { 9 int flag=0; 10 scanf("%d",&n); 11 int a[n][n]; 12 for(j=0;j<n;j++) 13 for(k=0;k<n;k++) 14 scanf("%d",&a[j][k]); 15 for(j=0;j<n;j++) 16 { 17 for(k=0;k<j;k++) 18 { 19 if(a[j][k]!=0) 20 { 21 flag=1; 22 break; 23 } 24 } 25 } 26 switch(flag) 27 { 28 case 0:printf("YES");break; 29 case 1:printf("NO");break; 30 } 31 if(i<x-1) 32 printf("\n"); 33 } 34 return 0; 35 }
2.設計思路
(1)主思路
- 第一步:定義整數型變量i、j和k(循環變量)、x(待測矩陣個數)和常數n(矩陣邊長);
- 第二步:讀入x確定最外層循環次數,並構建一個以x為判斷條件的最外層循環(接下來所有步驟都在其循環內);
- 第三步:定義整數型變量flag=0(用於標記);
- 第四步:讀入n確定接下來的矩形大小,定義整數型二維數組a(行列長度都為n)並使用雙循環結構為數組a賦初值;
- 第五步:使用雙循環和判定結構判斷矩陣下三角(不包括主對角線)所有數都為0,若出現不為0則改變flag變量並跳出循環;
- 第六步:以標記變量flag的值判斷上三角矩陣並后跟判斷是否換行的結構。
注解:本題思路的構建在於多層循環的排位使用。
(2)流程圖
3.本題調試過程碰到問題及解決辦法
本題在進行下三角為0與否的判斷時,沒有考慮到主對角線在本題應屬於上三角范圍,下三角沒有主對角線,而直接判斷了帶主對角線的下三角,導致判定出錯。
改正方案就是將控制下三角的for循環條件里的“j<=k”改為“j<k”這樣就不判斷主對角線了。
題目7-27 打印楊輝三角
1.實驗代碼
1 #include<stdio.h> 2 int main() 3 { 4 int i,j,n,a[10][10]={1}; 5 scanf("%d",&n); 6 for(i=1;i<10;i++) 7 { 8 a[i][0]=1; 9 a[i][i]=1; 10 for(j=1;j<i;j++) 11 { 12 a[i][j]=a[i-1][j-1]+a[i-1][j]; 13 } 14 } 15 for(i=0;i<n;i++) 16 { 17 for(j=n-i-1;j>0;j--) 18 printf(" "); 19 for(j=0;j<=i;j++) 20 printf("%4d",a[i][j]); 21 printf("\n"); 22 } 23 return 0; 24 }
2.設計思路
(1)主思路
- 第一步:定義整數型變量i和j(循環變量)、n(打印行數)和整數型二維數組a(行列長度都為10且楊輝三角首行賦初值);
- 第二步:讀入n以確定楊輝三角打印行數;
- 第三步:使用雙循環結構對每行楊輝三角的非首位和非尾位進行運算賦初值,首位和尾位另賦初值;
- 第四步:以n為行數上限使用循環結構按格式輸出楊輝三角。
注解:輸出注意要求正三角,所以在最后的循環里除了注意換行,還要注意每一行前面的空格多少。
(2)流程圖
3.本題調試過程碰到問題及解決辦法
楊輝三角數學上用二項式求得,所以開始編程我的思路就是用二項式定理,進行階乘的時候我用的fact函數,但這個函數我沒有研究過,只是記得老師用過一次,所以拿來用編譯出錯了。
后本想用for循環代替階乘,但是覺得麻煩,不如加法簡單粗暴,所以就改成了加法式,等我解決了階乘問題再更改代碼。
題目7-30 大炮打蚊子
1.實驗代碼
1 #include<stdio.h> 2 int main() 3 { 4 int m,n,i,j,k,x,y,count; 5 scanf("%d %d\n",&m,&n); 6 static char a[22][22]; 7 for(i=1;i<=m;i++) 8 { 9 for(j=1;j<=n;j++) 10 { 11 a[i][j]=getchar(); 12 } 13 getchar(); 14 } 15 scanf("%d",&k); 16 for(i=1;i<=k;i++) 17 { 18 count=0; 19 scanf("%d %d",&x,&y); 20 if(a[x+1][y+1]!='0') 21 { 22 count++; 23 a[x+1][y+1]='0'; 24 } 25 if(a[x+1][y]=='#') 26 a[x+1][y]='1'; 27 else if(a[x+1][y]=='1') 28 { 29 count++; 30 a[x+1][y]='0'; 31 } 32 if(a[x+1][y+2]=='#') 33 a[x+1][y+2]='1'; 34 else if(a[x+1][y+2]=='1') 35 { 36 count++; 37 a[x+1][y+2]='0'; 38 } 39 if(a[x][y+1]=='#') 40 a[x][y+1]='1'; 41 else if(a[x][y+1]=='1') 42 { 43 count++; 44 a[x][y+1]='0'; 45 } 46 if(a[x+2][y+1]=='#') 47 a[x+2][y+1]='1'; 48 else if(a[x+2][y+1]=='1') 49 { 50 count++; 51 a[x+2][y+1]='0'; 52 } 53 printf("%d\n",count); 54 } 55 return 0; 56 }
2.設計思路
(1)主思路
- 第一步:定義整數型變量m和n(二維平面的行列長度)、i和j(循環變量)、k(發射炮彈數量)、x和y(炮彈坐標)、count(消滅蚊子數);
- 第二步:定義靜態字符型數組a(行列長度均為22);
- 第三步:確定二維平面行列長度並用雙循環為其賦初值;
- 第四步:確定炮彈的數量並以此構建循環框架;
- 第五步:在循環框架內確定炮彈的坐標並判斷其坐標和周圍四個位置,根據所對應字符進行相應賦值變化或計數,判定結束輸出消滅蚊子數即可。
注解:本題構建的二維平面數組行列長度都是22,空出最外層的行列,這樣數組在循環時就不會發生越界。
(2)流程圖
3.本題調試過程碰到問題及解決辦法
在count計數之后沒有令該坐標歸零,導致出現錯誤。
解決辦法就是在所有的count計數之后給該坐標賦值為‘0’即可。
- 要求三
上傳成功后coding.net項目的截圖
Git地址:https://git.coding.net/cyq1076926262/14_15-week.git
- 要求四
個人總結
(1)本周你學習了哪些內容?收獲了什么?
①學習了指定數據輸出寬度的表達;
②學習了一維數組的構建、賦初值等有關知識點;
③學習了選擇排序法的排序思想(以冒泡排序為例);
④學習了二維數組的構建、賦初值、行列、主副對角線、上下三角等有關知識點;
⑤學習了rand函數和srand函數(位於頭文件stdlib.h),需要注意的是srand只需要在所有rand調用前,被調用一次即可,沒必要調用多次;
⑥學習了調用srand(time(NULL))設置隨機數種子(time函數位於頭文件time.h)。
(2)本周所學內容中你覺得哪些是難點?有哪些知識點還不明白?
①通過兩周PTA練習(尤其指附加題),我認為編程之前充分理解題目非常重要,所謂難度也是來自於這里,只有把題目讀透才能更好的構建思路;
②time函數沒有學透,近一段時間抽空仔細研究一下。
- 要求五
1.點評作業
①曹琪(http://www.cnblogs.com/blueblog6/)
②胡俊鮮(http://www.cnblogs.com/123456hjx/)
③張樂(http://www.cnblogs.com/1999-09-22/)
2.學習進度條(11/19 13:00~12/4 8:00)