• C语言博客作业04数组


    | 这个作业属于哪个班级 | C语言--网络2011/2012 |
    | ---- | ---- | ---- |
    | 这个作业的地址 | C博客作业04--数组 |
    | 这个作业的目标 | 学习数组相关内容 |
    | 黄帅 | |

    0.展示PTA总分

    展示2张关于“数组题目集”分数截图。

    1.本章学习总结

    1.1 学习内容总结

    数组中如何查找数据,有哪些做法

    • 1.顺序查找
      利用循环语句 若循环到的数与想找的数相等,则找出
    for i=0 to n
    if 与想找的数相等
    break
    end for
    
    • 2.二分法
      多用于有序数组,定义中值、左界和右界变量
    while(high>low)  //high一直减小,low一直增大,当high<low时,说明没找到
       {
         mid=(high+low)/2;
         if(a[mid]>key)  //
         high=mid-1;  /修改右界
         else if(a[mid]<key)
         low=mid+1;  //修改左界
         else //a[mid]=key
         flag=1;
         break;  // key=mid 
       }
    

    数组中如何插入数据

    学习了同学的代码,比我原来的效率高多了
    先判断要插入的x在那个数的后面,然后在判断的数和x交换,就这样一直判断并交换一直到第n-1,然后让第n个数等于x。

    for i=0 to n
          如果num[i]>插入的数
                    交换这两个数
          if i=n
                num[i]=x;
          end if
    end for
    

    数组中如何删除数据

    • 1.在原来的数组中从要删除的元素开始依次赋值为后一位的元素,在把最后一个元素改为'\0'
    • 2.在另一个数组中存放删除过的一系列元素

    数组中目前学到排序方法

    • 1.选择排序法
      选出最大的数和第一个位置的数交换,再在剩下的数中选出最大的数和第二个位置的数交换,以此类推
        for(m=0;m<n-1;m++)
        {
            for (j = m+1; j < n; j++)
            {
                if (a[j] > a[m])
                {
                    temp = a[m];
                    a[m] = a[j];
                    a[j] = temp;
                }
            }
        }
    
    • 2.冒泡排序法
      相邻两个元素比较交换,从第一个元素依次做到倒数第二个元素,一遍遍扫描,最后最大值或最小值就被放在第一位
    for (l = 1; l <= k; l++)
        {
            for (j = 0; j < x - 1; j++)
            {
                if (a[j] > a[j + 1])
                {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
    
                }
            }
            x =x- 1;
        }
    

    数组做枚举用法

    • 枚举与数组的区别

    枚举是标签(定死的),数组是容器(存放数据)

    枚举是值类型,数组是引用类型

    枚举是常量的集合,数组是变量的集合

    枚举对象在任一时刻只能有一个常量值,数组对象在任一时刻可以有多个值

    哈希数组用法

    做题时我们有时觉得自己明明做的对了,但是却提示运行超时,这时我们可以用到哈希数组,以空间换时间,提高效率
    用法是新定义一个数组,存放需要进行判断的元素,对判断元素出现次数进行累计
    如数组第8题,有重复的数据I

    int a[100000];
        static int b[100000];
        int flag = 0;
    for (j = 0; j < n; j++)
        {
            b[a[j]]++;
            if(b[a[j]]==2)
            {
                flag=1;
                break;
            }
        }
    

    字符数组、字符串特点及编程注意事项。

    1.用字符串给字符数组赋值时会多出一个结束符 '\0',数组长度要比字符串大1
    2.scanf("%s",自定义标识符(不用加&));
    不能输入空格,碰到空格结输入结束
    3.字符串需要用一维数组存储

    2.PTA实验作业

    2.1 简化的插入排序

    2.1.1 伪代码

    if 该数小于序列最小的
    序列全向右移动一位
    第一位为X
    else
          if X大于序列最大的
          序列加一位X
          else 
                for j=0 to n
                if X大于这一位小于下一位
                      flag=1
                      break
    if(flag)
    从此位开始全部向右移动一位
    此位=X
          
    

    2.1.2 代码截图

    2.1.3 找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。


    他的思路:先判断要插入的x在那个数的后面,然后在判断的数和x交换,就这样一直判断并交换一直到第n-1,然后让第n个数等于x。
    我的思路:插入的地方右边全部向右移动一位,再插入
    这样一对比,他的代码比我简洁高效多了

    2.2 鞍点

    2.2.1 伪代码

    定义方阵n
    定义控制循环变量i,j,k
    定义x,y记录鞍点下标
    定义数组a
    定义最大值max,最小值min
    定义控制标志变量flag=1
    输入n
    用for循环输入矩阵数
    for j=1 to n
          max = a[j][1]
          for k=2 to n
                if a[j][k] >= max
                max = a[j][k];
          min = a[1][x]
          for i=2 to n
                if a[i][x] <= min
                min = a[i][x]
          if min == max
          输出下标x-1,y-1(因为不是从零开始)
          标志flag=0
    end for
    if flag
    输出NONE
    

    2.2.2 代码截图

    2.2.3 请说明和超星视频做法区别,各自优缺点。

    选择切分表达式这题介绍字符数组。并说明和超星视频做法区别。
    我的做法是将某行最大值与所在列的最小值相比,若相等则证明是鞍点,而视频里是判断循环是否做完即j是否等于n来证明是鞍点,相比更简洁,更方便。
    视频里使用了函数,与我的代码相比更容易看懂,且便于维护。
    我的代码在比较大小后给max的值就是数组元素的值,而视频里给maxIndex的值是数组的下标,相比更加方便,易懂。
    总的来说,我需要学习简洁高效的做法,摒弃效率低的做法。
    判断有无鞍点,我定义了flag变量作为标志来判断,而视频中是判断i是否等于n,相比起来代码量更少,更简洁。

    2.3 切分表达式

    2.3.1 伪代码

    定义控制变量i
    定义数组str
    输入字符串str
    输出s【0】
    for i=1 to str[i]!='\0'&&str[i]!='\n'
          if(数字或点)
          原样输出
                if(左括号)
                右边加换行符
                if(右括号)
                左边加换行符
          if(-号)
                if前一位是数字
                左右加换行符
                else
                原样输出
          if(*号)
          左右加换行符
          if(/号)
          左右加换行符
          if(+号)
                if是否是第一位
                else
                左右加换行符
    end for
    

    2.3.2 代码截图

    2.3.3 请说明和超星视频做法区别,各自优缺点。

    我的代码没有想到用函数,视频中用到了函数,方便阅读和维护。
    视频中还用到了continue这条语句,提前结束循环,提高效率。
    我的思路和视频中的大致相同,但细节上我有些做的不好,如判断‘*’和‘/’没放在一条语句里。

  • 相关阅读:
    python super()
    git用法小结(1)--建立远程仓库
    git用法小结(1)--建立远程仓库
    Linux下多线程查看工具(pstree、ps、pstack)
    JAVA操作Oracle数据库中的事务
    MyEclipse 2013优化配置【转】
    C语言多线程编程 死锁解析
    在linux终端执行clear或top命令时出现:'xterm' unknown terminal type的错误
    Linux中获取本机网络信息的几个函数及应用
    基于内存的通信之一 “内核共享消息队列”
  • 原文地址:https://www.cnblogs.com/jingzheng001/p/14130445.html
Copyright © 2020-2023  润新知