• 第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("
    ");
    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("
    ");
    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("
    ");
    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
    ",&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
    ",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)

  • 相关阅读:
    软件测试培训第9天
    软件培训第8天
    软件测试培训第7天
    软件测试培训第5天
    软件测试培训第6天
    软件测试培训第4天
    软件测试培训第3天
    MySQL复杂用法
    MySQL的基本语法
    VM虚拟机上安装Redhat
  • 原文地址:https://www.cnblogs.com/cyq66992152/p/7946077.html
Copyright © 2020-2023  润新知