C博客作业04--数组

…衆ロ難τιáo~ 提交于 2019-12-04 18:26:59

1.展示PTA总分

一维数组:

二维数组:

字符数组:


2.本章学习总结

2.1. 学习内容总结

XFfYQ9iUQFgpCoQFehhA7pmcKpLpnKqoBpnyAsEA

想看吗?那就解密吧!先定个小目标,我要跨过2个栏。

2.2 本章学习体会

学习感受

这周明显状态就不对了,学习状态异常糟糕!由于10月份忙了一个月,好不容易把工作都搞完了,校运会结束后,能利用的时间明显增多,本来我还挺开心的,因为可以去补回上一个月落下的进度了,也可以做更多的事情了,但事实并非如此。面对突然盈余的时间,我感到不知所措,无从下手,不知道该怎么利用时间,想做的事情太多,却没办法作出决定先做哪一个,没办法像九月份那样有充实的感觉。我能确实感觉到,高数线代在不断退步,英语仍然停滞不前,C语言感觉也到了瓶颈,社团的任务没有跟上,感觉已经面临着全线崩盘的危险了。我在前几篇博客都有提到,我很害怕突然会失去热情,现在果然应验了,我了解自己,只要是现在这种情况,我一定会陷入低迷。现在的当务之急,就是想点办法重新焕发热情,我现在个人斗志很差,没有一个好的气势是没办法学好知识的,第二个是必须赶出一个规划,要先赶上进度,线代的考试,高数的学习,英语的积累必须赶紧安排上了,C语言和社团也必须找到下一个努力方向,不能再这样低迷下去了,不然就完蛋了。
但是大作业方面我觉得还是完成的不错的,我重构了三次代码,每一次重构都有新的思考,都有加进去更多的东西,还是向老师、学长学姐和同学们学到了很多的东西。学习数组时,可以明显地感觉到知识的技巧性,综合性有很大的提高,数组可以做成一维、二维、字符串,不同的数组都有所讲究,技巧方面学习了诸如选择法排序、泡泡排序、二分查找、移动或重构数组、插入或删除数据、空间换时间思想等等,这些都需要去学习,消化吸收,掌握这些技巧对于今后的编程都很重要,难度也比较大,我自认为我没有掌握得很好,因此接下来还是得多打代码来练习。

教学建议

希望接下来能多搞几次大作业!

代码量统计


3.PTA实验作业

3.1删除重复字符

3.1.0代码实现


根据常规思路,我们可以很快地打出代码,基本思想是先遍历读入的字符串,然后判断在第二个字符串中是否有与第一个字符串重复的内容,如果没有则写入,如果有则跳过,然后给删除好的字符数组按照ascii码来个排序,即可达成目的。但是,我们知道最后的字符数组是由ascii码由小到大排序的,ascii码是有顺序的,只要是有顺序的,我们就可以用一些技巧去实现它。

3.1.1算法分析

定义字符数组ascii[256]代表每一个ascii码对应的字符在字符串中出现的次数;
定义变量ch存储读取的单个字符;
定义变量i控制循环次数;
while 输入一个字符,ch != '\n' do
   ascii[ch]++;   //以字符的形式,修改对应ascii码的单元,使其值不为0
end while
for i = 0;i < 256;i++ do
   if ascii[i] != 0   //如果对应单元不为0,说明需要输出
      以字符形式输出i;
   end if
end for

3.1.2 代码截图

3.1.3 造测试数据

输入数据 输出数据 说明
ad2f3adjfeainzzzv 23adefijnvz sample
abcd(空格)+-*/(空格)1234 (空格)*+-/1234abcd 有其他字符,包括空格
(空格)(空格)(空格)(空格)(空格) (空格) 全空格
a a 最短字符串
80个(空格) (空格) 最长字符串,全空格

3.1.4 PTA提交列表及说明


很明显,第二种方法更为巧妙,它用到的思想是在重复数据中,我们学习到的“空间换时间”,想要灵活运用这个思想,就需要我们给题目相相面,当我们看到题目需要以ascii码的顺序输出时,我们就明白了这里有个看不见的顺序,将它灵活运用,即可用直接打表的方式完成这道题。

3.2判断E-mail地址是否合法

3.2.1算法分析

定义字符数组char str[1000]存储E-mail地址;
定义变量idx = 0作为判断“com”的辅助下标;
定义字符数组tail[4] = "com"用于判断合法性;
定义变量i控制循环;
定义变量flag作为是否是合法地址的flag;
定义变量len存储输入的字符串长度;
读入字符串;
len = strlen(str);   //利用字符串函数获得字符串长度
for i = 0; i <= len; i++ do
   if str[i]是合法字符
      if str[i] == '@'
         if i + 1 > len   //判断'@'是否是最后一个字符
            flag = 0;   //如果'@'是最后一个字符,不合法
            break;
         else if str[i+1]非数字或字母
                 flag = 0;
                 break;
              end if
         end if
         if str[i-1]非数字或字母
            flag = 0;
            break;
         end if
      end if
      if str[i] == '.'
         i++;   //移动i,进入对“com”的判断
         for idx != 3; i++, idx++ do
            if str[i] != tail[idx]   //判断字符串的后三个单元是否是“com”
               flag = 0;
               break;
            end if
      end if
   else   //数据不合法,结束循环
      flag = 0;
      break;
   end if
end for
if flag = 1
   输出“YES”;
else 
   输出“NO”;
end if

3.2.2 代码截图

3.2.3 造测试数据

输入数据 输出数据 说明
adf12@qw213.com YES sample
1220781679@qq.com YES sample等价
a_df12@qw213.com YES 字母数字下划线.@
adf12@qw213.comabc NO .com后有多余字符
.@ NO 特例1
@. NO 特例2
@ NO 特例3
. NO 特例4
.. NO 特例5
@@ NO 特例6
a(空格)df12@qw213.com NO 字符串中有空格
(空格)(空格)(空格)(空格) NO 全空格
adf12@qw213.com(空格) NO 有多余的空格
adf12@qw213.com&&& NO 合法地址后有非法字符

3.2.4 PTA提交列表及说明


Q1:第一次提交,只通过了4个测试点;
A1:紧接着的两次提交分别是直接输出“YES”和直接输出“NO”,知道题目测试点的特点;
Q2:忽略了@之后没有字符的特例;
A2:补上相应的判断机制;
Q3:对于字符串末尾是空格的数据无法准确判断;
A3:将输入方式改为gets,读入整行字符串;
Q4:编译错误;
A4:没有将get_s改为gtes,改回去即可。

3.3A-B

3.3.1算法分析

这道题目又是删除题,正如上文所述,我们先给这道题目相相面,由于这题不是按照字符串删除,也是按照字符来删除,因此我们仍然如法炮制,利用ascii码来实现这段代码。

定义字符数组str存储输入的字符串;
定义字符数组del[256]并初始化为0;
定义字符变量ch读取需要删除的字符;
定义变量i控制循环;
输入原字符串;
while 输入字符ch,ch != '\n' do
   del[ch] = 1;   //改变对应ascii码对应单元的值,使其不为0;
end while
for i = 0; str[i] != '\0'; i++ do
   if del[str[i]] == 0   //基于原字符串判断字符是否需要输出
      以字符形式输出str[i];
   end if
end for

3.3.2 代码截图

3.3.3 造测试数据

输入数据 输出数据 说明
I love GPLT! It's a fun game!(回车)aeiou I lv GPLT! It's fn gm! sample
I'm a vegetable chicken.(回车)vegetable I'm chicken. 删除的字符在中间
I'm a vegetable chicken.(回车)I'm chicken. avgtabl 删除的字符在两端
vegetable chicken.(回车)vegetable chicken. 全删除
vegetable chicken.(回车)zoo vegetable chicken. 无需删除

3.3.4 PTA提交列表及说明


Q1:编译错误;
A1:没有将get_s改为gtes,改回去即可。
Q2:为什么几乎一遍过了这题,还是写到了博客上?
A2:虽然一次提交就过了,但是整出这段代码没有很快,这道题一开始我想复杂了,但主要是受了重复数字和删除重复字符这两道题目的影响,才进行了尝试。提交之前,也是把测试数据测试到对才提交的。


4.阅读代码

题目来源zoj 3109 Decode Message

题意概括:首先在第一行输入两个数字,代表矩阵的行数和列数,第二行输入密文,按照第一行构建的矩阵螺旋排列,如果要结束程序,则输入0 0,不读取,然后对密文进行凯撒解密,输出解密完成后的字符串。

亮点分析:
  1. 这题的测试数据也是ACM型的,循环为“while (scanf("%d %d", &r, &c), r && c)”,利用逻辑表达式来实现判断作用,也是一种新的方法;
  2. 灵活运用字符输入和输出函数,在合适的地方吸收换行符,直接单个输出解密后的密文;
  3. 灵活运用了‘!’运算符改变变量的值,起到切换接口处理二维数组的目的;
  4. 代码处理二维数组的结构很强大,作者定义了7个变量来处理二维数组,利用rb,re,cb,ce四个变量作为边界的控制变量,isRow,isOrder两个变量来确定程序需要进入哪个结构进行操作,index变量来控制下标,把外层循环结构,内层的四个判断结构,四个循环结构紧密联系,使得解密有条不紊地准确进行;
  5. 总体而言,这段代码的亮点集中在变量的设置和控制上,在结构的合理设计上,我们可以学习作者对二维数组处理方法,对代码的严谨设计上。
  • 选择这道题主要是因为题目花里胡哨,感觉很难,不好操作,但是仔细去理解它,发现其实思路并不难,这道题我认为是一道组合题,只要能够很好地操作这个二维数组,就不难做,然而这个处理方法与螺旋方阵有异曲同工之妙,因此不难想,关键是如何保证数组单元被正确地处理。至于凯撒密码解密的问题就简单多了。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!