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