我正在编写一个程序来计算未知大小数组的某些值。 我成功地做了这个,所以用户可以输入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];
}
总结我的问题: 首先,如何将一行中的所有数字输入数组并以零结尾? 第二个如何使用未知大小的数组?(如果变得复杂,将使用大型数组(这是一个手动输入程序。)
谢谢!
答案 0 :(得分:1)
请勿使用数组。
标准C ++容器,例如std::vector
或std::list
,是这种情况下的方法。您可以在不指定容器大小的情况下将数据附加到它们 - 它会自动为您处理。
IF 你做需要使用数组......
这听起来像是一个不合理的作业(更适合C,而不是C ++)。无论如何,在这种情况下,您必须促进动态内存管理和C的功能,例如malloc
,realloc
和free
。简而言之:
N
(或malloc
)创建一个初始大小为calloc
的数组。N-th
号码时,请使用realloc
来增加阵列的大小。正确使用realloc
。free
。对此:如果变得复杂,将使用大型数组:不是一个好主意 - 您认为大小足够大? 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;
}