第四次作业
作业要求:https://edu.cnblogs.com/campus/hljkj/CS201802/homework/2522
预先作业
1.观看了4节内容。
2.学习了使用数组和其他的方法去求素数,并如何构造素数表。
并且找出一个数看是否在数组里有对应的数。最后就学了排序,说了两种方法,主要是第二个选择排序,每次选出最大的放到应该放的位置。
3.在讲用数组搜索一个数时用到了定义函数,在平时课堂没怎么讲过,在mooc上也理解的不太好。在我上面的截图,翁恺老师在for()里加了int,和{}里面也加了int,不太清楚是有什么原因和好处。
题目:13-2 输出所有大于平均值的数
1 .实验代码
#include<stdio.h> int main() { int i,n; double average,sum=0; scanf("%d",&n); int a[n]; if(n>=1&&n<=10){ for(i=0;i<n;i++){ scanf("%d",&a[i]); sum=sum+a[i]; } average=sum/n; printf("%.2lf\n",average); for(i=0;i<n;i++){ if(a[i]>average) printf("%d ",a[i]); } } else{ printf("Invalid."); } printf("\n"); return 0; }
2.解题思路
(1)定义一个数组,确定n的范围,利用循环将数组的数全部输入并进行求和。
(2)在求平均数,用if判断是否大于平均数,因为数组可以把数存储下来,直接用if(a[i]>average)就能全部判断。
(3)如果不符合n的范围输入就输入Invalid.题目要求如果没有符合的数就加上空行,所以在最后加上\n。
3.流程图
4.调试信息
刚开始提交时pta显示是部分正确,但调试结果是正确的,
我检查了代码以后,发现第12的avera=sum/10有问题,如果你不是10的话,average就有错误,把10改为n,改完后发现不符合第二个输出样例,还是部分正确,
如果输入0的话就没有平均数,所以要想办法不输入平均数,后来我注意到题目有给n的范围 1<=n<=10,那么就加个if语句让n的范围走,不符合走else输入Invaild.
最后有一个测试点是格式错误,没看到这句话,每个数的后面有一个空格;如果没有满足条件的数,则输出空行所以在最后加上printf("\n");
15.2选择法排序
1.实验代码
#include<stdio.h> int main() { int i,n,t,k,index; int a[10]; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&a[i]); } for(k=0;k<n-1;k++){ index=k; for(i=k+1;i<n;i++){ if(a[i]>a[index]){ index=i; } } t=a[index]; a[index]=a[k]; a[k]=t; } printf("%d",a[0]); for(i=1;i<n;i++){ printf(" %d",a[i]); } return 0; }
2.解题思路
(1)题目要求将数按从大到小排序,就是不断找到最大,第二大,依次往下的数,然后放到前面。
(2)先找最大数就用if(a[i]>a[index]),在设置中间变量t,换到前面,如果只将最大数放到前面,直接和a[0]换即可。
(3)从大到小排,就要用到for循环,并且换的时候a[]里面的数不能是0,需要一个变量。
3.流程图
4.调试信息
提交后出现答案错误,开始调试
只是第一个数和最后一个数,检查代码发现交换处t不能就等于a[0],应该是a[k],一个变量,才能保证交换到不同的位置。
改完后pta显示部分正确,又调试了一下。
6和7的位置应该颠倒一下,for(i=k+1;i<n;i++)的大括号的位置不对,在if语句后就应该括回,交换数直接是与for(k=0;i<n;i++)有关的,for(i=k+1;i<n;i++)把交换的公式括起来,则改变了交换的次数,把大括号改完后就答案正确了。
个人总结
(1)本周学习了数组,主要是用数组把数进行从大到小,或者按照其他要求排序,用数组的平均值等。知道定义数组可以把数存储下来,需要使用时再从数组调用。
(2)交换数的时候下标容易出错,也不好换,把数按大小排时,使用的嵌套for循环,括回里的内容也要注意。
折线图
表格
作业评价
1.https://www.cnblogs.com/wafx/p/10157289.html