C语言博客作业04--数组

1.本章学习总结

1.1 思维导图

1.2 本章学习体会及代码量学习体会

1.2.1 学习体会

  • 本章学习了数组,学习了如何定义数组,数组的输入与输出,以及一维数组二维数组字符串数组的运用等。
  • 定义数组时后其中的所有元素会被的随机赋值,可以加上static将其中的所有元素初始化为0。
  • 运用数组时要注意数组下标不能越界,越界了程序会崩溃
  • 在解答特定的问题时可以再定义一个数组,以空间换取时间
  • 数组题型和之前题目比较难度明显提升,写代码耗时也就更长,这时候有没有思路就显得很重要,写代码之前最好先写伪代码再编程,不然会耗费很多时间还写不出来。
  • 在写字符数组代码过程中,不能确定字符数组的长度。可以用strlen函数就解决了

1.2.2 代码累计

2.PTA总分

2.1截图PTA三次题目集:一维数组、二维数组和字符数组共3次题目集的排名得分



2.2 我的总分:

  • 130+85+200=415分

3.PTA实验作业

3.1 PTA题目1

  • 给定两个整型数组,本题要求找出不是两者共有的元素。

3.1.1 算法分析

 int N,M,i,j,k;
 static int flag[41]//定义一个数组用来判断数组是否重复
 int lenc
 for i=0 to N     输入num1[i]     end for          
 for j=0 to M    输入num2[j]     end for
 lenc=N+M//两个数组的长度
 int num[lenc]//储存两个数组
 //对数组进行连接
 for i=0 to N    num[i]=num1[i]    end for 
 for j=0 to M    num[N+i]=num2[i]    end for 
 for i=0 to lenc 
      for j=i+1 to  lenc 
             if   num[i]==num[j]&&i<N&&j>=N    then   flag[j]=1 flag[i]=1
             if   num[i]==num[j]&&j<N    then   flag[j]=1
             if   num[i]==num[j]&&i>=N   then  flag[i]=1
 输出num[i]

3.1.2 代码截图


3.1.3 PTA提交列表及说明

  • Q1:一开始定义flag数组的时候只定义长度为40,结果出错。
  • A1:后来发现定义长度要多一点才可以通过,改成41就过了。
  • Q2:一直找不到比较好的方法解此题,试了很多种方法,也错了很多次。
  • A2:后来使用老师讲的将两个数组结合起来进行比较,就过了。

3.2 PTA题目2

  • 一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。本题要求编写程序,求一个给定的n阶方阵的鞍点。

3.2.1 算法分析

 int n,i,j,k
 int index1,index2;//定义储存行下标和列下表
 int flag=0对输出进行控制
 循环输入num[i][j]
 for i=0 to n
      index1=index2=0
      for j=0 to n
              if  num[i][j]>=num[i][index2]    then   index2=j  //记下最大值的列下标   end  for
      for k=0 to n
              if  num[k][index2]<=num[index1][index2]    then    index1=k  //在最大值那一列开始找列的最小值   end  for
      if  index1==i   then  flag=1  break
 end for
 if  flag==1   then  printf ("%d %d",index1,index2)
 else printf ("NONE")

3.2.2 代码截图

3.2.3 PTA提交列表及说明

  • Q1:一开始忘了每次循环都需要给index1和index2重新赋值为0,进行每一次的计算。
  • A1:后面在每次循环时加上index1=index2=0,结果正确。
  • Q2:一开始一直找不出如何判断找到的元素是否满足题目的要求,试了好多次。
  • A2:后面加上一个判断条件index1==i就正确了。

3.3 PTA题目3

  • 本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。

3.3.1 算法分析

 int i,j,min,len=0,index=0
 char temp用来交换元素
 char str[81] //定义数组
 gets(str) //输入数组
 for  i=0  to  str[i]&&str[i]!='\n'  len++  end for //得出输入的数组的长度
 for  i=0  to  len
       min=i
        for  j=i  to  len
              if  str[j]<=str[min]   then  min=j  //对数组进行排序
        end for
        //交换元素
        temp=str[i];
         str[i]=str[min];
	  str[min]=temp;
         //删除重复的元素并对数组进行新的赋值
         if   str[i]!=str[i-1]   then   str[index++]=str[i]
 end for
 str[index]='\0'
 输出str

3.3.2 代码截图

3.3.3 PTA提交列表及说明

  • Q1:一开始定义数组长度时只有80,结果出错。
  • A1:后来改成81,结果就正确了。
  • Q2:一开始又定义了个数组用来输出结果。
  • A2:但是后来老师讲了可以重置数组,不用重新定义。

4.代码互评

4.1 代码截图

  • 同学的代码

  • 我的代码

4.2 二者的不同

  • 同学的代码时每行都是从头开始找的,也就是都是从下标0开始,这样会使计算的时间增加。
  • 我的代码则是从第几个之后开始找的,也就是从下标i开始,这样会使计算的时间缩短,提高效率。
  • 同学的代码找到符合的元素时并没有跳出循环而是继续找,这样做等于做无用功,只要找到了符合的元素就不会有别的元素符合了,可以直接跳出。
  • 我的代码则是如果找到了符合的元素时,则跳出循环,不用做多余的无用功,效率更高。

posted on 2018-12-08 22:25  拜伦。  阅读(361)  评论(0编辑  收藏  举报

导航