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];,在内存中各个元素也同样是按顺序排列;
    • 字符串特点
      字符串简而言之是一串字符数组加上结束符'\0';
      字符串在static下的初始化的值为'\0'(也就是0,好像没啥区别);
    • 编程注意事项
      字符串大小不只是根据输入的字符长度定义,还需考虑结束符'\0'与回车'\n'(fgets())
      遍历字符串时可以以是否为结束符为判断结束条件;
      fgets()函数读取字符串时会读入额外的回车'\0',而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 '\n'
end for
end

2.3.2 代码截图

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

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

posted @ 2020-12-13 20:17  DuckSword  阅读(136)  评论(0编辑  收藏  举报