• 2019年春季学期第四周作业


    程序填空题:

    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
    

    1.实验代码:

    #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 == 0
    ){
    			break;
       		}
      	}
    
      	if (found != 0){
      		printf("Yes
    ");
      	}  
      	else{
      		printf("No
    ");
      	}  
    
    	return 0;
    }
    

    2.设计思路:

    流程图:

    思路:
    就是判断a[i][k]和a[k][i]是否相等,found不等于0时 打印yes

    3.本题遇到的问题及解决方案

    没有遇到问题

    4.实验结果截图:

    基础编程题:

    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,index,k; 
      int num[10];
      scanf("%d
    ",&n);
      
      for(i=0;i<n;i++){     //将输入的数存入数组
        scanf("%d",&num[i]);
      }
      for(k=0;k<n-1;k++){   //循环n-1次
      
        for(i=k+1;i<n;i++){    //寻找最小下标所在
        if(num[i]>num[k] ){  
        index = num[i];     //最小元素与下标为k的元素交换
        num[i] = num[k];
        num[k] = index;
        }
        }
      }
      for(i=0;i<n;i++){   
        printf("%d",num[i]);
       if(i!=(n-1))   //题目要求行末不得有多余空格
       printf(" ");
      }
      return 0;
    }
    

    2.实验设计思路:

    流程图:

    思路:
    先将输入的数存入数组 ,再用for循环循环n-1次 ,
    然后寻找最小下标所在 , 最小元素与下标为k的元素交换
    题目要求行末不得有多余空格
    要注意间隔方式

    3.本题遇到的问题及解决方式

    问题:我开始没有注意题目要求行末不得有多余空格
    解决方式:改为 if(i!=(n-1)) printf(" ");
    问题二:我提交的时候遇到了scanf的警告
    解决方式:我百度了一下,意思是说我没有用到scanf的返回值
    后来改了几个空格 和加了个 就运行正确了

    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
    

    1.实验代码:

    #include<stdio.h>
    int main ()
    {
      int n,i,j,max=0,count=0,k,flag=1,index;//index为下标,max为该行最大值
      int num[6][6];                  //flag记录在该列是否为最小值   count为鞍点
      scanf ("%d
    ",&n);
      for (i=0;i<n;i++){
        for (j=0;j<n;j++){
          scanf ("%d",&num[i][j]);  //将数输入二维数组
        }
      }
     
      for (i=0;i<n;i++){
      	max=num[i][0];
      	index=0;
        for (j=1;j<n;j++){
     if(num[i][j]>=max){   //找到该行的最大值 考虑数相等的情况
      max=num[i][j];
      
       index=j;    //记录列的下标
        }
        }
        for(k=0;k<n;k++){     //判断该数在此列是否为最小值
          if(max>num[k][index]){  
          flag=0;
          }
      }
          if(flag==1){ 
    	   count++;
    	   printf ("%d %d",i,index);
        }
        flag+=1;
      }
      if(count==0)
      printf ("NONE");
       return 0;
    }
    

    2.实验设计思路:

    流程图:

    思路:
    先将数输入二维数组,再用for循环找到该行的最大值 要考虑数相等的情况;
    用index记录列的下标 判断该数在此列是否为最小值 然后下标或NONE

    要注意的地方:

    3.本题遇到的问题及解决方式:

    错误截图:

    解决方式:改为 if(num[i][j]>=max)

    4.运行结果截图:

    7-1 冒泡法排序 (10 分)

    输入1个正整数n(1<=n<=10),然后输入n个整数并存放在数组中,将这n个整数从大到小排序后输出,相邻数字间有一个空格,行末不得有多余空格。

    输入格式:
    输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。

    输出格式:
    在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。

    输入样例:

    4 
    75 71 77 76
    

    输出样例:

    77 76 75 71
    

    1.实验代码:

    #include<stdio.h>
    int main(void)
    {
      int n,i,index,k; 
      int num[10];
      scanf("%d
    ",&n);
      
      for(i=0;i<n;i++){     //将输入的数存入数组
        scanf("%d",&num[i]);
      }
      for(k=0;k<n-1;k++){   //循环n-1次
      
        for(i=k+1;i<n;i++){    //寻找最小下标所在
        if(num[i]>num[k] ){  
        index = num[i];     //最小元素与下标为k的元素交换
        num[i] = num[k];
        num[k] = index;
        }
        }
      }
      for(i=0;i<n;i++){   
        printf("%d",num[i]);
       if(i!=(n-1))   //题目要求行末不得有多余空格
       printf(" ");
      }
      return 0;
    }
    

    2.实验设计思路:

    流程图:

    思路:
    先将输入的数存入数组 ,再用for循环循环n-1次 ,
    然后寻找最小下标所在 , 最小元素与下标为k的元素交换
    题目要求行末不得有多余空格
    要注意间隔方式

    3.本题遇到的问题及解决方式:

    我这个题目没有用冒泡法做 是照着第一题写的

    4.运行结果截图:

    二、学习进度条

    周/日期 这周所花的时间 代码行 学到的知识点简介 目前比较迷惑的题目
    3/4-3/9 6小时 89 新建文件进行读写 二位数组子数组的最大值的求和
    3/10-3/15 8小时 156 二维数组的运用 二位数组子数组的最大值的求和
    3/16-3/22 10小时 120 用二维数组求最大值和鞍点 冒泡法排序

    三、学习感悟

    学了二维数组的使用来求最大值以及求鞍点 学了如何判断矩阵

  • 相关阅读:
    Vijos P1597 2的幂次方【进制+递归】
    NUC1100 Biorhythms【中国剩余定理】
    HDU1370 Biorhythms【中国剩余定理】
    NUC1090 Goldbach's Conjecture【哥德巴赫猜想 】
    NUC1305 哥德巴赫猜想
    剑指Offer——最小的K个数
    剑指Offer——数组中出现次数超过一半的数字
    剑指Offer——字符串的排列
    剑指Offer——二叉搜索树与双向链表
    剑指Offer——复杂链表的复制
  • 原文地址:https://www.cnblogs.com/lyx1314/p/10577446.html
Copyright © 2020-2023  润新知