1、项目需求
(5x5 + 4x4 + 2x2) / 3 = 15长时间窗口内的取样值:(5x5 + 4x4 + 2x2 +1x1 + 1x1) / 5 = 9
1.问题描述:
2. 输入输出描述:
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。
运行结果:
2、职场修炼
礼貌谦逊的态度
态度很重要,不仅仅体现的是你个人的素质问题,更重要的是影响你和他人的互动关系,社会就是人与人的关系综合体。 职场如战场,充斥着形形色色的人,也就会有各种各样复杂的关系。礼貌、谦虚的人总是更受他人喜欢,无论是领导还是同事,都讨厌那些耍个性的人。生僻怪异的性格只能让你无法融入到团队。
积极乐观的心态
3、逼格提升:内存泄漏检测工具
#define _CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h>
#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 <stdlib.h>
#include <crtdbg.h>
#include<iostream>
#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<vld.h>
这个是内存泄漏头文件!!不用的时候不添加即可,用的时候在添加
我们只申请了40个字节没有释放,下面那个76不是我们关心的,是数据结构中的东西。我们只需要关注前面带Block块那部分发生的内存泄漏即可。如果代码改为如下再运行看看:
我们发现,没有发横内存泄漏了。