C++ 在大小未知的数组中存储数字(并计算一些值)
我正在写一个程序来计算未知大小数组的一些值。 我成功地做到了这一点,用户可以输入5个数字进行计算。 但我希望用户能够在同一行中输入一组数字,并以0结尾。我们不知道数组的大小。如果太复杂的话,可能会添加一个像100这样的大数字 它应该如下所示: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 这是我目前的代码:
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,“如何在线将所有数字输入数组并以零结尾。"@h7rstd::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>);
}