第14~15周作業


  • 要求二

題目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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM