【问题标题】:In C++ how to put a variable inside an array?在 C++ 中,如何将变量放入数组中?
【发布时间】:2021-09-24 04:13:14
【问题描述】:
#include <iostream>
#include <cmath>
using namespace std;
bool narcissistic(int value)
{
    cout << "value is:" << value << endl;
    int digitNumber = (log10(value) + 1);
    cout << "Digit Number:" << digitNumber << endl;
    int sum = 0;
    int arr[5];
    for (int i = 0; i <= digitNumber - 1; i++)
    {
        cout << "i digit:" << i << endl;
        int exponential = pow(10, i);
        arr[i] = (value % (exponential *10)) / pow(10, i);
        cout << arr[i] << endl;
        sum += pow(arr[i], digitNumber);
        cout << pow(arr[i], digitNumber) << endl;
        cout << i << "'th sum value:" << sum << endl;

    }
    
    return true;

}

int main() {
    int value = 153;
    narcissistic(value);

    return 0;
}

在此代码中; 我不得不写:

int arr[5];

但我希望这个数组的大小是一个变量,以便可以定义它的大小,并且可以通过 for 循环放置它的值,因此它的大小可以等于循环的数量。 我想这样写:

for (int i = 0; i <= digitNumber - 1; i++)
    {
        int arr[i];
        cout << "i digit:" << i << endl;
        int exponential = pow(10, i);
        arr[i] = (value % (exponential *10)) / pow(10, i);
        cout << arr[i] << endl;
        sum += pow(arr[i], digitNumber);
        cout << pow(arr[i], digitNumber) << endl;
        cout << i << "'th sum value:" << sum << endl;

    }

Visual Studio 说数组作为长度的值必须是常数,这就是为什么你不能通过循环等来确定它。

有没有办法将变量作为大小放入数组中,并通过 C++ 中的循环分配数组的大小?

【问题讨论】:

  • 使用std::vector
  • int arr[i]; 将arr 定义为一个全新的变量,即variable-length array 其中aren't really a part of C++。对于具有非可移植和非标准扩展的编译器。它定义了一个包含i 元素的数组。所以第一次迭代你有一个零元素数组。当您使用i 作为索引时,它当然会越界。我猜您实际上并不想在循环内定义一个新变量arr?
  • 顺便说一句,你为什么需要arr 数组?您永远不会将数组作为一个整体使用。您可以将arr[i] 替换为temp,并在循环的开头声明int temp;。
  • 投资some good books 并上课。正确学习 C++ 和编程。
  • @PhysicsSolvesAll 与我在评论中所写的完全一样。但我想你想在循环终止后使用arr 数组。所以我之前的评论可能是毫无意义的。

标签: c++ arrays loops variables


【解决方案1】:

你可能想要这样的东西:

#include <iostream>
#include <cmath>
#include <vector>

using namespace std;

bool narcissistic(int value)
{
  cout << "value is:" << value << endl;
  int digitNumber = (log10(value) + 1);
  cout << "Digit Number:" << digitNumber << endl;
  int sum = 0;
  std::vector<int> arr(digitNumber);  // initialize a vector containing 
                                      // digitNumber elements

  for (int i = 0; i <= digitNumber - 1; i++)
  {
    cout << "i digit:" << i << endl;
    int exponential = pow(10, i);
    arr[i] = value % (exponential * 10) / pow(10, i);
    cout << arr[i] << endl;
    sum += pow(arr[i], digitNumber);
    cout << pow(arr[i], digitNumber) << endl;
    cout << i << "'th sum value:" << sum << endl;
  }

  // printf values in arr
  cout << "arr: ";
  for (auto& value : arr)
    cout << value << ", ";

  return true;
}

int main() {
  int value = 153;
  narcissistic(value);

  return 0;
}

但这是将数字分解为数字的一种相当复杂的方法。你根本不需要浮点运算来做到这一点:

#include <iostream>
#include <cmath>
#include <vector>

using namespace std;

bool narcissistic(int value)
{
  cout << "value is:" << value << endl;
  std::vector<int> arr;  // start off with an empty vector

  for (int i = 0; value != 0; i++)
  {
    arr.push_back(value % 10);  // add to the vector
    value /= 10;
  }

  // printf values in arr
  cout << "arr: ";
  for (auto& value : arr)
    cout << value << ", ";

  return true;
}

int main() {
  int value = 153;
  narcissistic(value);

  return 0;
}

【讨论】:

  • 你甚至不需要使用向量,而是使用另一个for(int i=0;i&lt;digitNumber;i++)循环
  • @DonLarry 怎么样??
  • 我会把它留在答案中,给我一秒钟
  • @DonLarry 他想将数字的所有数字存储在某个地方,所以你需要某种数组。
  • @PhysicsSolvesAll 您还可以构造一个空数组vector&lt;int&gt; arr; ,并在循环中使用arr.push_back(i); 向其中添加一个空元素,然后在同一循环中或在循环之外向该元素添加一个值环形。我写了一个这样的答案,但决定删除它,因为它与 Jabberwocky 的没有太大区别。
【解决方案2】:

如果你想避免使用vector,你可以使用这个:

#include <iostream>
#include <cmath>
#include <vector>

using namespace std;

bool narcissistic(int value)
{
  cout << "value is:" << value << endl;
  int digitNumber = (log10(value) + 1);
  cout << "Digit Number:" << digitNumber << endl;
  int sum = 0;
  
  vector<int> v(digitNumber);
  int *arr = &v[0];

  for (int i = 0; i <= digitNumber - 1; i++)
  {
    cout << "i digit:" << i << endl;
    int exponential = pow(10, i);
    arr[i] = value % (exponential * 10) / pow(10, i);
    cout << arr[i] << endl;
    sum += pow(arr[i], digitNumber);
    cout << pow(arr[i], digitNumber) << endl;
    cout << i << "'th sum value:" << sum << endl;
  }

  // print values in arr
  cout << "arr: ";
  for (int i = 0; i <= digitNumber - 1; i++)
    cout << arr[i] << ", ";

  return true;
}

int main() {
  int value = 153;
  narcissistic(value);

  return 0;
}

【讨论】:

  • 我真的很想改进代码风格,但为了您的理解,我确实让它尽可能接近您的代码。
  • Visual Studio 为您的解决方案提供了与我的解决方案相同的错误。 “表达式必须具有恒定值。” @唐拉里
  • int arr[digitNumber]; 不是标准 C++。
  • @JabberWocky 他的这个解决方案在 Visual Studio 中给出了红色曲线。
  • 当您已经可以使用这样的向量时,拥有int* arr = &amp;v[0]; 有什么意义?与其他答案相比,它只是增加了一行代码
猜你喜欢
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 2017-10-09
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多