2019年春季学期第四周作业
这个作业属于哪个课程 | C语言程序设计II |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2774 |
我在这个课程的目标是 | 希望以后碰见类似的题目时能够不出错误的做出来 |
这个作业在哪个具体方面帮助我实现目标 | 告诉我学会运用二维数组解题,也通过找鞍点这个题巩固了自定义函数的运用 |
参考文献 | C语言程序设计(第3版) |
5-1程序填空题
输入一个正整数 n (1≤n≤10)和n 阶方阵a的元素,如果方阵a中的所有元素都沿主对角线对称,输出“Yes”, 否则,输出“No”。主对角线为从矩阵的左上角至右下角的连线,方阵a中的所有元素都沿主对角线对称指对所有i, k,a[i][k]和a[k][i]相等。输入输出示例如下:
输入:
3
1 2 3
4 5 6
7 8 9
输出:
No
代码
#include <stdio.h>
int main(void)
{
int found, i, k, n;
int a[10][10];
scanf ("%d", &n);
for (i = 0; i < n; i++)
for (k = 0; k < n; k++)
scanf("%d", &a[i][k]);
found = 1;
for (i = 0; i < n; i++){
for (k = 0; k < i; k++){
if (
a[i][k]!=a[k][i]
(3分)) {
found=0
;
break;
}
}
if (
!found
){
break;
}
}
if (found != 0){
printf("Yes
");
}
else{
printf("No
");
}
return 0;
}
由题目所给知道前面需要比较a[i][k]与a[k][i]是否相等,若不相等found=0;后面一空即若没有找到。
7-2 选择法排序 (20 分)
本题要求将给定的n个整数从大到小排序后输出。
输入格式:
输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。
输入样例:
4
5 1 7 6
输出样例:
7 6 5 1
1,实验代码
#include<stdio.h>
int main (void)
{
int n,i,k,tmp;
scanf("%d",&n);
int a[11];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)
for(k=i;k<n;k++)
if(a[i]<a[k]){
tmp=a[i];
a[i]=a[k];
a[k]=tmp;
}
for(i=0;i<n;i++)
if(i<n-1)
printf("%d ",a[i]);
else
printf("%d",a[i]);
return 0;
}
2,设计思路
3,遇到的问题及解决方法
问题:for语句中对i后面的数字的for循环的表达式出现错误
解决方法:询问同学,知道了i后面的一个数字应该从k=i开始,且for语句中i的表达式的范围应该为i<n-1;
问题:错误的输入了一个printf
解决方法:自己仔细分析画流程图后发现是错的,然后删除;
问题:一开始写没有考虑到最后一个数字的空格问题
解决方法:写出代码后询问同学仔细审题然后解决;
4,运行图片
7-1 找鞍点 (20 分)
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
输出在一行中按照“行下标 列下标”(下标从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 a[100][100];
int solve(int n,int flag1,int flag2)
{
for(int i=0;i<n;i++)
if(a[flag1][flag2]<a[flag1][i])
return 0;
for(int j=0;j<n;j++)
if(a[flag1][flag2]>a[j][flag2])
return 0;
return 1;
}
int main (void)
{
int n,i,j,flag1,flag2,found=0;
flag1=0;flag2=0;
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=0;j<n;j++){
if(solve(n,i,j)){
printf("%d %d",i,j);
found++;
}
}
if(found==0)
printf("NONE");
return 0;
}
设计思路
遇到的问题及解决方法
问题:不知道如果进行行与列的下标的比较
解决方法:询问同学,用自定义函数解决
问题:对数组进行输入后不知道后面的步骤怎么做
解决方法:与同学交流用两个for语句对行与列进行循环
问题:有地方的小问题没有注意
解决方法:运行结果错误了之后,自己找出错误
运行图片
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 ()
{
int n,i,j,tmp;
scanf ("%d",&n);
int a [n];
char op=' ';
for (i=0; i<n; i++) {
scanf ("%d",&a [i]);
}
for (i=1; i<n; i++)
for (j=0; j<n-i; j++)
if (a [j] < a [j+1]) {
tmp=a [j];
a [j] = a [j+1];
a [j+1] = tmp;
}
for (i=0; i<n; i++) {
printf ("%d",a [i]);
if (i<n-1) {
printf ("%c",op);
}
}
return 0;
}
设计思路:
遇到的问题及解决方法:
问题:看到题目不懂冒泡法是什么
解决方法:自己查找资料,知道原理就是:冒泡排序需要多次遍历列表,比较相邻的项并交换那些无序的项,每次遍历列表将下一个最大的值放在正确的位置。如果在列表中有n个项目,则第一遍需要比较n-1个项
这个题目因为书上有例题所以问题较少
运行图片:
学习进度条
周/日期 | 这周所花的时间 | 代码行数 | 学到的知识点 | 目前比较疑惑的问题 |
---|---|---|---|---|
2/25-3/3 | 三天 | 45 | 学习数组及用法 | 数组的长度问题 |
3/4-3/10 | 三天 | 40 | 文件的处理问题 | 文件指针的用法 |
3/11-3/15 | 四天 | 50 | 对数组的遍历 | 关于遍历的范围还有不理解的地方 |
3/16-3/22 | 四天 | 80 | 用一维数组和二维数组编程 | 冒泡算法的运用 |
感悟
知识开始变得越来越难了,完成作业的时间所花的时间越来越多,对个人的能力要求也就会越来越高。
对pta的两个题目(选择排序,冒泡法)的区别还是有些不理解