第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)

posted @ 2017-12-03 18:49  C6H6  阅读(398)  评论(11编辑  收藏  举报