动态内存练习--地震监测系统

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

具体开发需求
1.问题描述:使用数据文件中的一组地震检波器测量值确定可能的地震事件的位置。
2.输入输出描述:
程序的输入是名为seismic.dat的数据文件和用于计算短时间能量和长时间能量的取样值的数目。
输出是给出关于潜在的地震事件次数的报告。

seismic.dat 的结构是这样的,第一行包含两个值: 地震检波器能量值的数目和 时间间隔,从第二行开始就是能量值的数据,以空格分开

短时间窗口和长时间窗口的值可以由键盘读入

判定地震事件给定的阀值是 1.5

3.seismic.dat 中的数据如下:

11 0.01 
1 2 1 1 1 5 4 2 1 1 1
  • 项目实现
#include <iostream>
#include <string>
#include <fstream>
#include <cmath>

#define THRESHOLD 1.5     //判定事件给定的阈值
using namespace std;

//统计短/长时间窗口对应能量的采样值  
//arr[]:存放能量值的数组,length:数组长度,n:用户输入的窗口值
double powerWindow(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;            // 地震检测器能量值的数目
    double timeIncr = 0;    // 时间间隔
    double* sensor = NULL;  // 检测器,保存申请堆空间地址
    int shortWindow = 0;    // 用户输入短时间窗口的值
    int longWindow = 0;     // 用户输入长时间窗口的值
    double shortPower = 0;  // 短时间窗口能量值
    double longPower = 0;   // 长时间窗口能量值
    double ratio = 0;       // 计算的阈值

    cout << "Enter name of input file: ";
    cin >> filename;

    // 打开文件
    fin.open(filename.c_str());
    if (fin.fail())
    {
        //文件打开失败
        cout << "Error opening input file" << endl;
        exit(-1);
    }
    else
    {
        //文件打开成功,读取数据
        fin >> num >> timeIncr;
        cout << "num: " << num << "  timeIncr: " << timeIncr << 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: ";
            cin >> shortWindow;
            cout << "Enter number of points for long window: ";
            cin >> longWindow;

            //分析能量数据找出地震事件
            for (int i = longWindow - 1; i < num; i++)
            {
                shortPower = powerWindow(sensor, i, shortWindow);
                longPower = powerWindow(sensor, i, longWindow);

                //计算阈值
                ratio = shortPower / longPower;
                if (ratio > THRESHOLD)
                {
                    cout << "Possible event at " << timeIncr * i << " seconds" << endl;
                }
            }

            //释放申请的堆空间
            delete[] sensor;
        }

        //关闭文件
        fin.close();
    }

    return 0;
}

image

posted @ 2022-04-21 09:21  荒年、  阅读(19)  评论(0编辑  收藏  举报