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这条语句,提前结束循环,提高效率。
我的思路和视频中的大致相同,但细节上我有些做的不好,如判断‘*’和‘/’没放在一条语句里。

posted @ 2020-12-13 21:31  黄帅2011  阅读(53)  评论(0编辑  收藏  举报