debugging 变量值未更新,它为1或0

57hvy0tb  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(162)

嘿!在下面的代码中,我试图计算每个非零数字的频率

我的代码意图是在使用嵌套循环测试每个用例后更新freq,但freq的值没有更新。freq的值仍然为0或1。我尝试调试,但仍然以相同的错误结束。

  • 代码 *:
#include <bits/stdc++.h>
using namespace std;

int main() {
    int size;
    cin>>size;
    int freq=0;
    int d[size];
    for(int i=0;i<size;i++){ //To create array and store values in it
            cin>>d[i];
    }
    for(int i=0;i<size;i++){
            if(d[i]==0 )continue;
            for(int j=0;j<size;j++){
            if(d[i]==d[j]){
                    freq=freq+1;
                    d[j]=0;
                }
            }
            cout<<"Frequency of number "<<d[i]<<" is "<<freq<<endl;
            d[i]=0;
            freq=0;
    }
}
  • 输入 *:
5

1 1 2 2 5
  • 预期输出 *:
Frequency of number 1 is 2

Frequency of number 2 is 2 

Frequency of number 5 is 1
  • 实际产量 *:
Frequency of number 0 is 1

Frequency of number 0 is 1

Frequency of number 0 is 1

Frequency of number 0 is 1

Frequency of number 0 is 1

有人请调试代码并修复它。打开以获得建议。

vx6bjr1n

vx6bjr1n1#

#include <bits/stdc++.h>
这是not standard C++。不要使用它。包含您需要的个别标准信头。
using namespace std;
这是a bad habit。不要使用它。要么使用单独的using声明来表示你需要的标识符,比如using std::cout;,要么在代码中的所有标准元素前面加上std::(这是大多数人喜欢的)。
int d[大小];
这是not standard C++。不要使用这个。使用std::vector代替。

for(int j=0;j<size;j++){
      if(d[i]==d[j]){

假设i == 0,条件if(d[i]==d[j])i == j时为真,也就是说,在j == 0时为真,那么接下来发生的事情就是把d[0]清零。
现在假设i == 1,条件if(d[i]==d[j])i == j时为真,也就是说,在j == 1时为真,那么接下来发生的事情就是把d[1]清零。
现在假设i == 2,条件if(d[i]==d[j])i == j时为真,也就是说,在j == 2时为真,那么接下来发生的事情就是把d[2]清零。
现在假设i == 3...
所以你第一次看到数组的时候就把它的每个元素都清零了,当i != j时,if(d[i]==d[j])永远不会变成真。
这可以通过将内部循环更改为

for (int j = i + 1; j < size; j++) {

这将输出freq,它相差1,因为这个循环不计算第一个元素。将freq = 0改为freq = 1来解决这个问题。我建议在有freq = 1的地方加上 one。把这个赋值语句放在内部循环之前是个好地方。
注意,我在操作符周围使用了空格,您也应该这样做。
Here是你的程序的一个现场演示,上面提到的所有问题都被修复了。没有做其他的修改。

wh6knrhe

wh6knrhe2#

要构建直方图,实际上需要收集历史记录。
示例:

int main() {
    int size;
    cin >> size;

    int d[size];
    int hist[size + 1]{};             // all zeroes - this is for the histogram
    for (int i = 0; i < size; i++) {  // To create array and store values in it
        cin >> d[i];
    }
    for (int i = 0; i < size; i++) {
        ++hist[d[i]];
    }
    for(int i = 0; i < size; ++i) {
        cout << "Frequency of number " << i << " is " << hist[i] << endl;
    }
}

注意:VLA(可变长度数组)不是标准的C++功能。请改用std::vector
另一种稍有不同的方法是在获取输入值时不受size参数的限制。std::map将值转换为count

#include <iostream>
#include <vector>
#include <map>

int main() {
    int size;
    if(not (std::cin >> size) or size < 1) return 1;

    std::map<int, unsigned long long> hist; // number to count map

    for(int value; size-- > 0 && std::cin >> value;) {
        ++hist[value];
    }

    for(auto[value, count] : hist) {
        std::cout << "Frequency of number " << value << " is " << count << '\n';
    }
}

相关问题