2019第四周做业

2019年春季学期第四周做业

12. 头文件

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

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

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

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

输入样例:学习

4
5 1 7 6

输出样例:spa

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

(四)运行结果截图

基础做业2找鞍点

7-1 找鞍点 (20 分) 一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。调试

本题要求编写程序,求一个给定的n阶方阵的鞍点。code

输入格式: 输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。htm

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

相关文章
相关标签/搜索