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

0.展示PTA总分(0----2)##



1.本章学习总结(2分)#

1.1 学习内容总结##

  • 数组中查找数据一般有顺序查找法和二分查找法。顺序查找法就是把数组中的每一个元素依次和要查找的数据相比较,二分查找法就是每次和中间的一个数据比较,逐渐缩小范围。
  • 数组中插入数据
定义一个数组a,一个要插入的数x,数组的长度n,要插入的位置m。

输入一个数组
输入插入的数和位置
for(i=n;i>m;i--)
    a[i]=a[i-1];
end for
a[m]=x;
输出一个新的数组
  • 数组中删除数据
定义一个数组a,要删除的数据num,数组长度n。

输入一个数组
输入要删除的数据

for(i=0;i<n;i++)
{
 if(a[i] == num)
 {
   for(j=i;j<n-1;j++)
    a[j]=a[j+1];
   end for
   n--;
 }
 end if
}
end for
输出删除了num后的数组a
  • 数组中目前学到排序方法有冒泡排序法和选择排序法。冒泡排序法的思路是外循环经过n-1次循环,内循环主要是第一个和第二个数比较,第二个和第三个比较,以此类推,相邻两个数比较,并作交换;选择排序法的主要思路是外循环也经过n-1次循环,而内循环是找到最小的,让它和第一个元素交换。

  • 数组做枚举用法:计算一年中的某一天在该年的天数。

  • 一维数组的定义一般形式为:类型名 数组名 [数组长度],下标取值范围是[0,数组长度-1],初始化一般形式为:类型名 数组名 [数组长度]={初始值}。

  • 二维数组的定义一般形式为:类型名 数组名 [行长度][列长度]={初值表}。

  • 学到了怎么判断一个字符串是否回文,输入一行字符串是,一般以回车结束,而在数组中则是以'\0'结束,学到了怎么把回车转换成数组中的'\0'。字符数组的定义,比如char ch[有效长度],对字符数组初始化时,比如char ch[6]="Happy";其中"Happy"的有效长度为5,但因为含有'\0',所以数组长度为6,字符串由有效数字和字符串结束符'\0'组成。学到了进制的转换,对于n 进制,数字字符时,number = number * n + a [i]-'0',字母时,number = number *n+ a [i]-'A'+10或者number = number *n+ a [i]-'a'+10。

1.2 本章学习体会##

  • 经过对本章的学习,发现很多问题用数组来解决会变得特别方便简单,也很巧妙,就拿以前在pta上做过的一道题来说,就是那道某天在一年中的天数的题,没学数组前,方法特别笨,写了很长很宽,但学了数组后,巧妙运用数组很快就写出来了,代码量也很少。从数组开始,好像题量有些增加,又加上我做题速度特别慢,因为还有其他的事情,就有点跟不上了,很乏力,越来越抽不出时间了,我也不知道为什么别人就可以做那么快,思路和飞了一样,突然就想,有些东西好像不单单只靠努力就行的,还要有天赋,我就是可能没计算机这方面的天赋,接受起来就很慢,别人一个小时接受的,我可能要一天,就好比别人数学比我差点,大概我就是数学方面有些天赋吧,真的有时候想要放弃,感觉再怎么努力也没用,因为我没天赋啊,但我又想不能放弃,如果放弃了,就白白浪费了前面十几年的努力,所以我还要坚持,把所有零碎时间都挤出来,放假不休息,虽然追上别人很难现在看来,但我能追一点是一点,也有可能一点都追不上,但起码会比以前的自己好点,默默给自己加油!加油!加油!加油!(好累)
  • 代码量大概只有736行。

2.PTA实验作业(7分)#

2.1 7-4 数组循环左移##

2.1.1 伪代码###

定义一个数组a,数组长度n,行为i,记录移动次数的变量j,移动次数m,存放数据变量item。

输入数组长度和移动次数
输入一个数组

for(j=1;j<=m;j++)
{
      item = a[0];
      for (i = 1; i < n; i++)
      {
	   a[i - 1] = a[i];
      }
      end for
      a[n - 1] = item;
}
end for

输出新数组

2.1.2 代码截图###


2.1.3 造测试数据###

输入数据 输出数据 说明
8 3 1 2 3 4 5 6 7 8 4 5 6 7 8 1 2 3 一般情况
3 6 1 2 3 1 2 3 m比n大,且刚好是n的倍数
4 5 1 2 3 4 2 3 4 1 m比n大

2.1.4 PTA提交列表及说明###


提交列表说明:###

1.部分正确:少考虑了m比n大时。
2.答案正确:重新设计了一下代码,再结合超星平台讲解,把所有情况都考虑了,就正确了。

2.2 7-3 判断上三角矩阵##

2.2.1伪代码###

定义二维数组a用来存放矩阵,一维数组b用来输出YES和NO,行和列为i和j,flag作为判断是否结束循环,矩阵的个数为T,t来存放T,k用来输出数组b,n为几阶矩阵。

输入矩阵个数
t=T;
while (T--)
{
     输入矩阵阶数
     输入一个矩阵

     for (i = 0; i < n; i++)
     {
	     flag = 1;
	     for (j = 0; j < n; j++)
	     {
		如果行大于列时,元素不等于零,flag等于0,结束次循环
	     }
             end for
		如果flag等于0,结束次循环
     }
     end for
     if (flag == 0)
	b[k] = 0;
     end if
     k++;
}
end while

根据b数组中的元素,输出YES或NO,为1则输出YES,为0则输出NO

2.2.2代码截图###



2.2.3造测试数据###

输入数据 输出数据 说明
sample等价,重复若干遍

2.2.4 PTA提交列表及说明###

提交列表说明:###

1.答案错误:因为没换行输出。
2.答案错误:因为放在循环里面了,输出了多个YES或NO。
3.答案错误:因为在外面输出YES或NO的时候,循环条件错了。
4.答案错误:还是没注意到循环条件错误,以为是最后一次输出换行导致的错误。
5.部分正确:因为我以为对角线不能等于0。
6.答案正确:把对角不等于0的条件去掉了,然后就对了。

**2.3 7-1 判断E-mail地址是否合法 **##

2.3.1伪代码###

定义字符数组char,和判断输出的变量flag。

输入一串字符
flag=1;

for (int i = 0; str[i]; i++)
{
    判断字符是'@'时的情况,根据情况改变flag的值
    判断字符是'.'时的情况,根据情况改变flag的值
    判断字符是否为所要求的字符,根据情况改变flag的值
}
end for

if (flag == 1)
    输出YES
else
    输出NO
end if

2.3.2代码截图###

2.3.3造测试数据###

输入数据 输出数据 说明
adf12@qw213.com YES 样例
198@qq.comk NO .com后有多余字符
19 8@qq.com NO 字符中有空格
198@qq.com% NO 合法地址后有非法字符

2.3.4PTA提交列表及说明###

PTA提交列表及说明###

1.段错误:我用的是while循环产生的一个字符数组,根据pta的段错误规定,可能是递归调用层数太多。
2.编译错误:改了一下数组产生的方式,但函数调用时,函数写错了。
3.部分正确:少考虑了.com后面不能有多余字符。
4.编译错误:还是有个函数写错了。
5.部分正确:加的一个条件不正确,没能过测试点。
6.答案正确:改了一下条件,然后就对了,改成了str[i+4]!='\0';。

3.阅读代码(-2--1分)#


  • 这段代码的功能是给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A至Z的26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过26时又从A开始填充。
  • 优点是巧妙运用了while循环,并且外层循环条件控制的非常好,我们pta中就有一道类似的题,我差不多就是用这种方法做的,但又不一样,我的看着比较不好理解,而他的循环里面用的四个while比较清晰。

posted on 2019-11-17 22:09  王威。  阅读(452)  评论(1编辑  收藏  举报

导航