C博客作业04--数组

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

0.展示PTA总分(两张)


1. 本章学习总结

1.1 学习内容总结

1.1.1 查找数据的方法

  • 直接查找
    使用循环语句从头到尾历遍数组,把所有的数据都查一遍.
int key;

int num[10]={0,1,2,3,4,5,6,7,8,9}

scanf("%d",&key);
for(int i=0;i<len;i++)
{
      if(key==num[i])
      {
            printf("%d",i);
      }
}
if(i>=9)
{
      printf("not found");
}

直接查找在要查的数组元素较少时还不错,但是面对数组元素较多时,如10000000000....,直接查找就显得很吃力了。

  • 二分查找
    • 二分法查找原理如下:
  1. 将有序数组分为三个部分,分别为中间值前(中间值数之前的一组数据),中间值 和中间值后(中间值之后的一组数据);
  1. 将要查找的数与中间值的数相比较,等于则退出查找,小于则在中间值前进行比 较,大于在在中间值后进行比较,依次递归,直至查找到对应的值为止;
  • 二分法流程如下:

2. 插入数据的方法

  • 先用循环试着历遍数组,逐个比较大小,以找到插入数应该放的位置。在插入位置以后的数组元素依次右移一位完成。

3. 删除数据的方法

  1. 删除数组中指定位置的元素

    • 设置循环,从要删除的元素所在位置开始,之后的元素依次向左移动一位,直接把要删除的元素覆盖。
  2. 删除数组中的重复元素

    1. 定义一个辅助数组hash[?],下标为目标数组的元素(如果目标数组是字符数组,需减去‘ ’转换成特定的整型数字),辅助数组初值为0;

    2. 输入一个数N,判断hash[N]是否为大于0,如果是则表明元素在目标数组中重复。若hash[N]等于0,说明仅有一个,无重复

    3. 设置循环,如果hash数组对应值为0,就输出;大于0的则不输出,即重复的元素被删除

1.1.4 数据排序的方法

  • 选择排序

    • 选择排序的步骤:
    1. 在未排序的n个数(a[0]~a[n-1])中找到最小值,将它与a[1]交换;
    1. 在剩下的未排序的n-1个数(a[1]~a[n-1])中找到最小数,将它与a[1]交换;

    n-1. 在剩下的未排序的2个数(a[n-2]~a[n-1])中找到最小数,将它与a[n-2]交换;

    • 选择排序的流程(以三个数为例):
  • 冒泡排序

    • 冒泡序列的步骤:
    1. 在未排序的n个数中,a[0]与a[1]比较大小,如果a[0]比a[i]大,则交换两个数;
    1. a[1]与a[2]比较大小,如果a[1]比a[2]大,则交换两个数;
      ...

1.1.5 数组做枚举用法

枚举类型在使用中有以下规定:

1.枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值 。
例如对枚举weekday的元素再作以下赋值:
sun=5;
mon=2;
sun=mon;
都是错误的。

  1. 枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2 …。
  1. 枚举的定义枚举类型定义的一般形式为:
    enum 枚举名{ 枚举值表 };
    在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。

1.1.6 哈希数组的用法

  • 定义一个辅助数组,用时间换空间
    1. 定义一个辅助数组hash[?],下标为目标数组的元素(如果目标数组是字符数组,需减去‘ ’转换成特定的整型数字),辅助数组初值为0;

    2. 输入一个数N,判断hash[N]是否为大于0,如果是则表明元素在目标数组中重复。

    3. 若hash[N]等于0,说明仅有一个,无重复。


初始化hash数组为0
for i=1 to n
    输入一个数 data
    if
        hash[data]==1:
            有重复数据
            return 0
end for
return 1

1.1.7 字符、字符串数组

  • 一维字符数组

    • 一维字符数组用于窜访字符型数据。它的定义、初始化和引用与其他类型的一维数组一样。例如:
char str[5];
str[5]={'h','e','l','l','o'}
  • 对静态数组的部分元素赋值,其他位置元素为0
    例如:
ststic char s[80]={'h','e','l','l','o'}

  • 字符串

    • 字符串可以存放在一维数组中。例如:
      char str[4]={'a','b','c','\0'}

    • 字符数组的初始化乘可以使用字符常量。例如:
      char str[4]="abc";

    • 字符串初始化

while((str[i]=getchar())!='\n')
{
      i++;
}
str[i]='\0';

或者fgets(str);

字符串有结束符,结束符占一个字节

2. PTA实验作业

2.1 题目(1)

2.1.1 伪代码

2.1.2 代码截图

2.1.3 代码对比同学

  • 同:都是先用循环试着历遍数组,逐个比较以找到插入数应该放的位置。

  • 异:找到位置后,把x插入数组的操作不同:

    • 我的方法是在插入位置以后的数组元素依次右移一位完成;
    • 同学的方法是找到位置后,把比x大的数与x进行交换,之后在新的的数组中,找新的x所在的位置。

两种方法的实质都是通过交换实现插入数据,我是直接逐个交换,而同学的方法是把x当做一个辅助参数,实现交换。

  • 特点:相对于同学的方法,他的代码量少了一点,但我的相对来说运行效率上要更胜一筹。

2.2 题目(2)

2.2.1 伪代码

2.2.2 代码截图

2.2.3 代码对比超星

  • 同:同超新视频一样,我们都是先从行找最大值,再在列找最小值的过程;

  • 异:

    • 在找到行最大值的坐标后,我选择继续找列最小值的横坐标,比较两者的横坐标以确定两者是不是同一个数;

    • 超星视频所讲的是,找到行最大值后,在它所在的那一列,找是否有比它更小的值,如果有,则说明它不是列最小的,即它不是鞍点。

posted on 2020-12-13 21:34  木野  阅读(184)  评论(0编辑  收藏  举报