C++学习 day--21 地震监测系统实现、内存泄漏检测工具

news2024/11/16 3:24:51

1、项目需求

地震监测系统主要是利用地震检波器收集到的地壳运动信息,从而预测和确定地震的震中以
及强度。
预测方法
地震检波器每隔固定的时间间隔采样一次预测地震的能量数据,并保存到文件中,地震监测
系统会从文件中读取相应的能量数据,测试在给定的时间点上,一个短时间窗口内的取样值
与一个长时间窗口内取样值的商,如果这个比例高于给定的阈值,那么在这个事件点上极有
可能发生地震。
取样方法 :无论短/长时间内的取样值都是使用给定点 8能量数据的 平方加上该点之前的一小部分点能量值的平方之和再求平均值
如:某个时间点的及之前的7个能量数据如下,时间间隔是:0.01秒,短时间周期取2
个点,长时间周期取5个点:
则: 短时间窗口内的取样值:
(5x5 + 4x4 + 2x2) / 3 = 15
长时间窗口内的取样值:
(5x5 + 4x4 + 2x2 +1x1 + 1x1) / 5 = 9

1.问题描述:

使用数据文件中的一组地震检波器测量值确定可能的地震事件的位置。

2. 输入输出描述:

(1)程序的输入是名为seismic.dat的数据文件和用于计算短时间能量和长时间能量的取样值的数目。 输出是给出关于潜在的地震事件次数的报告
(2)seismic.dat 的结构是这样的,第一行包含两个值: 地震检波器能量值的数目和时间间隔 ,从第二行开始就是能量值的数据,以空格分开。
(2) 短时间窗口和长时间窗口的值可以由键盘读入。
(3) 判定地震事件给定的阀值是 1.5
seismic.dat 中的数据如下:
11 0.01
1 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、逼格提升:内存泄漏检测工具

VisualC++ debugger CRT
第一步: 包含以下头文件
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
第二步: 接管 new 操作符
#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块那部分发生的内存泄漏即可。如果代码改为如下再运行看看:

 

 我们发现,没有发横内存泄漏了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1141247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第四章 文件管理 十二、虚拟文件系统

目录 一、虚拟文件系统图 二、虚拟文件系统的特点 三、存在的问题 四、文件系统挂载 一、虚拟文件系统图 二、虚拟文件系统的特点 1、向上层用户进程提供统一标准的系统调用接口&#xff0c;屏蔽底层具体文件系统的实现差异。 2、VFS要求下层的文件系统必须实现某些规定的…

Map集合 遍历:lambda方式

package day01;import java.util.*;public class Mapday1 {public static void main(String[] args) {/* HashMap 无序 不重复&#xff0c;会覆盖前面 无索引*/System.out.println("--------------------");Map<String, Integer> map new HashMap<>();m…

【DBeaver】建立连接报驱动问题

事件 在DBeaver中建立pgsqlite连接&#xff0c;测试连接时&#xff0c;报 can’t load driver class ‘org.postgresql.Driver’ 问题原因 pgsqlite数据库驱动与DBeaver版本不匹配 pg解决办法 在https://jdbc.postgresql.org/download/中下载最新版本的驱动&#xff0c;然…

【Java基础】反射机制与动态代理机制

反射机制与动态代理机制 文章目录 反射机制与动态代理机制1. 反射(Reflection)的概念1.1 反射概述1.2 反射的优缺点 2. 理解Class类并获取Class实例2.1 Class2.2 Class类的常用方法 3. 反射的基本应用3.1 应用1&#xff1a;创建运行时类的对象3.2 应用2&#xff1a;调用运行时类…

什么是恶意代码?

前言&#xff1a;本文旨在分享交流技术&#xff0c;在这里对恶意代码进行全面的介绍和讲解 目录 一.什么是恶意代码 二.恶意代码的发展史 三.恶意代码的相关定义 四.恶意代码攻击机制 PE病毒 PE文件的格式 脚本病毒 脚本文件隐藏方法 宏病毒 浏览器恶意代码 U盘病毒 …

Go基础——数组、切片、集合

目录 1、数组2、切片3、集合4、范围&#xff08;range&#xff09; 1、数组 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列&#xff0c;这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。 Go 语言数组声明需要指定元素类型及元素个数&#xff0c;与…

docker - DockerFile 编写 指令

文章目录 前言docker - DockerFile 编写 指令1. FROM2. MAINTAINER3. RUN4. CMD5. LABEL6. EXPOSE7. ENV8. ADD9. COPY10. ENTRYPOINT11. VOLUME12. USER13. WORKDIR14. ARG15. ONBUILD16. STOPSIGNAL 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&am…

Virtual DOM

目录 Virtual DOM 前言 用法 代码 理解 Virtual DOM的工作原理&#xff1a; 为什么使用Virtual DOM? 哪些库/框架使用Virtual DOM? 总结 Virtual DOM&#xff08;虚拟DOM&#xff09;是一种编程概念&#xff0c;它是对真实DOM的轻量级抽象表示。在前端开发中&#x…

【软考】系统集成项目管理工程师(九)项目成本管理【4分】

一、成本概念 1、产品全生命周期成本 产品或系统的整个使用生命周期内&#xff0c;在获得阶段&#xff08;设计、生产、安装和测试等活动&#xff0c;即项目存续期间&#xff09;、运营与维护、生命周期结束时对产品的处置所发生的全部成本 2、成本类型 成本类型描述可变成…

【Matlab2016】Matlab中文版的下载、安装、激活(不建议安装过高版本!!)

这里写目录标题 首先双击R2016_win64.iso加载镜像文件双击setup.exe开始安装选择使用文件密钥安装填入密钥修改安装路径并记住此路径建议全部勾选等待安装完成 激活复制补丁到matlab路径下 创建快捷方式进入bin目录&#xff0c;找到matlab.exe 安装包 首先双击R2016_win64.iso加…

会声会影2023永久激活序列号密钥(支持各版本会声会影注册机)

会声会影2023永久激活序列号密钥(支持各版本)。会声会影2023是一款强大专业的视频编辑软件。会声会影2023产品序列号&#xff0c;支持专业版和旗舰版&#xff0c;可免费激活会声会影2023软件。会声会影2023序列号激活码目前网上很难找到了&#xff0c;这些会声会影序列号是小编…

如何编写一份完整的软件测试报告?

背景 作为测试从业者&#xff0c;编写测试用例&#xff0c;测试计划&#xff0c;测试报告都是必经之路&#xff0c;最近完成了年终述职以及版本准出&#xff0c;感觉测试报告或者各类报告真是职场人不可或缺的一项技能&#xff0c;趁着热乎劲&#x1f525;&#xff0c;写下一些…

Spring Cloud 实战 | 解密负载均衡Ribbon底层原理,包含实战源码

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

车载音频ADI-ADSP21569音频DSP开发

车载音频ADI-ADSP21489音频DSP开发 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送蓝牙音频,车载DSP音频项目核心开发资料, 1 芯片手册 2 电路原理图

fl studio2023最新版本如何设置中文?

FL Studio编曲软件真的是个神器&#xff0c;不过一开始打开看到全是英文&#xff0c;有点头大&#xff0c;对吧&#xff1f;其实切换成中文版超级简单&#xff0c;只需要几个步骤就搞定啦&#xff01;我自己也是用中文版的&#xff0c;觉得用起来更得心应手&#xff0c;效率也提…

分享一个基于asp.net的供销社农产品商品销售系统的设计与实现(源码调试 lw开题报告ppt)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

MySQL主从复制(基于GTID--事务ID方式)

目录 一、GTID相关概念1.GTID 是什么&#xff1f;2.GTID主从复制方式概念3.GTID的优缺点 二、GTID工作原理三、部署主从复制四、测试同步1.主库上新建数据库2.从库上查看是否同步成功 五、重设从库六、常见故障七、故障切换八、GTID的一些疑问1.为什么基于GTID的同步也要打开bi…

Dataworks API:调取 MC 项目下所有表单

文章目录 前言Dataworks API 文档解读GetMetaDBTableList 接口文档 API 调试在线调试本地调试运行环境账密问题请求数据进一步处理 小结 前言 最近&#xff0c;我需要对公司的数据资产进行梳理&#xff0c;这其中便包括了Dataworks各个项目下的表单。这些表单&#xff0c;作为…

Java进击框架:Spring-Test(六)

Java进击框架&#xff1a;Spring-Test&#xff08;六&#xff09; 前言单元测试模拟对象 集成测试上下文管理和缓存事务管理集成测试的支持类执行SQL脚本WebTestClientMockMvc JDBC测试支持其它注释 前言 Spring团队提倡测试驱动开发(TDD)。Spring团队发现&#xff0c;控制反转…