1 | 2 | |
---|---|---|
课程名称 | c语言程序设计2 | |
做业要求 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2774 | |
个人课程目标 | 我但愿经过c语言的学习,实现编写主析取范式和主合取范式的程序 | |
这个做业在哪一个方面帮助我实现目标 | 理解选择排序和冒泡排序,懂得了排序的多种方法。对于找一个特定的点能够用循环结构实现 | |
参考文献 | 课本c语言程序设计 http://www.javashuo.com/article/p-wfvodyqs-ep.html http://www.javashuo.com/article/p-wfvodyqs-ep.html |
基础做业1 7-2 选择法排序 (20 分) 本题要求将给定的n个整数从大到小排序后输出。html
输入格式: 输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。数组
输出格式: 在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。函数
输入样例:学习
4 5 1 7 6
输出样例:spa
7 6 5 1
#include<stdio.h> int main (void) { int i,max,k,n,temp; int a[10]; scanf("%d", &n); for(i=0; i<n; i++) scanf("%d", &a[i]); for(k=0; k<n-1; k++){ max=k; for(i=k+1; i<n; i++) if(a[i]>=a[max]) max=i; temp=a[max]; a[max]=a[k]; a[k]=temp; } for(i=0; i<n; i++){ printf("%d",a[i]); if(i!=n-1) printf(" "); } return 0; }
第一步:定义变量;第二步:将输入数依次赋给数组a。第三步:用一个变量存放最大值,再寻找最大值所在的下标。第四步,消除行末的空格,输出排序后的数。设计
本周老师帮咱们详细讲解了选择排序法,书上有从小到大选择排序的例题,本题正好相反。问题:C++上运行正确,pta上却格式所有错误。行末多输出一个空格。解决方案,第一步先把空格去掉,结果部分正确,第二步,在输出a[i]的语句后加一个if语句判断是否是最后一个数,不是就输出,是就不输出。运行正确,问题解决。 3d
7-1 找鞍点 (20 分) 一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。调试
本题要求编写程序,求一个给定的n阶方阵的鞍点。code
输入格式: 输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。htm
输出格式: 输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。若是鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
输入样例1:
4 1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9
输出样例1:
2 1
输入样例2:
2 1 7 4 1
输出样例2:
NONE
#include <stdio.h> int main(void) { int n, i,j,min, k=0,x=0, y=0,flag=0; int a[6][6]; scanf("%d", &n); for(i=0; i<n; i++){ for(j=0; j<n; j++){ scanf("%d", &a[i][j]); /*遍历数组*/ } } for(i=0; i<n; i++){ for(j=1; j<n; j++){ if(a[x][y]<=a[i][j]){ /*给x和y赋值代替行和列*/ x=i; y=j; } } for(min=0; min<n; min++){ /*构建一个新矩阵进行比较使行最大*/ if(a[x][y]<=a[min][y]){ k++;/*知足条件用来计数*/ } } if(k==n){ /*知足行最大列最小*/ printf("%d %d",x,y); flag=1; } k=0; x=i+1;/*当i=0加上只有一个数的状况,也是鞍点*/ y=0; } if(flag!=1){ printf("NONE"); } return 0; }
提交答案时部分正确,只有一个数的状况没加进去,此状况下也是鞍点。定义的变量多了致使思惟混乱赋值时赋给了另一个不该该赋的变量。仔细检查,检查不出调试才解决。作了很久,第一次用的方法是直接进行最大最小值的比较直接找鞍点,怕是我太菜了,老是提交不正确,第二次经过找鞍点的位置进行代码的改换才正确。
7-1 冒泡法排序 (10 分) 输入1个正整数n(1<=n<=10),而后输入n个整数并存放在数组中,将这n个整数从大到小排序后输出,相邻数字间有一个空格,行末不得有多余空格。
输入格式: 输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式: 在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。
输入样例:
4 75 71 77 76
输出样例:
77 76 75 71
#include <stdio.h> int main(void) { int n, i, j, temp; int a[10]; scanf("%d", &n); for(i = 0;i < n;i++) { scanf("%d", &a[i]); } for(i = 0;i < n;i++) { for(j = 0;j < n - i - 1;j++) { if(a[j] <= a[j+1]) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } for(i = 0;i < n;i++) { printf("%d", a[i]); if(i != n-1) printf(" "); } return 0; }
经过前一个数与后一个数比较大小,若是后面一个大的话自动交换位置,用if语句加for循环便可解决,注意最后输出时应加入一个if语句消除空格;
冒泡排序老师没教,为本周的挑战做业,我以为比选择排序更加容易理解。在360上搜了冒泡排序的用法后,遇到了一点小问题,输入数组元素时粗心没把数组取地址,致使段错误; 加上取地址符后问题解决。
###学习进度 |||||||||||||| |:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--| |周/日期|这周所花的时间|代码行|学到的知识点简介|目前比较迷惑的问题| |3/17-3/21|3天|240|用一维数组进行多种方法的排序,二维数组的遍历及主副对角线的区分|找鞍点一题为何比较数组之间的值pta通不过,找位置却能够|
###学习感悟 本周除了学习二维数组外,作了pta上的题,找鞍点花费了我好久的时间。复习了之前的函数,循环结果,对于自定义函数有了一个更深的理解,回顾了一些数据类型和表达式,整型、实型、字符型数据的输入与输出,先从基础开始。对于二分法排序的掌握远远不够,会一点但弄不出完整的代码。预习了数组后面的判断回文,统计字符串中数字字符的个数。进制的转换也是一大难点,该好好努力了。