2019第四周作业

2019年春季学期第四周作业

12. 头文件

1 2
课程名称 c语言程序设计2
作业要求 https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2774
我的课程目标 我希望通过c语言的学习,实现编写主析取范式和主合取范式的程序
这个作业在哪个方面帮助我实现目标 理解选择排序和冒泡排序,懂得了排序的多种方法。对于找一个特定的点可以用循环结构实现
参考文献 课本c语言程序设计 https://www.cnblogs.com/eniac12/p/5329396.html#s2 https://www.cnblogs.com/eniac12/p/5329396.html#s1

基础作业1
7-2 选择法排序 (20 分)
本题要求将给定的n个整数从大到小排序后输出。

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

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

输入样例:

4
5 1 7 6

输出样例:

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语句判断是不是最后一个数,不是就输出,是就不输出。运行正确,问题解决。

(四)运行结果截图

基础作业2找鞍点

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 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上的题,找鞍点花费了我很久的时间。复习了以前的函数,循环结果,对于自定义函数有了一个更深的理解,回顾了一些数据类型和表达式,整型、实型、字符型数据的输入与输出,先从基础开始。对于二分法排序的掌握远远不够,会一点但弄不出完整的代码。预习了数组后面的判断回文,统计字符串中数字字符的个数。进制的转换也是一大难点,该好好努力了。

posted @ 2019-03-21 17:20  小嗝嗝爱作业  阅读(332)  评论(1编辑  收藏  举报