在C++中调试直方图

Debugging a histogram in C++

本文关键字:直方图 调试 C++      更新时间:2023-10-16

我想构建一个具有ell间隔的直方图。每个间隔的大小计算为k = ceil(m/ell)其中m是数据集中的最大数字。也就是说,间隔i应该是 [(i - 1) * k, i * k) .如果数据集由数字16 33 55 57 8 47 1 21 14 73 6 59 29 57 20 95 77 5 62 48给出,并且区间数ell = 10,直方图必须以文本形式表示为

0: 4
10: 2
20: 3
30: 1
40: 2
50: 4
60: 1
70: 2
80: 0
90: 1

我需要编写一个程序,该程序读取以下值(来自标准输入 cin):

  • 间隔的ell
  • 数据集的大小n
  • n非负整数

这是我到目前为止的代码:

#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
int main() {
    double ell;
    int n; // size of the data set
    double m = 0;
    int * a;
    int * x;
    int * y;
    cin >> ell;
    cin >> n;
    a = new int[n];
    // finding max element in array a
    for (int i = 0; i < n; i++) {
       cin >> a[i];
       if (a[i] > m) {
          m = a[i];
       }
    }
   int k = ceil(m/ell);
   x = new int[(int)(ell)];
   y = new int[(int)(ell)];
   for (int i = 1; i <= ell; i++) {
      x[i] = (i - 1) * k;
      for (int j = 0; j < n; j++) {
         if (a[j] >= (i - 1) * k && a[j] < i * k && x[i] != (ell - 1) * k) {
             y[i] += 1;
         } else if (a[j] >= (ell - 1) * k && x[i] == (ell - 1) * k) {
             y[i] += 1;
         } else {
             y[i] += 0;
         }
      }
      cout << x[i] << ": " << y[i] << endl;
   }

   delete [] a;
   delete [] x;
   delete [] y;
   return 0;
}

如果我输入这个:

10 20 16 33 55 57 8 47 1 21 14 73 6 59 29 57 20 95 77 5 62 48

我得到

0: 4
10: 2
20: 3
30: 1
40: 2
50: 4
60: 1
70: 2
80: 0
90: 1

但是如果我多次输入相同的内容,我会得到一个奇怪的输出,例如

0: 4
10: 268501820
20: 1073741827
30: 112
40: 2
50: 4
60: 1
70: 2
80: 0
90: 6

为什么会发生这种情况,我该如何解决我的问题?

x = new int[(int)(ell)];
y = new int[(int)(ell)];

在堆上创建对象,但除非对象(即 int)有一个构造函数,那么内存将保持未初始化状态。

数组x已正确初始化,但保留y(预期为 0)。

所以解决方法是...

x = new int[(int)(ell)];
y = new int[(int)(ell)];
for( int i = 0; i < ell ; i++ ){  
    x[i] = 0; // tidier to do it obviously.
    y[i] = 0; // essential to get y[i] += 1; to be meaningful.
}

你从不初始化你的记忆。您可以同时使用 x 和 y 创建动态数组,但不能保证内存归零。在大多数情况下,您会很幸运,但是当程序使用的内存中还剩下值时,您会得到看到的异常值。放这样的东西,它应该可以解决你的问题。

for(int m = 0;m < (int)ell; m++) {
    x[m] = 0;
    y[m] = 0;
}