• 我の第五篇博客


    这个作业属于哪个班级 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.字符数组、字符串特点及编程注意事项。

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

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

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

    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可以提前结束本次循环,减少代码运行,提高程序效率
    • 超星缺点:
    • 我的优点:思路清晰,把是否换行分为三种情况
    • 我的缺点:没把“判断是否换行”封装成函数
  • 相关阅读:
    剑指offer63:数据流中的中位数
    剑指offer62:二叉搜索树的第k个结点,二叉搜索树【左边的元素小于根,右边的元素大于根】
    剑指offer61:序列化二叉树
    关于手机拍摄的图片在处理过程中出现问题的解决方法
    一道逻辑思考题
    鼠标右键无反应解决方法
    六大设计原则
    开源镜像网站
    获取当前文件夹下的文件名称
    wget使用方法
  • 原文地址:https://www.cnblogs.com/qq690775749/p/14130392.html
Copyright © 2020-2023  润新知