• 14,15周作业(一维,二维数组)


    题目:14-3选择法排序
    1.实验代码

    #include<stdio.h>
    int main()
    {
      int n,i,j,t,k;
      scanf("%d",&n);
      int a[n+1];
      for(i=1;i<=n;i++)
      {
        scanf("%d ",&a[i]);
      }
      for(j=1;j<=n-1;j++)
      {
        k=j;
        for(i=1+j;i<=n;i++)
        {
          if(a[k]<a[i]){k=i;}
        }
        if(k!=j){t=a[k];a[k]=a[j];a[j]=t;}
      }
      printf("%d",a[1]);
      for(i=2;i<=n;i++)
      {
        printf(" %d",a[i]);
      }
    return 0;
    }
    

    2 设计思路
    (1)主要描述题目算法
    第一步:写好基本框架。
    第二步:题目要求输入第一行给出一个不超过10的正整数n,第二行给出n个整数。我就先用scanf语句输入这个n,然后定义数组a[n+1](我让这个数组从a[1]到a[n],省略了a[0]。)
    第三步:要连续输入这n个数,如果用n个scanf显然太费事了,所以我用for循环来输入这n个数(我感觉for循环比while和do-while循环好用)。
    第四步:题目要求在一行中输出从大到小有序的数列,如果输入的数是乱序的,用一个for循环只能将最小值这一个数换到最后面,而其它数字就不一定能按到要求了。所以我就想到再用一个for循环。这就可以让每一个数都进行比较。将j的值赋给k。然后将a[k]与a[i]进行比较,如果a[k]小于a[i],就将i的值赋给j。如果k!=j,就引入中间变量t,使a[k](实际上就是a[i])与a[j]的值进行交换。最终就可以达到题目要求的了。
    第五步:题目要求相邻数字间有一个空格,行末不得有多余空格。我就先单独输出前面没有空格的a[1],然后再用for循环输出前面带又空格的a[i]。
    第六步:输出从大到小有序的数列。

    (2)流程图

    3.本题调试过程碰到问题及解决办法
    <1>一开始出现了下面这样的错误,输入和输出是一样的,中间还要多输入一个3(我也不知道为什么,但将最后正确答案放到pta上时是对的,可能是我的dvc++有问题。),然后我就仔细检查了一遍,发现内循环的i的循环次数有问题,i应该是i<n,而不是i<n-j,我把它当作冒泡循环来做了。

    <2>我改正了上面的错误后,结果还是有错误,如下图所示。经过我仔细调试之后,发现再交换值的地方有问题,经过改正之后就对了。

    <3>我个人更喜欢用冒泡排序发,也许是用的多的缘故。其实这题我一开始是用冒泡排序法做的,然后又用了选择排序法。

    4,提交列表

    题目:15-3 求整数序列中出现次数最多的数
    1.实验代码

    #include<stdio.h>
    int main()
    {
      int i,j,n,b[1000]={0},k=0;
      scanf("%d",&n);
      int a[n];
      for(i=0;i<n;i++)
      {
        scanf("%d",&a[i]);
      }
      for(i=0;i<n;i++)
      {
        for(j=0;j<i;j++)
        {
          if(a[i]==a[j]){b[j]++;break;}
        }
        b[i]++;
      }
      int max=b[0];
      for(i=1;i<n;i++)
      {
        if(b[i]>max){max=b[i];k=i;}
      }
        printf("%d %d",a[k],max);
      return 0;
    }
    

    2 设计思路
    (1)主要描述题目算法
    第一步:写好基本框架。
    第二步:输入在一行中给出序列中整数个数N(0<N≤1000),再用for语句输入N个整数。
    第三步:用双重for语句使输入的N个数一个一个进行比较。只要某个数一出现(不管这个数是否和前面的数或者后面的数相等)就用 b[i]++计数。如果后面出现了与前面相同的数,就用b[j]++使前面的数加1,由于后面的数的位子与前面数的位子不同,所以还要用 b[i]++处理后面的数(其实后面的数用这个处理没什么作用, b[i]++只对刚出现的数起作用)。
    第四步:令max=b[0](让第一个数出现的次数的值赋给max),然后用for循环比较出出现次数最大的b[i]。
    第五步:输出出现次数最多的整数及其出现次数。

    (2)流程图

    3.本题调试过程碰到问题及解决办法
    <1>下面这个错误太坑了,我花了大量的时间去调试,终于发现原来我将a[j]写错成了a[i].就这一个小问题就让我脑力透支,身心俱疲。

    4,提交列表

    题目:15-4 数组元素循环右移问题
    1.实验代码

    #include<stdio.h>  
    int main(){  
        int a[200];//只用一个数组,将原数组元素复制到紧邻的数组空位置中  
        int n, m,i;  
        scanf("%d%d", &n, &m);  
        m = m%n;  
        for (i = 0; i < n;i++){  
            scanf("%d", &a[i]);  
            a[i + n] = a[i];//备份数组元素  
        }  
        for (i = 0; i < n; i++){  
            a[i] = a[i + n -m];  
        }  
        for (i = 0; i < n; i++){  
            if (i == n - 1)//对应题目要求:“序列结尾不能有多余空格”  
                printf("%d", a[i]);  
            else   
                printf("%d ", a[i]);  
              
        }  
        return 0;  
    }  
    

    2 设计思路
    (1)主要描述题目算法
    第一步:题目要求在不允许使用另外数组的前提下来完成,所以我定义一个容量为200的数组a[200]。a[101]到a[200]相当于数组b[100]。
    第二步:然后输入n,m,因为m(向右移的次数)可能大于n(数组中数的个数),所以要m取余n,这样就可以知道数据实际相当右移的次数。
    第三步:输入a[i]的值,然后用 a[i+n]=a[i]做备用数组。
    第四步:因为a[0]到a[2n-1]的值都知道了,所以用for语句加 a[i]=a[i+n-m](左边相当与位子,右边相当于人,依次将符合要求的人往a[0]到a[n-1]的位置上安排)
    第五步:题目要求各数之间用空格分隔,序列结尾不能有多余空格,所以我就在for循环加一个if-else语句,当i等于n-1时输出前后无空格的数,其他的则输出后带空格的数。

    (2)流程图

    3.本题调试过程碰到问题及解决办法
    题目要求在不允许使用另外数组的前提下来完成,我一开始做附加题时确实想不出来,且花了大量的时间,然后参透了互联网,才彻底搞明白,才发现它特简单,没有问题了。

    4,提交列表

    这两周学习内容总结
    <1>学习内容:
    1,这俩周学习了一维数组,二维数组。粗略关于它们的定义,初始化,引用,以及应用。
    2,一维数组的三大重要题型:
    ①选择排序
    ②冒泡排序
    ③求最小值及下标
    3,二维数组的重要题型:
    ①找出矩阵中最大值及其所在位子
    ②方正转置

    <2>重点难点:
    1,选择排序,冒泡排序一开始学感觉还是比较难得,需要不断的温习来巩固这两种题型。

    <3>个人收获:
    1,熟练掌握了一维数组和二维数组的应用知识,对上面所述的题型有了深入的理解,拓展了编程方面的知识。

    <4>在学习中发现的问题
    1,虽然我在课后做pta练习做的很好,但有一部分老师上课讲的内容没有深入掌握(比如找出从1到100之间的素数),我以为老师上课讲的内容很简单,所以没太重视,但我发现这是不行的。以后我要对老师给的每一道例题认真专研。

    <5>不明白的知识点:
    暂时还没有。

    点评其他同学
    孙娜
    http://www.cnblogs.com/sun-na-/p/7875394.html

    郭志康
    http://www.cnblogs.com/gzk08-20/p/7953871.html

    张乐
    http://www.cnblogs.com/1999-09-22/p/7966613.html

    我的GIT地址
    https://git.coding.net/AI1452349541/H.K.2.2.git

    上传截图:

    14周学习进程

    15周学习进程

    热爱每一天
  • 相关阅读:
    数据仓库-数据清洗
    数据仓库-维度模型(模型类型、建模过程)
    数据仓库-维度
    I am going to India on a business trip
    Android O编译前修改文件和目录权限
    apktool介绍
    Android中国官网资源网站
    android7.0后对于detected problems with app native libraries提示框显示
    android7.0后对于file://的限制
    android7.0对于SharedPreferences设置模式的限制
  • 原文地址:https://www.cnblogs.com/blueblog6/p/7886541.html
Copyright © 2020-2023  润新知