2019寒假训练营寒假作业(二) 程序题部分
程序题
实现思路:
按照题目要求:
那么用C语言构建思路很明显: - 创建结构体数组或者动态链表(采用了前者,前者构建和遍历比较简单) - 读取每一行发送方名称和数据大小(用%*s忽略“bob”的输入) - 遍历名单查看是否已经存储(构建函数,使用strcmp) - 记录内容(构建函数,使用strcpy) - 判断是否异常(在本次请求大小超过LIMIT以后,同时记录下黑客用户名,修改已发现黑客个数) - 循环至文件结尾 - 输出名单(构建函数)
(选择将一些必要数据例如:已经发出请求的个数和已经发现的黑客个数及其hack记录名单,设为全局变量,以减少一些在函数中的传递调用。)
实现结果
检查Request.txt是否已经在该目录下,检查完毕后,编译运行:
打开output.txt:
第二次作业代码: (希望结果正确Orz。)
开放题
吐槽:
- 创建了26*26*26*26的记录空间,可能会占据太多无用空间;
- 只适用于四个小写字母的用户名,对于更长或者使用更多其它字符的用户名可能会超出内存范围,不具有拓展性。
新的想法:
先另外创建一个arrange.txt文件,将名单按照请求者名称按照 字典序(ASCLL码大小) 重新排序输入到该文件中;再调用该文件,重定向,将属于同一个请求者的请求集中处理,判断为黑客后输出到ouput.txt。
该想法的优点:
不需要另开临时内存记录,减少了不必要的无用空间占用,也避免了请求者名称长度不定长或者使用特殊字符的特殊情况。
缺点:
- 该方法操作复杂,在排序时和判断时可能需要对文档中的光标进行移动(调用fseek函数,保证偏移量即可)
- 效率较低,尤其是在数据极大(超过万或十万)的情况下,排序可能需要考虑快排以减少计算时间,但也必须等到所有人排序结束后才开始判断。
实现:暂无。(亦或许使用python的字典和内置函数实现更快)