当前课程知识点:程序设计基础 >  第七章 文本数据处理 >  7.3 统计在线时长 >  7.3.3 程序翻译与演示

返回《程序设计基础》慕课在线视频课程列表

7.3.3 程序翻译与演示在线视频

7.3.3 程序翻译与演示

下一节:7.3.4 写文件操作

返回《程序设计基础》慕课在线视频列表

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.1.1 什么是程序?什么是语言?

--1.1.2 什么是程序设计?

--1.1.3 计算机发展史

-1.2 买菜问题

--1.2.1 问题描述

--1.2.2 程序的基本结构

-1.3 数学运算

--1.3.1 数学运算符

--1.3.2 数学函数

-1.4 补充说明

--1.4.1 编程环境的下载与安装

--1.4.2 程序基本结构中的含义

--1.4.3 格式与风格

-1.5 总结

--1.5 总结

-程设论道

--程设论道

-师生问答

--师生问答一:怎样学好程序设计

--师生问答二:语言选择

--师生问答三:关于函数

-第一章 编程初步--语法自测

第二章 变量与代数思维

-2.1 关于超级计算器的几点思考

--2.1.1 关于超级计算器的几点思考

-2.2 电子秤模拟 — 背景介绍及需求分析

--2.2.1 电子秤模拟 — 背景介绍及需求分析

-2.3 电子秤模拟 — 代码实现

--2.3.1 电子秤模拟 — 代码实现

-2.4 变量定义与变量类型

--2.4.1 变量定义与变量类型

-2.5 猜数游戏与数据表示

--2.5.1 猜数游戏与数据表示

-2.6 关于变量的讨论

--2.6.1 变量的初始值

--2.6.2 变量类型

--2.6.3 变量内存单元地址

--2.6.4 存“变量地址”的变量——指针

--2.6.5 指针的 读/写 操作

--2.6.6 指针的 加/减 操作

--公告

-2.7 变量体现的计算思维

--2.7.1 变量体现的计算思维

-程设论道

--程设论道

-师生问答

--师生问答

-第二章 变量与代数思维--语法自测

第三章 逻辑推理与枚举解题

-3.1 谁做的好事——语义表示

--3.1.1 谁做的好事——语义表示

-3.2 谁做的好事——真假检查

--3.2.1 谁做的好事——真假检查

-3.3 谁做的好事——循环枚举

--3.3.1 谁做的好事——循环枚举

-3.4 谁是嫌疑犯——多重循环枚举

--3.4.1 谁是嫌疑犯——多重循环枚举

-3.5 谁是嫌疑犯——破案线索表示

--3.5.1 谁是嫌疑犯——破案线索表示

-3.6 谁是嫌疑犯——用二进制枚举

--3.6.1 谁是嫌疑犯——用二进制枚举

-程设论道

--程设论道一

--程设论道二

--程设论道三

-师生问答

--师生问答一:字符与ASCII码表

--师生问答二:其他循环语句、运算符优先级与变量作用域

-第三章 逻辑推理与枚举解题--语法自测

第四章 筛法与查找

-4.1 插花游戏

--4.1.1 问题提出(求素数)

--4.1.2 函数初探

--4.1.3 运行演示

-4.2 筛法

--4.2.1 筛法思路

--4.2.2 数组的定义

--4.2.3 代码翻译

--4.2.4 运行演示

--4.2.5 小朋友数人数

--4.2.6 运行演示

--4.2.7 韩信点兵

-4.3 线性查找

--4.3.1 扑克查找问题

--4.3.2 扑克查找问题代码翻译

--4.3.3 最小值问题

--4.3.4 最小值问题代码翻译

-4.4 折半查找

--4.4.1 提问

--4.4.2 折半查找思路

--4.4.3 折半查找代码翻译

--4.4.4 折半查找运行演示

-4.5 排序问题

--4.5.1 插入排序

--4.5.2 选择排序

--4.5.3 函数写法

--4.5.4 运行演示

-4.6 总结

--4.6.1 总结

-程设论道

--程设论道一:数组与编码思维

--程设论道二:筛法

-师生问答

--师生问答一:函数与面向过程编程

--师生问答二:数组的下标越界

-第四章 筛法与查找--语法自测

第五章 分治思想与递归

-5.1 阶乘

--5.1.1 阶乘问题

--5.1.2 递归解法

--5.1.3 递归小结

-5.2 排序

--5.2.1 归并排序——总体思路

--5.2.2 归并排序——思路分解

--5.2.3 归并排序——代码解说

--5.2.4 快速排序——总体思路

--5.2.5 快速排序——代码解说

--5.2.6 排序总结

-5.3 矩阵填充

--5.3.1 矩阵填充问题

--5.3.2 代码解说

-5.4 分书与八皇后

--5.4.1 问题描述

--5.4.2 问题分析——共性

--5.4.3 问题分析——区别

--5.4.4 解题准备——二维数组

--5.4.5 解题准备——递归设计

--5.4.6 代码解说——分书问题

--5.4.7 代码解说——八皇后问题

-5.5 青蛙过河

--5.5.1 问题描述

--5.5.2 问题分析——简单情况

--5.5.3 问题分析——复杂情况

--5.5.4 问题分析——一般情况

-程设论道

--程设论道一

--程设论道二

-师生问答

--师生问答一

--师生问答二

-第五章 分治思想与递归--语法自测

第六章 递推与动态规划

-6.1 兔子数列问题

--6.1.1 问题描述

--6.1.2 按大小兔子分别递推

--6.1.3 按总数递推

--6.1.4 不用数组递推

-6.2 分鱼问题

--6.2.1 问题描述

--6.2.2 从A到E递推

--6.2.3 从E到A递推

-6.3 橱窗的插花问题

--6.3.1 问题描述

--6.3.2 题意理解与分析

--6.3.3 用枚举思想解题

--6.3.4 采用递推的优化算法

--6.3.5.1 采用动态规划算法—优化分析

--6.3.5.2 采用动态规划算法—递推代码

--6.3.5.3 采用动态规划算法—计算过程

--6.3.5.4 采用动态规划算法—输出方案

--6.3.6 动态规划总结

-6.4 最长公共子序列问题

--6.4.1 问题描述与理解

--6.4.2 问题分析

--6.4.3.1 动态规划解题(1)

--6.4.3.2 动态规划解题(2)

--6.4.3.3 动态规划代码

-程设论道

--程设论道一

--程设论道二

-师生问答

--师生问答

-第六章 递推与动态规划--语法自测

第七章 文本数据处理

-7.1 统计记录总数

--7.1.1 问题分析

--7.1.2 读文件操作

-7.2 统计活跃用户数

--7.2.1 问题分析

--7.2.2 字符串

--7.2.3 程序翻译与演示

-7.3 统计在线时长

--7.3.1 问题分析

--7.3.2 结构

--7.3.3 程序翻译与演示

--7.3.4 写文件操作

-7.4 总结

--7.4.1 总结

-程设论道

--程设论道

-师生问答

--师生问答

-第七章 文本数据处理--语法自测

第八章 非文本数据处理

-8.1 将数据组织成链表

--8.1.1 链表的基本概念

--8.1.2 代码讲解

--8.1.3 链表遍历与释放

-8.2 提高链表访问效率 —— 哈希链表

--8.2.1 简单的哈希算法

--8.2.2 算法实现

-8.3 以二进制文件存储链表

--8.3.1 二进制文件的操作方法

--8.3.2 代码讲解

-程设论道

--程设论道一

--程设论道二

-师生问答

--师生问答

-第八章 非文本数据处理--语法自测

第九章 可配置的程序设计

-9.1 自动售卖程序

--9.1.1 提出问题与初步设计

--9.1.2 细化实现订单处理

--9.1.3 使程序更健壮

-9.2 配制水果信息

--9.2.1 提出问题与设计文件格式

--9.2.2 实现订单处理功能

-9.3 指定界面语言

--9.3.1 提出问题与命令行参数

--9.3.2 实现程序功能

-程设论道

--程设论道

-师生问答

--师生问答

-第九章 可配置的程序设计--语法自测

7.3.3 程序翻译与演示笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。