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