我の第五篇博客

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

0.展示PTA总分

1.本章学习总结

1.1 学习内容总结

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

  • 顺序查找法
    思路:从左到右一个一个找(用循环)
    特点:对数组内元素大小排序没有要求
    代码:
for (i = 0; i < n; i++)   //循环n次
	if (a[i] == num2)    //找相等的地方
	      flag = 1;      //  flag=1代表找到了
	      break;       //找到了就跳出
  • 二分查找法
    思路:1 到 99顺序数组中找17,取中间数50,发现17比中间数50小,那么范围缩小1到50,如此循环即可。
    特点:数组内元素大小需要按照顺序排列
    代码:
//以数组 1,2,3,....99做示范
while 当左值小于右值
        mid = (low + high)/2 ;//下标的一半,int类型除法取整。
         
        if 查找数 小于 数组中间值
            右边界修改到数组中间值
        else if  查找数 等于 数组中间值
            输出位置,跳出循环
        else 查找数 大于 数组中间值
            左边界修改到数组中间值

⭐2.数组中如何插入数据,怎么做,可以写个伪代码或动态图展示方法

  • 数组右移法
    思路:找到要插入的地方,用循环相邻两个元素右边元素值给左边,直接覆盖掉要删除的元素
    伪代码:
//第一个循环:用来找  插入元素的位置
for (i = 0; i < N; i++)
	if (num < a[i])
	    break;
//第二个循环:把插入元素位置之后的所有元素 全部往右移动
for (int j = N; j > i; j--)
	a[j] = a[j - 1];
a[i] = num; //插入的元素 特殊处理,直接赋值

⭐3.数组中如何删除数据,这个有多种做法,请一一展示。

  • 数组左移法
    思路1.找到删除数据位置,后面的所有元素往左移动覆盖掉要删除数据
    思路2.可以把所有要删除数据,用@取代,最后输出不为 @的元素。
    伪代码:
//第一个循环:用来找  删除元素的位置
for (i = 0; i < N; i++)
	if (num == a[i])
	    break;
//第二个循环:把插入元素位置之后的所有元素 全部往左移动
for (int j = i; j < N; j--)
	a[j] = a[j + 1];

⭐4.数组中目前学到排序方法,主要思路?

  1. 冒泡法排序
    思路:左右两个元素比较大小,如果位置反了,就交换,一直往右循环下去,每循环一轮,就把本轮循环最大的元素冒到了最右边。循环 n 轮,全部元素就排序好了
  • 外层循环: 进行n轮循环,把每轮最大值依次冒泡到右边
  • 内层循环: 只控制一轮循环 , 将本轮循环中的最大值放到右边
    话不多说,直接放图(来自百度图片)
  1. 选择法排序
    思路:另外定义一个变量,保存一轮循环中的最大值的位置,循环结束后把最大值和它应该待的位置做交换,进行 n 轮循环,就放好 n 个元素的位置。
  • 内层循环: 只控制一轮循环,把数组中的每个元素与变量做比较,然后赋值,一轮循环结束后,变量保存此轮循环中最大值下标
  • 外层循环: 进行n轮循环,把n个最大值依次放到该放的位置
    动态图(来自百度图片)

⭐5.数组做枚举用法,有哪些案例?

  1. 数组枚举的定义
    官方:数组的遍历(枚举)对集合中的元素依次不重复的遍历
    我:对数组中的元素依次进行不重复的扫描
  2. 案例:查找整数
  3. 代码:
//下标遍历,从0到(n-1)
for (i = 0; i < n; i++)   //循环n次
	if (a[i] == num2)    //找相等的地方
	      flag = 1;      //  flag=1代表找到了
	      break;       //找到了就跳出

⭐6.哈希数组用法,目前学过哪些案例,举例展示。

  1. 案例:有重复的数据

  2. 思路:取一个数和后面所有数比较一次,相等则退出,不相等,重复步骤,直到所有数都比较完

  • 内层循环:固定一个数,扫描一轮,如果有重复数据flag=1,如果无重复数据flag=0.
  • 外层循环:使每轮固定的数都不一样。
  1. 代码:
int flag = 0;
for (i = 0; i < n - 1; i++)  //外层循环 固定元素
{
	for (j = i + 1; j < n; j++)//内层循环 扫描元素
	{
		if (data[i] == data[j])
		{
			flag = 1;//代表有重复数据
		}
	}
}

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

字符串特点:必须以'\0'结尾,而且中间不能空格,如果空格,会变成两个字符串
字符数组特点:可以包含多个'\0',也可以不包含'\0'

  • 字符数组的初始化
//用单个字符初始数组
char a[5]={'H','e','l','l','o'};
//用字符串初始数组
char a[6]={"Hello"};

Q:为什么两个输出的一样,但字符串的下标却到6了呢?
A:因为字符串必须以'\0'结尾

2.PTA实验作业

2.1 数组循环左移

2.1.1 伪代码

定义数组a[100];
定义数组b[100];

输入n和m;
if m大于n
      m ← n%m;
输入a的所有元素

for 计数器 0 to n-m by i++ do
      b[i] ← a[i+m];
end

for 计数器 n - m to n by i++ do
      b[i] ← a[count];
      count++;
end

输出b[]数组

2.1.2 代码截图


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

进源同学的思路:是将a数组中的所有元素复制一份放在后面 。如12345 复制后变成1234512345,左移几个单位,用循环赋值到前面,最后输出前五个元素
优点:简单易懂
缺点:如果是右移几个单位呢,下标总不能是负数吧! 也可以右移到后五个中保存,最后输出后五个,但这就比较繁琐了。
我的思路:重新定义一个数组b[],保存移动后的数组。如12345变到45123。那我分为两段赋值给b[],一个循环赋值45,另一个循环赋值123.
优点:左右移动都可以用这个方法
缺点:循环起始结束位置不好找,而进源的起始结束都是从 0 到 n

2.2 找鞍点

2.2.1 伪代码

输入二维数组
if 是一阶数组 then
   输出 0 0
   return 0;结束 
for (i = 0; i < n; i++)
{
     for (j = 1, temp = a[i][0]; j < n; j++)   找此行中的最大值
     {
          判断是否有temp < a[i][j]
          有,则将更大的数赋值给temp
     }
     for (j = 0; j < n; j++)  有可能一行有多个最大值,扫描出所有最大值
     {
          if (temp == a[i][j])//有可能每行有多个元素的值等于最大值
          for (h = 0, f = 0; h < n; h++)//判断该最大值是否是所在列的最小值
          {
              判断是否有temp > a[h][l]
              有,则flag=1,代表不是鞍点
          }
          判断flag==0吗
          是,则输出这个鞍点
          return 0;结束         
     }
如果走到这一步,说明没有鞍点
输出NONE
return 0;结束   

2.2.2 代码截图


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

1.做法区别

  • 共同点:我们的思路相差无几,都是先寻找行中的最大值,再考虑那个最大值是否为列最小值
  • 不同点1:超星上判断是否为鞍点,是看循环是否到最后一次了,是用flag的** 0 或 1 代表是否为鞍点**
  • 不同点2:超星break退出循环,直接return 0;暴力终止执行
    2.优缺点
  • 超星优点:思路清晰
  • 超星缺点:判断是否为鞍点,用flag的 0 和 1 代表是否为鞍点,可能更好
  • 我的优点:flag判断是否是鞍点
  • 我的缺点:嵌套层数有点多,return 0;不能经常用,尽量改成break;

2.3 切分表达式

思路:其实这题就是让我们考虑换行的问题,什么情况需要换行,什么情况不需要换行

2.3.1 伪代码

if str[i]是'('或')'或'*'或'/':
     输出str[i],换行
if str[i]是数字或小数点:
    if后一位是数字或小数点:
        输出数字,不换行
    else:
        输出数字,换行
if str[i]是'+'或'-':
    if i==0或前一位是'(':
         str[i]是正负符号,直接输出,不换行
    else
         输出正负符号,换行

2.3.2 代码截图


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

1.做法区别
相差无几,小声bb: "本来就是从超星上学来的"。
2.优缺点

  • 超星优点:第一点思路清晰,把是否换行分为三种情况,第二点 continue可以提前结束本次循环,减少代码运行,提高程序效率
  • 超星缺点:
  • 我的优点:思路清晰,把是否换行分为三种情况
  • 我的缺点:没把“判断是否换行”封装成函数
posted @ 2020-12-13 21:22  强扭的甜瓜  阅读(93)  评论(0编辑  收藏  举报