首页 > 技术文章 > C语言博客作业04--数组

xiechi 2020-12-13 22:29 原文

| 这个作业属于哪个班级 |


| ---- | ---- | ---- |
| 这个作业的地址 |
目录

    |这个作业的目标 |学习数组相关内容|
    |姓名|王鑫|
    目录

      0.PTA展示


      1.本章学习总结

      1.1学习内容总结

      1.1.1 数组总共如何查找数据

      如果这个数组是按照顺序的我们可以使用二分法查找,这样效率比较高

      
      for(int i=min;i>=0||i<=top;)
      {
       min=(top+bott)/2;//每轮把中间值更新
      //判断是否为我们需要的数值,并作出相应的变化
        if(date[min]==num)
      {
      printf("find it!");
      break;
      }
      else if(date[min]<num)
      bott=min+1;
      else
      top=min-1;
      }
      
      

      如果不是顺序排列我们可以用数组一个个找

      //设一个循环来做这件事
      for(int i=0;letter!='\0';i++)//字符型数组的结尾会自动带上一个'\0',ASCII码为0,所以字符型数组长度要多留一位
      {
      if(letter[i]==num)
      printf("find it");
      break;
      }
      

      1.1.2数组中如何插入数组

      /*先通过对比找到位置也就是下标*/
      for int i to n
      if date[i]=num
      then index=i;
      end if
      end for 
      /* 再把后面的数字一个个往后面移空出一个位置给我们新来的数字*/
      for int i=n to index i--//要从最后面开始挪,才能保留住数据不会被覆盖
      date[i]=date[i+1];
      end 
      date[index]=num;/* 最后把我们的数字插进去,这里本来的数字被我们往后面移了,数据就不会被覆盖*/
      
      • 下面是PTA 上的截图代码

      1.1.3数组中如何删除数据

      数组中的元素删除和数组中插入数据很像。一个是整体左移,一个是整体右移。

      • 像数组中删除数据就是整体左移,让后面的数据把前面要删除的数据覆盖,就能实现删除。
      • 还有一种方法就是重构数组,这个方法来自老师发布的测试用两个下标控制数组,当我们不需要这个元素时就控制一个小标不动,而另一个变换并赋值给前面下标控制的数组数,来达到删除的方式。也可以再创建一个数组,来放新的数组。
      //题目要求是把数组中不符合的空格删除
      int i=0,j=0;
      while(stri[i]!='\0')//字符型的往往是以'\0'作为结束的标志,也是我们平时很好用的工具
      {
      if(str[i]!=' ')//当数组中的字符符合不是空格的条件
      {
      str[j++]=str[i];//我们就把字符移到新的下标,也就是j下标所在的数组数
      i++;//要让i++,来判断下一个字符
      }
      str[j]=0;//结束时要给最后的字符赋上结束标志
      }
      

      1.1.4数组中目前学到的排序方法,主要思路

      • 冒泡法小的往上交换,就会让小的像泡泡一样浮上去,就称之为冒泡法。
        主要思路:让数组中相邻的数字进行比较,小的往前移。(如果只是扫描一遍这个数组,只能把最大的放在了最后)我们要再多扫描几遍,扫描到所有数字都在自己的该呆的地方。所以这个交换的过程是一个循环,而每次最大的数字都在最后所以扫描的终点我们要再每次扫描时-1。控制扫描每次都在进行,且终点变化,这时我们就要在外面在设置一个循环来使扫描进行多次。
      • 选择排序法,多次扫描,把大的往后面放,来达到最终的排序
        主要思路:设置一个循环来做扫描的工作,在这个循环外面再套一个循环,使扫描我们想要的次数。

      1.1.5数组做枚举用法,有哪些案例

      • 计算某个月的天数
        因为天数和月份有对应关系,可以用二维数组来存放天数,再根据不同的月份找到相应的数字。
      int k,keep;
      /*数组初始化,将每月的天数赋给数组*/
      innt tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
                     ={0,31,29,31,30,31,30,31,31,30,31,30,31}};
      /*判断闰年,判断year是否为闰年,如果是闰年就让leap=1;不是就让,leap=0*/
      /*计算天数*/
      for(k=1;k<month;k++)
      day=day+tab[leap][k];
      

      1.1.6哈希数组用法,目前学过哪些案例,举例展示

      • 哈希数组是用空间来换取时间,我们查找数据能提高效率。用来查找重复数据很方便。
        哈希数组就是把可能出现的所有的数字作为一个数组的名字,当出现这样的数据就让数组里面+1.到时候再看里面是否为单独数据。超过1就不输出。

      1.1.7字符数组、字符串特点及编程注意事项

      • 字符型数组的结尾会加上'/0',所以我们要把字符型数组的长度要比原来的长度+1;
      • 因为结尾是'/0',所以我们字符型的数组做循环的结束条件,就可以把结束的条件设为不为0;
      • 数组的名字是数组的首地址,传地址时可以传数组名,这时的数组代表的数字是数组第一个,下标为0的。
      • 可以用不同的的输入和输出,scanf("%s",date),fges(date,n,stdin),(gets VS 不能通过);但scanf不能接受空格,已有空格就会停下。
      • fgets()读取到的换行符、文件尾或读完n-1个字符结束,包括换行符。

      2PTA实验作业

      2.1 数组循环左移

      2.1.1伪代码

      //先观察数据的类型需要什么样的变量,然后设置相关的变量
      总数  n,
      左移的位置的下标 m,
      存放数组 a[100]
      //我们把需要的数据输入进来
      输入  n,m,a[];
      for i to n  //先把数组我们要移动的移到后面去
      a[n+i]=a[i];
      
      for i=m(我们初始移动的) to n+m(移动后我们的总长度)//把整个数组往前移
      a[i-m]=a[i];
      //最后输出前面n个数组中的数据
      
      

      2.1.2代码截图

      2.1.3代码对比



      我的代码:for循环有点多,没封装使得有点乱。想法会更直接,粗暴。这样在别的地方就要重新更改代码。我是先把要移动的次数往前移动数组,这样花费的空间会更大,所以使用时还要多留一些空间。
      别人的代码:函数封装,界面简洁,这种可以用的范围更广,分成小的步骤,多次循环就可以让思路清晰,可以用到别的地方。

      2.2鞍点

      2.2.1伪代码

      //先观察应该会有的变量
      /*根据题目要求,我们要设置一个代表矩阵行列数的n,我们会运用到最大值,最小值还有两个下标*/
      输入:n,num[6][6];
      //判断行最大的数值,记住下标(因为下标有两个,所以设置两个循环来分别控制两个下标
      for i to n 
      for j to n//这个循环就可以找到我们这一行的最大值
      如果num[i][j] 大于max
      //记住下标
      index1=i;
      index2=j;
      max=num[i][j];
      end if
      end for// 这时找到这一行的最大值,我们要去找最大值这一列的最小值是不是它自己
      min=max;// 赋值给最小值
      for p to n
      如果 num[p][index2] 小于min
      min附上num[p][index2]的值
      end if
      end for
      如果 min=max
      输出两个下标 index1 和index2 
      end if
      没有等于就输出 NONE;
      end for// (最开始控制数组行下标的)
      

      2.2.2代码截图

      2.2.3和超星视频的区别,各自优缺点

      我的代码:有的地方可以实行跳出,减少不必要的循环时间和资源浪费。变量比较多和复杂。
      超星:代码简洁清晰,使用break来跳出循环,减少不必要的时间浪费。用循环全部完成时变量满足条件,来看是否找到鞍点,和前面使用break结合,可以判断是否能找到鞍点。

      2.3切分表达式

      这题我测试点有一个一直过不去,去看了视频。

      2.3.1伪代码

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

      2.3.2代码截图

      {{uploading-image-656361.png(uploading...)}}

      推荐阅读