C++ 在大小未知的数组中存储数字(并计算一些值)

C++ 在大小未知的数组中存储数字(并计算一些值),c++,arrays,cin,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 这是我目前的代码:

我正在写一个程序来计算未知大小数组的一些值。 我成功地做到了这一点,用户可以输入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;
}
#包括
#包括
使用名称空间std;
//变数
int size=5//数组大小
整数和=0;
int a[5];
//功能
int最高();
int secondh();
平均整数(整数,整数);
//主要
int
main()
{

cout您根本不需要存储数字(尽管您也可以使用可扩展的容器来存储),但只需跟踪到目前为止的总数和总和,以及最大、最小和第二大等

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

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;
}
intmain()
{

std::cout不要为此使用数组。

标准C++容器,如<代码> STD::vector < /COD>或 STD::清单,在这种情况下,可以这样做。您可以在不指定容器大小的情况下将数据附加到它们中,它会自动为您处理。 如果您确实需要使用数组…

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

  • 使用
    malloc
    (或
    calloc
    )创建初始大小为
    N
    的数组
  • 当您要插入第N个
  • 编号时,请使用
    realloc
    增加数组的大小。请阅读正确使用
    realloc
  • 完成后,释放用
    free
    分配的内存
  • 关于这一点:如果变得复杂,将使用大尺寸数组:这不是一个好主意-你认为什么尺寸足够大?100个元素?1000,100000?你永远不会知道。它不是手动输入程序-它使用标准输入的数据,你可以在那里重定向几乎任何东西(例如
    cat数据文件|你的|应用程序

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

    但我希望用户能够在同一行中输入一组数字,并以0结尾

    我们可以这样做。我们将一次输入一个(并检查以确保流没有在我们下面终止),如果得到零,则中断:

    std::vector<int> numbers;
    for (int x; (cin >> x) && (x != 0); ) {
        numbers.push_back(x);
    }
    
    使用算法库,我们可以将其简化为不必要的简洁,但为了完整性:

    int highest(const std::vector<int>& numbers) {
        return std::accumulate(numbers.begin(),
                               numbers.end(),
                               INT_MIN,
                               std::max<int>);
    }
    
    int最高(常量标准::向量和数字){
    return std::accumulate(number.begin(),
    number.end(),
    国际民,
    标准:最大值);
    }
    

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

    是否允许您使用
    std::vector
    ?问题是什么?您的方向似乎正确。您需要分配一个足够大的数组来填充数据,可能在需要时调整其大小。关于如何解析输入,如他所述,请查看
    strtok
    @Walter,“如何在线将所有数字输入数组并以零结尾。"@h7r
    std::cin
    操作符>
    在空白字符上标记,因此这里似乎不需要使用
    strtok
    。对吗?好的,将使用vector。谢谢!谢谢,这正是我们要找的!cin工作得很好,但在将向量传递给最高函数时出现了一些问题。我收到了以下错误:<代码>编译…red4.cpp链接…red4.obj:错误LNK2001:未解析的外部符号“int\uu cdecl highest(void)”(?highest@@YAHXZ)Debug/redo4.exe:致命错误LNK1120:1执行link.exe时出现未解决的外部错误。
    我是否缺少任何头文件?
    #包含#包含#使用命名空间std;
    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>);
    }