(5x5 + 4x4 + 2x2) / 3 = 15长时间窗口内的取样值:(5x5 + 4x4 + 2x2 +1x1 + 1x1) / 5 = 9
seismic.dat 中的数据如下:11 0.011 2 1 1 1 5 4 2 1 1 1
可能还没有人搞懂这个项目的意思,我画一张图来帮助理解:

这是我们提供的数据,一共11个地震检波器的数值,间隔为0.01秒,间隔为0,01秒是什么意思,很多人没搞懂。
假设我们现在输入的短窗口值为2,长窗口值为5,那么我们先选中最前面5个数字,如上图黄色部分的数值,从右边往左算,计算每个值的平方然后求和,最后除以5。即:1*1+1*1+1*1+2*2+1*1=8,然后8/5=1.6这是计算长窗口的,同理短窗口也一样的,如上图红色部分,1*1+1*1=2,然后2/2=1,然后用1/1.6=0.625<1.5,1.5是我们规定的一个阈值,如果短窗口与长窗口的平均能量值比例大于1.5那么就会发生地震,我们知道现在长窗口有5个值,每个值间隔时间为0.01。那么最后一个值的下标为4,间隔为0.04,即4*0.01=0.04。说白了每一个时间点的能量值的时间为它的下标*0.01。
然后项目就结束了??当然没有,我们还要往后检索,直到所有数据都检查完为止,那么接下来往后移一个位置,如下:

按上边的方法计算:
短窗口的平均能量值比例:1*1+1*1=2,2/2=1
长窗口的平均能量值比例:1*1+1*1+1*1+1*1+2*2=8,8/5=1.6
1/1.6 = 0.625 < 1.5,说明还是没有可能发生地震的点。
再往右移一位:

短窗口的平均能量值比例:5*5+4=26, 26/2=13
长窗口的平均能量值比例:26+3=29,29/5=5.8
然后13/5.8 = 2.24137>1.5,我们发现大于1.5,大于规定的阈值了,那么我们认为这个时间点可能会发生地震事件。此时长窗口最右边那个值为5,它的下标为6,那么这个时间点就是0.01*6=0.06秒。这个时间点可能发生地震事件。
然后再往右移一位,做同样的计算,知道算到最右边的值。然后记录中间哪些时间点可能发生地震事件。
代码实现如下:
- #include <fstream>
- #include <string>
- #include <iostream>
- #include <cmath>
- using namespace std;
- const double THRESHOLD = 1.5;//阈值
- //统计短/长事件窗口对应能量的采样值
- double power_w(double arr[], int length, int n) {
- double xsquare = 0;
- for (int i = 0; i < n; i++) {
- xsquare += pow(arr[length - i], 2);
- }
- return xsquare / n;
- }
- int main() {
- string filename;
- ifstream fin;
- int num = 0, short_window = 0, long_window = 0;
- double time_incr = 0, * sensor = NULL, short_power = 0, long_power = 0;
- double ratio;
- cout << "Enter name of input file:" << endl;
- cin >> filename;
- fin.open(filename.c_str());
- if (fin.fail()) {
- cerr << "error opening input file:" << endl;
- exit(-1);
- }
- else {
- fin >> num >> time_incr;//分别读入地震检波器能量值的数目和时间间隔
- cout << "num: " << num << " time_incr: " << time_incr << endl;
- if (num >= 0) {
- sensor = new double[num];
- for (int i = 0; i < num; i++) {
- fin >> sensor[i]; //读入能量值
- }
- cout << "Enter number of points for short-window:" << endl;
- cin >> short_window;
- cout << "Enter number of points for long-window:" << endl;
- cin >> long_window;
- //分析能量数据找出地震事件
- for (int i = long_window - 1; i < num; i++){
- short_power = power_w(sensor, i, short_window);
- long_power = power_w(sensor, i, long_window);
- ratio = short_power / long_power;
- if (ratio > THRESHOLD) {
- cout << " Possible event at " << time_incr * i << "seconds\n";
- }
- }
- delete[] sensor;
- }
- fin.close();
- }
- return 0;
- }
运行结果:


可以根据运行结果自己手动检验一遍。
到此这个小项目完整结束。我们发现编程序并不难,理解项目的功能有点费劲,因此很多软件开发前期都大量在做需求分析,真正编码的时间很少。
到这里我们看一到小题来训练一下编程思维吧:
在一次竞赛中, A 、 B 、 C 、 D 、 E 等五人经过激烈的角逐,最终取得了各自的名次,他们的一个好朋友很遗憾没有观看到比赛,在比赛结束后这个朋友询问他们之间的名次是得知:C 不是第一名, D 比 E 低二个名次,而 E 不是第二名, A 即不是第一名,也不是最后一名,B 比 C 低一个名次。编写程序,计算这五个人各自的名次并输出。
- #include<iostream>
- using namespace std;
- int main() {
- int A, B, C, D, E;
- for (A = 2; A <= 4; A++) {
- for (B = 2; B <= 5; B++) {
- for (C = 2; C <= 5; C++) {
- for (D = 3; D <= 5; D++) {
- for (E = 1; E <= 3; E++) {
- if (B - 1 == C && D - 2 == E && A != B && A != C && A != D && A != E
- && B != C && B != D && B != E && C != D && C != E && D != E) {
- cout << "A:" << A << endl;
- cout << "B:" << B << endl;
- cout << "C:" << C << endl;
- cout << "D:" << D << endl;
- cout << "E:" << E << endl;
- }
- }
- }
- }
- }
- }
- }
注意:B比C低一名的数量关系,比如,A第3,那么B就是第2名,即B - 1 = C。
运行结果:

态度很重要,不仅仅体现的是你个人的素质问题,更重要的是影响你和他人的互动关系,社会就是人与人的关系综合体。 职场如战场,充斥着形形色色的人,也就会有各种各样复杂的关系。礼貌、谦虚的人总是更受他人喜欢,无论是领导还是同事,都讨厌那些耍个性的人。生僻怪异的性格只能让你无法融入到团队。
#define _CRTDBG_MAP_ALLOC#include #include
#ifdef _DEBUG#ifndef DBG_NEW#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ ,__LINE__)#define new DBG_NEW#endif#endif
_CrtDumpMemoryLeaks();
Windows : Purify,BoundsCheaker 、 Deleaker 、 VisualLeak Detector ( VLD ) ,Linux 平台: Valgrind memcheck
这个步骤试试过了,并没有输出内存泄漏信息,可能是编译器的问题。
- #define _CRTDBG_MAP_ALLOC
- #include
- #include
- #include
- #ifdef _DEBUG
- #ifndef DBG_NEW
- #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ ,__LINE__)
- #define new DBG_NEW
- #endif
- #endif
-
- using namespace std;
- int main() {
- int* p = new int[10];
- for (int i = 0; i < 10; i++) {
- p[i] = i;
- }
- //打印
- for (int i = 0; i < 10; i++) {
- cout << i << " ";;
- }
- //未释放申请的内存区域
- _CrtDumpMemoryLeaks();
- }
发现并没有输出泄漏信息,但是在Visual C++ 2010上好像可以输出泄漏信息。
为了检测内存泄漏建议大家安装一个VLD工具就可以查看内存泄漏信息了。 我已经安装好了,自己可以找教程安装一下,但是据说VLD工具暂停更新了,对VS2015后的版本不适用,要手动设置才能使用。
现在我惊安装好了,我们来看一下:
- #include<vld.h> //内存泄漏检测工具头文件
- #include<stdio.h>
- #include<iostream>
-
- using namespace std;
- int main() {
- int* p = new int[10];
- for (int i = 0; i < 10; i++) {
- p[i] = i;
- }
- //打印
- for (int i = 0; i < 10; i++) {
- cout << i << " ";;
- }
- cout<<endl;
- //未释放申请的内存区域
- }
#include
这个是内存泄漏头文件!!不用的时候不添加即可,用的时候在添加

我们只申请了40个字节没有释放,下面那个76不是我们关心的,是数据结构中的东西。我们只需要关注前面带Block块那部分发生的内存泄漏即可。如果代码改为如下再运行看看:
我们发现,没有发横内存泄漏了。