第四周作业
C语言设计程序。
2019年春季学期第四周作业。
我希望能更加掌握好c语言,让我能更好学习其它的语言。
更了解了二维数组。
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
{ int i,j,n,a[6][6],max[6],min[6],cp=0; scanf("%d",&n); for(i=0; i<n; i++) { for(j=0; j<n; j++) { scanf("%d",&a[i][j]); } } int k=0,y=0,flag=1,p=0; for(i=0; i<n; i++) { y=i; for(p=0; p<n; p++) //找行最大值 { if(a[i][k]<=a[i][p])//数组元素之间比较,若比a[i][k]大,则将数组列标赋给k { k=p; max[i]=a[i][p]; k=p; } } } p=0; for(j=0; j<n; j++)//判断是否为列最小值 { for(i=0;i<n;i++) { if(a[i][j]<=a[p][j]) { min[j]=a[i][j]; p=i; } } } for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(max[i]==min[j]) { printf("%d %d",i,j); cp++; } } } if(cp==0) printf("NONE"); return 0; }
设计思路:很朴素的想法,输入数组后,将每一行的最大值找出来,然后将每行最大值储存下来,,再利用一个循环,这个循环是找出储存下来的最大值中的最小值,最后将这个值的下标进行输出。
所遇到的问题及其解决方法:这里在室友的提示下使用了一个cp++,来作为判断。这道题是和我室友一起写的,他的思路和我不同,他是每一行每一行的比,最后找出那个每行最大每列最小的值,他那种方法较简单但是不容易想到,可能是因为我的逻辑太简单了,就用了这个for比较多的,比较明了的方式表达出来。
7-2 选择法排序 (20 分)
本题要求将给定的n个整数从大到小排序后输出。
输入格式:
输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。
输入样例:
4
5 1 7 6
输出样例:
7 6 5 1
#include<stdio.h> int main() { int N,i,j,value[10],t; scanf("%d",&N); for(i=0;i<N;i++) //输入整数 于数组中 { scanf("%d",&value[i]); } for(i=0;i<N;i++) { for(j=0;j<N;j++) { if(value[i]>value[j]) { t=value[i]; value[i]=value[j]; value[j]=t; } } } for(i=0;i<N;i++) { printf("%d",value[i]); if(i<N-1) printf(" "); } return 0; }
设计思路:这道题是利用第一个数字与后面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[k][i]!=a[i][k] (3分)) { found=0 ; break; } } if ( found == 0 ){ break; } } if (found != 0){ printf("Yes\n"); } else{ printf("No\n"); } return 0; }
填空思路:题目所给出的是沿对角线相等所以,if里判断的就是是否相等,下面就是判断跳出的条件,当found是零时跳出并判断,因为刚开始赋值为1,。
所遇到的问题及其解决方法,刚开始我将第二个if写成了a[k][i]==a[i][k],答案一直是yes,后面在搭档的提醒下改为了found==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,a[10]; int i,j,t; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } for(i=0;i<n;i++) { for(j=0;j<n-1;j++) { if(a[j]<a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } for(j=0;j<n;j++) { printf("%d",a[j]); if(j<n-1) printf(" "); } return 0; }
设计思路:这道题的思路就是将两个数进行比较,然后两个值进行互换大的值就放到第一位。
这道题刚开始还是按着书上的那个写的,有一个子函数,由于编译器上答案正确但是到pta上有错误,我将子函数去掉了。
#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 ((3分)) {
;
break;
}
}
if (){
break;
}
}
if (found != 0){
printf("Yes\n");
}
else{
printf("No\n");
}
return 0;
}