0

我知道这个错误是因为我已经在 for 循环范围内声明了 stu,但它是程序的必要性。我想为每个测试用例声明一个数组(测试用例应该一次输入)。建议我一种方法来实现这是动态内存的替代方案。

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
    int t;
    cin>>t;
    int n[t],g[t];
    int m =0;
    for(int w=0;w<t;t++)
    {
        cin>>n[w]>>g[w];
        int stu[n[w]];
        for(int i=0;i<n[w];i++)
        {
            cin>>stu[i];
        }

    }    
    while(m<t)
    {
        int a,b;    
        int e;
        e = (n[m]*(n[m]-1))/2;
        int diff[e];
        if (g[m]=1)
        {
            cout<<0<<endl;
            return 0;
        }
        b=*(min_element(stu,stu+n[m]-1));
        a=*(max_element(stu,stu+n[m]-1));
        if (g[m]=n[m])
        {
            cout<<a-b<<endl;
            return 0;
        }
        int z = 0;
        for(int j=0;j<(n[m]-1);j++)
        {
            for(int k=(j+1);k<n[m];k++)
            {
                diff[z]=abs(stu[j]-stu[k]);
                ++z;
            }
        }        
        cout<<*(min_element(diff,diff+e-1))<<endl;
        ++m;
    }    
    cin.ignore();
    cin.get();
    return 0;
} 
4

2 回答 2

3

您在循环stu内部声明for,因此它仅限于循环的范围。然后,您尝试在未声明的循环之外使用它。

for(int w=0;w<t;t++)
{
  ...
  int stu[n[w]]; // Beware: stu is a VLA. Non-standard C++.
  // OK to use stu here
  ...
}    
// stu doesn't exist here

另请注意,标准 C++ 不支持可变长度数组(VLA),这是您尝试在 的声明中stu以及此处使用的:

int t;
cin>>t;
int n[t],g[t];

您可以通过以下方式替换这些数组std::vector<int>

#include <iostream>
#include <vector>

int main()
{
  int t=0;
  cin>>t;
  std::vector<int> n(t);
  std::vector<int> g(t);
  std::vector<int> stu ...;

}
于 2013-05-20T06:30:27.603 回答
0

线

int stu[n[w]];

在一个块内,在该块外它不会被看到。您应该将它移出块,但这样做当然不能使用n[w],因为 w 是循环变量。您可以限制可以拥有的最大值n[w],例如

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXV = 100;
int main()
{
  int t;
  cin>>t;
  int n[t],g[t]; // <- supported by some compiler, but not std
  int m =0;
  int stu[MAXV];
  for(int w=0;w<t;t++) {
      cin>>n[w]>>g[w];
      for(int i=0;i<n[w] && i < MAXV;i++) {
        cin>>stu[i];
      }
  }    
  while(m<t) {
      int a,b;    
      int e;
      e = (n[m]*(n[m]-1))/2;
      int diff[e];
      if (g[m]==1) {
        cout<<0<<endl;
        return 0;
      } 
      b=*(min_element(stu,stu+n[m]-1));
      a=*(max_element(stu,stu+n[m]-1));
      if (g[m]==n[m]) {
        cout<<a-b<<endl;
        return 0;
      }
      int z = 0;
      for(int j=0;j<(n[m]-1);j++) {
        for(int k=(j+1);k<n[m];k++) {
          diff[z]=abs(stu[j]-stu[k]);
          ++z;
        }
      }        
      cout<<*(min_element(diff,diff+e-1))<<endl;
      ++m;
  }    
  cin.ignore();
  cin.get();
  return 0;
}        

(当我想你的意思是==而不是时,我已经修复了几个条件赋值=,但我没有测试代码是否符合你的期望:它只是编译,使用 g++ 但可能不使用其他编译器,请参阅代码中的注释)

于 2013-05-20T06:47:42.473 回答