当前课程知识点:程序设计基础 > 第七章 文本数据处理 > 7.3 统计在线时长 > 7.3.3 程序翻译与演示
前面我们分析到 说如果只涉及到一个用户
那在线时长 就是像这样b时刻减去a时刻
d时刻减去c时刻 所有这样的时间差再求个和
那如果说我想 一条一条的记录做处理
那实际上 我在a时刻记录的时候我就得记下这个a
然后到b时刻的时候
拿到这个a的记录和这个b的时刻
我就可以计算一个b-a的时间差把它做一个累加
然后到c时刻这条 我再记下这个c这个时间
然后到d时刻这条的时候 我再去计算d-c
依次的我就可以把这个所有的时间差去求一个和
那所以这样一个过程就是
我在遇到login的时候把它记下来
遇到logout的时候去找之前我记下的那个时间
然后做一次减法 大概就是这样一个过程
所以呢 类似的如果说我有多个用户的时候
我们还是可以一条一条处理
只不过我们遇到一个登陆的记录的时候
就得把记录下每一个用户的
每一个遇到login的用户的登录时间
然后遇到logout遇到登出的时候
我就得找到之前我存的某一个指定的
本条涉及的这个用户
前一次登陆的时间去求一个时间差
然后累加到一个对应的登出用户的在线时长
需要一个数组来记录一些的上次登录时间
需要一个数组来记录每一个用户的在线时长
就把原来一个用户的问题扩展到一个数组
就可以存成多个用户了
下面我们就按照这样的思路写下了下面的这个代码
按照刚才的思路 我们就形成了这样的代码
其实跟之前的代码一样的部分我就不再解释了
只解释一些在这一节中我们新加入的一些代码
比如说加入一个Time_t这样一个结构的定义
这样我们就定义了一个Time_t这样的一个类型
这个类型里面有几个成员
或者说这样一个类型涉及到以下几个信息
年月日时分秒 通过这6个成员
我们就可以表达一个时刻这样一个概念
然后分号结束这是整个的结构的一个定义
然后下面我们写了一个函数的声明
刚才这个求时间差的一个声明
有了这样一个声明我们就可以先写main函数
因为我不是特别关心这个
TimeDifference这个函数怎么实现的
那我可以先写这个main函数
然后把这个TimeDifference写到最后面
这个有兴趣的同学可以下来再自己看一下
我们还是回来看一下这个程序的主体内容
前面跟这个第二小单元的内容是一样的
先打开这个log.txt的文件
然后初始化一个用户的数一开始是零
然后记录所有的不重复用户的编号
然后我们刚才说了需要记录一下每一个用户的在线状态
每一个用户的上次登录时间
然后一个一个记录处理的时候
我要记录一下上次登录的时间
找到登出的时候就可以
减去这个时间就一个差得到了累积的秒数
累积到哪了 就累积下面这个一个也是600的一个数组
就是累积的在线的一个秒数
中括号600后面对应的每一个用户的下标
每个这种跟用户相关的数组都是以
中括号600为下标的上限
也就是同样的一个下标你去访问ids得到的那个用户编号
也就对应同样的下标访问到这个online得到在线状态
同样的编号访问到这个last_on这个上次登录时间
用同样的编号访问是同一个用户的在线累计秒数
这是它们时间一个相关关系
其实一旦有这种相关关系
我们可以把整个这些内容都包含在一个结构里
使它们形成一个结构的一个数组
这里我就不做操作了
因为前面已经给大家做了一个结构的示例
这个怎么转换成一个结构的数组
大家可以自己再做一个练习
接下来主体的功能还是那个循环
每次读取一个记录只不过这回既然
time已经有了一个Time_t这样一个类型表达时间了
那我下面这个读取时间的可以用一个结构的一个写法
用这个定义的临时变量t来表达一个时间
我们每次读入的是t的year t的month t的day
这样一个整体就可以当成一个int变量来使用
然后跟我之前的那个写法这应该是year
然后是个month然后是个day
那个day就是一个临时的整型的变量
这也是一个整型的变量 是可以等同使用的
但是我这种写法就把这个day的值
写到了这个变量t对应的那个day的位置当中去
整个这两行就把t的所有六个成员都填充完毕了
那就下来还是同样的我要做一个线性查找
如果没找到说明它是一个新用户
如果是新用户我就拷贝一下它的id
这是一个新的用户的id
好 拷贝完了之后我还要记录一下这个新用户的登录状态
如果说我的operation是login
它确实一般新出现一个用户应该是一个login
我这里只是严谨起见判断一下如果它是login
那么我把在线状态改成true表示它在线
然后上次登录的时间我把它记下来
就是这个t就是我刚才输入的这个成员变量
输入了六个成员变量整个这个临时的一个t是时间类型的
前面这个是一个时间的一个数组对应的项
可以给它附成一个时间这样的一个值
跟我们普通的类型其实是操作是一样的
那如果第一次出现的时候operation这个值就不是login
那其实是感觉这个文件的内容应该不太对
我没有做太多的特殊处理 只把这个登录状态设为false
把这个状态在线状态设为false 没有登录把它记下来
然后这个是我们之前写到的代码
就是如果你没找到用户说明是新用户
那我们把用户的计数做一个加一
再接下来如果不是一个新用户
实际上它就应该是一个以前出现过的用户
那我还需要做一个判断如果以前出现过的时候
当前的操作是一个login操作而且上次的
当前的在线状态是没在线说明它原来没在线
现在又做一个login操作说明这是一个登录的一件事
那我就需要把登陆的状态在线的状态改成登陆状态
然后把上次的在线时间给它记下来
否则 如果operation不是login
说明这是一个登出的一个记录
而后如果再判断一下当前的在线状态
确实是在线的时候做了一个登出
那我这个时候可以去修改这个在线状态
并且去求两个时刻之差
两个时刻之差我就调用了一个TimeDifference函数
那TimeDifference求哪两个时间之差
一个是本记录的时间就是这个t
一个是我上次登陆的这个时间
上次登录的时间存在这个last_on这个数组里
然后下标需要给它一个这个t对应的用户的编号
也就是刚才线性查找找到的那个found
那把这个时间差做一个累加
累加到secs这样一个数组当中去
也是同样是found下标对应的那一项
也就是我这个found找到的应该是什么
前面做线性查找的时候找到的是它在
这个id在ids当中存在于哪一个位置
这个ids是所有的不重复的用户的编号
存储在这样一个地方
也就是说通过这样一个查找
从这个数组当中找到了哪一个数组的下标
存储的是这样一个id那我们刚才说了
同样的数组下标我们存的是同一个用户的相关信息
在这里就包括它上一次的在线时间和总的在线时长
然后做一个累加 那所有的这个循环所有的这个记录
都处理完了 处理到这个文件结束
我们可以看这条线一直找到对应大括号在这
这是循环结束的那个大括号
那这个时候我们出来关闭这个文件
实际上我们就可以输出每一个用户的在线时长
那我这里为了看起来方便
把这个每一个用户的id也输出出来然后中间加一个空格
然后再输出对应用户的在线时长
一共有user_count这么多的在线用户
好 我们把这样一个程序做一个编译运行
我们可以看到屏幕上闪过了很多数
想想也是 应该一共有524个用户的在线的信息
有一堆的登陆时长 那么 我们往前翻一翻
我们发现满屏都是 然后感觉应该不到500个
那实际上 说明我以前这些记录可能都没有显示全
都被这个输出的界面给丢掉了
这个输出的界面的能够输出的字符数也是有限的
那怎么办
既然我们能够读文件 那我们能不能把刚才
输出的闪过的那一堆结果保存到一个文件里
这样以后我们就可以想什么时候打开就什么时候打开来看
当然可以 那我们下一段就来看看
如何把这样一些数据写入文件当中保存起来
-1.1 基础知识
-1.2 买菜问题
-1.3 数学运算
-1.4 补充说明
-1.5 总结
--1.5 总结
-程设论道
--程设论道
-师生问答
-第一章 编程初步--语法自测
-2.1 关于超级计算器的几点思考
-2.2 电子秤模拟 — 背景介绍及需求分析
-2.3 电子秤模拟 — 代码实现
-2.4 变量定义与变量类型
-2.5 猜数游戏与数据表示
-2.6 关于变量的讨论
--公告
-2.7 变量体现的计算思维
-程设论道
--程设论道
-师生问答
--师生问答
-第二章 变量与代数思维--语法自测
-3.1 谁做的好事——语义表示
-3.2 谁做的好事——真假检查
-3.3 谁做的好事——循环枚举
-3.4 谁是嫌疑犯——多重循环枚举
-3.5 谁是嫌疑犯——破案线索表示
-3.6 谁是嫌疑犯——用二进制枚举
-程设论道
--程设论道一
--程设论道二
--程设论道三
-师生问答
-第三章 逻辑推理与枚举解题--语法自测
-4.1 插花游戏
-4.2 筛法
-4.3 线性查找
-4.4 折半查找
--4.4.1 提问
-4.5 排序问题
-4.6 总结
--4.6.1 总结
-程设论道
--程设论道二:筛法
-师生问答
-第四章 筛法与查找--语法自测
-5.1 阶乘
-5.2 排序
-5.3 矩阵填充
-5.4 分书与八皇后
-5.5 青蛙过河
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答一
--师生问答二
-第五章 分治思想与递归--语法自测
-6.1 兔子数列问题
-6.2 分鱼问题
-6.3 橱窗的插花问题
-6.4 最长公共子序列问题
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第六章 递推与动态规划--语法自测
-7.1 统计记录总数
-7.2 统计活跃用户数
-7.3 统计在线时长
--7.3.2 结构
-7.4 总结
--7.4.1 总结
-程设论道
--程设论道
-师生问答
--师生问答
-第七章 文本数据处理--语法自测
-8.1 将数据组织成链表
-8.2 提高链表访问效率 —— 哈希链表
-8.3 以二进制文件存储链表
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第八章 非文本数据处理--语法自测
-9.1 自动售卖程序
-9.2 配制水果信息
-9.3 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测