第四周作业

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的两个题目(选择排序,冒泡法)的区别还是有些不理解

原文地址:https://www.cnblogs.com/hxy2017826779/p/10564391.html