zoukankan      html  css  js  c++  java
  • C语言博客作业04--数组

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

    0.展示PTA总分


    1. 本章学习总结

    1.1 学习内容总结

    • 查找数据
    1. 顺序(遍历)查找
      通过循环结构来从数组头(尾)进行遍历,并将数组的每一项与查找的数进行对比查找,如;
    int count = 0;
    for (int i = 0; i < n; i++)
    {
        if (numberList[i] == x)
        {
            count++;
        }
    }
    
    1. 二分查找
      将所欲查找的有序数列一分为二,并将中间数与查找的数进行比较;
      若所查找的数不为中间值,则在所对应大小的二分数列中继续进行二分查找;
      说明:元素必须是有序的,如果是无序的则要先进行排序操作;
    • 插入数据
      在有序数组中插入数据,首先需找到数值所插入的位置,然后将插入位置及以后的数值向后移位即可;
    Begin
    for i = 0 to n-1  //n为数组最大值
    if 找到插入位置
    记录插入位置下标
    end if
    end for
    for i = n to 插入位置
    从数组最后一位开始到插入位置,每一位数向后移动一位
    end for
    将数据插入
    end
    
    • 删除数据
    1. 重构数组
      遍历数组,并将不需要删除的数据依次放入另一个数组;
      适用于所要删除的数据偏多,数组长度偏长的数据;
    for(int i = 0, j = 0, count = 0; i < n; i++)
    {
        if(a[i] != key)       //a[]为原数组;key为删除数据;
            b[j++] = a[i];    //b[]为重构后数组;
        else
            count++;
    }
    
    1. 移位法
      遍历数组,若遍历到要删除的数据,将此数据后的数据依次前移一位,覆盖原数据;
      节省空间;
    int count = 0
    for(int i = 0; i < n - count; i++)
    {
        if(a[i] == key)
        {
            for(int j = i; j < n - count - 1; j++)
            {
                a[j] = a[j + 1];
            }
            count++;
        }
    }
    n -= count;
    
    • 数组排序
    1. 选择法排序
      遍历数组,将数组中的最小(大)值与数组头的值进行交换, 然后将数组的次小(大)值与数组的第二位的值进行交换,重复操作,依次排序;
    for (int i = 0; i < N - 1; i++)
        {
            for (int j = i + 1; a < N; a++)
            {
                if (integer[i] <= integer[j])
                {
                    temp = integer[i];
                    integer[i] = integer[j];
                    integer[j] = temp;
                }
            }
        }
    
    1. 冒泡法排序
      遍历数组,将相邻两位按要求交换排序,并重复操作直到排序完成;
    for (int a = 0; a < K; a++)
        {
            for (int i = 0; i < N - 1; i++)
            {
                if (integer[i] >= integer[i + 1])
                {
                    temp = integer[i];
                    integer[i] = integer[i + 1];
                    integer[i + 1] = temp;
                }
            }
        }
    
    • 哈希数组

    哈希(Hash)是类似 "key" => "value" 这样的键值对集合。哈希类似于一个数组,只不过它的索引不局限于使用数字。
    Hash 的索引(或者叫"键")几乎可以是任何对象。
    Hash 虽然和数组类似,但却有一个很重要的区别:Hash 的元素没有特定的顺序。 如果顺序很重要的话就要使用数组了。——菜鸟教程

    • 字符数组、字符串特点及编程注意事项。
      • 字符数组
        正如名字所写,字符数组是由字符组成的数组,它拥有数值型数组的特点,也有一些自己的特色;
        它的定义方式与数值型数组相同char s[100];,在内存中各个元素也同样是按顺序排列;
      • 字符串特点
        字符串简而言之是一串字符数组加上结束符'';
        字符串在static下的初始化的值为''(也就是0,好像没啥区别);
      • 编程注意事项
        字符串大小不只是根据输入的字符长度定义,还需考虑结束符''与回车' '(fgets())
        遍历字符串时可以以是否为结束符为判断结束条件;
        fgets()函数读取字符串时会读入额外的回车'',而gets()不会;它们都接受带空格的字符串;
        scanf("%s",str);以%s只能读入连续的字符串,也就是第一个空格前的所有字符;

    2. PTA实验作业

    2.1 数组循环左移

    2.1.1 伪代码

    Begin
    get 数组长度n 与 移动长度m
    get 数组a[]
    for i = 0 to m
    保留数组首位数据temp = a[0]
        for j = 0 to n - 2
        a[j] = a[j + 1] //前移一位
        end for
    将数组头数据放入数组尾a[n - 1] = temp
    end for
    put a[]
    end
    

    2.1.2 代码截图

    2.1.3 余智康同学的代码


    智康同学将代码封装函数,提升了代码的可读性;
    将交换数据处理,使其小于数组长度便于处理;
    通过定义额外一个数组来进行一次交换,通过牺牲小部分空间来换取时间;

    2.2 找鞍点

    2.2.1 伪代码

    Begin
    get 矩阵长宽n
    get n*n矩阵
    int 判断是否找到鞍点flag = 0
    for i = 0 to n
        for j = 0 to n
            if a[i][j] = 行最大值
                if a[i][j] = 列最小值
                    put i, j; flag = 1;
    end if end if end for end for
    if flag = 0
    没找到 输出NONE
    end 
    

    2.2.2 代码截图

    2.2.3 与超星视频做法区别,以及各自优缺点

    我通过一个sort()函数来进行列与行的排序,再将每一行的各个元素与最大值或最小值进行比较,耗费计算机资源较多;
    超星则是直接通过if语句进行寻找最大值下标,在进行列上的比较,若不为最小值则跳出循环,耗费资源少,高效;

    2.3 切分表达式

    2.3.1 伪代码

    Begin
    get 字符串s[]
    int numberFlag = 0;
    /*已知有多重情况需要处理:数字,算式开头的负数(无括号),算式中间的负数(有括号),减号后带的正数*/
    for i = 0 to s[i] = 0
        if 字符串首为'-'
            通过numberFlag与continue语句输出负数
        if 字符为连续'(''-'
            通过numberFlag与continue语句输出负数
        if 字符为数字
            通过numberFlag与continue语句输出整数
        if 字符为其他字符
            输出字符
        put '
    '
    end for
    end
    

    2.3.2 代码截图

    2.3.3 与超星视频做法区别,以及各自优缺点

    思路上区别不大,超星视频中对数据的处理和资源的占用上考虑的较为周到,值得学习;

  • 相关阅读:
    java多线程2-总结
    java多线程1-生产者与消费者
    jedis中的两组方法
    理解socket的阻塞
    java设计模式5-命令模式
    我的BIOS
    java设计模式4-装饰者模式
    java设计模式3-单例模式
    android四大组件
    android:theme
  • 原文地址:https://www.cnblogs.com/YasakaKiyokaze/p/14110609.html
Copyright © 2011-2022 走看看