以未知大小数组存储数字(并计算一些值)

时间:2015-01-31 14:15:41

标签: c++ arrays cin

我正在编写一个程序来计算未知大小数组的某些值。 我成功地做了这个,所以用户可以输入5个数字来计算。 但我希望用户能够将它们作为一组数字输入到同一行,并以0结尾。我们不知道数组的大小。如果它变得太复杂,就可以添加100这样的大数字。

它应如下所示:

Enter a couple of numbers : 10 12 -5 20 -2 15 0
Sum = 50
Average value = 8.3
Largest number = 20
Second largest = 15

这是我目前的代码:

#include<iostream>
#include<conio.h>
using namespace std;

// Variables

int size = 5;            //Array size
int sum = 0;
int a[5];

// Functions
int highest();
int secondh();

int avg(int, int);

//Main
int
main()
{
  cout << "Enter 5 numbers to calculate..." << endl;
  int x;

  for (x = 0; x < 5; x++)
    {
      cout << "insert value #" << x + 1 << endl;
      cin >> a[x];
      sum = sum + a[x];
    }

  // sum
  cout << "The sum is: " << sum << endl;
  // avg
  cout << "Average number is: " << avg (sum, size) << endl;
  // max
  cout << "Max value is: " << highest () << endl;
  // second max
  cout << "Second largest value is: " << secondh () << endl;
  getch();
  return 0;
}

//AVG
int
avg (int sum, int size)
{
  return sum / size;
}

// HIGHEST
int
highest ()
{
  int max = a[0];
  int min = a[0];
  int e = 0;

  while (e < 5)
    {
      if (a[e] > max)
    {
      max = a[e];
    }

      e++;
    }

  return max;
}

// SECOND HIGHEST
int
secondh()
{
  int max = a[0];
  int smax = a[0];
  int e = 0;

  while (e < 5)
    {
      if (a[e] > max)
    {
      smax = max;
      max = a[e];
    }
      e++;
    }
  return smax;
}

这是Cin部分我有问题...... 不知道如何将一堆数字的用户输入提取到数组中。

for (x = 0; x < 5; x++)
{
    cout << "insert value #" << x + 1 << endl;
    cin >> a[x];
    sum = sum + a[x];
}

总结我的问题: 首先,如何将一行中的所有数字输入数组并以零结尾? 第二个如何使用未知大小的数组?(如果变得复杂,将使用大型数组(这是一个手动输入程序。)

谢谢!

3 个答案:

答案 0 :(得分:1)

请勿使用数组。

标准C ++容器,例如std::vectorstd::list,是这种情况下的方法。您可以在不指定容器大小的情况下将数据附加到它们 - 它会自动为您处理。

IF 需要使用数组......

这听起来像是一个不合理的作业(更适合C,而不是C ++)。无论如何,在这种情况下,您必须促进动态内存管理和C的功能,例如mallocreallocfree。简而言之:

  1. 使用N(或malloc)创建一个初始大小为calloc的数组。
  2. 当您要插入N-th号码时,请使用realloc来增加阵列的大小。正确使用realloc
  3. ,请阅读this
  4. 完成后,释放分配有free
  5. 的内存

    对此:如果变得复杂,将使用大型数组:不是一个好主意 - 您认为大小足够大? 100个元素? 1000,100000?你永远不会知道。它不是手动输入程序 - 它使用来自标准输入的数据,你可以重定向那里的任何东西(例如cat datafile | your_app)。

    此外,在计算总和时,您需要注意溢出/下溢。

答案 1 :(得分:1)

  

但我希望用户能够将它们作为一堆数字输入到同一行,并以0结尾

我们可以做到这一点。我们将一次输入一个(并检查以确保流不会在我们下方终止)并在我们得到零时中断:

std::vector<int> numbers;
for (int x; (cin >> x) && (x != 0); ) {
    numbers.push_back(x);
}
如果流结束或用户尝试输入像cin >> x这样的非整数,

Hello将失败。因此,只有在我们成功输入非零x时才会执行。

有了这个,你只需要改变你的功能就可以使用vector而不是硬编码5只需依靠size()方法。例如,highest变为:

int highest(const std::vector<int>& numbers)
{
    int largest = INT_MIN; // see <climits>

    for (size_t i = 0; i < numbers.size(); ++i) {
        if (numbers[i] > largest) largest = numbers[i];
    }
    return largest;
}

使用算法库,我们可以将其简化为不必要的简洁,但为了完整性:

int highest(const std::vector<int>& numbers) {
    return std::accumulate(numbers.begin(),
                           numbers.end(),
                           INT_MIN,
                           std::max<int>);
}

(请注意,对于C ++ 11,std::max<int>本身已重载,因此您需要将其强制转换为(const int& (*)(const int&, const int&)) ...)

答案 2 :(得分:0)

您根本不需要存储数字(尽管您也可以使用可扩展容器执行此操作),但仅记录到目前为止的总数和总数,以及最大,最小和第二个最大的...

例如,如果您只想要平均值,则可以

int main()
{
   std::cout<<" enter numbers, finishing with 0'<<std::endl;
   int c, num=0, sum=0;
   for(;;) {
     std::cin >> c;
     if(c==0) break;
     num++;
     sum+=c;
   }
   if(num)
     std::cout<<" average = " << double(sum)/double(num) << std::endl;
}

为自己解决如何做到最大,最小等... 如果你真的需要将数字保存在某个容器中,你可以

int main()
{
   std::cout << " enter numbers, finishing with 0' << std::endl;
   std::vector<int> numbers;
   for(;;) {
     int c;
     std::cin >> c;
     if(c==0) break;
     numbers.push_back(c);
   }
   if(numbers.size())
     std::cout << " average = "
               << std::accumulate(numbers.begin(),numbers.end(),0)/
                  double(numbers.size())
               << std::endl;
}